mirror of
https://github.com/nimbold/Firelink.git
synced 2026-08-24 17:56:28 +00:00
fix(backend): resolve clippy warnings breaking CI pipeline
This commit is contained in:
@@ -23,7 +23,7 @@ const WRITE_BUFFER_CAPACITY: usize = 256 * 1024;
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum DownloadCmd {
|
pub enum DownloadCmd {
|
||||||
Start(DownloadPayload),
|
Start(Box<DownloadPayload>),
|
||||||
Pause(Uuid),
|
Pause(Uuid),
|
||||||
Cancel(Uuid),
|
Cancel(Uuid),
|
||||||
CaptureUrls(Vec<String>),
|
CaptureUrls(Vec<String>),
|
||||||
@@ -255,7 +255,8 @@ async fn run_coordinator(
|
|||||||
};
|
};
|
||||||
|
|
||||||
match command {
|
match command {
|
||||||
DownloadCmd::Start(payload) => {
|
DownloadCmd::Start(payload_box) => {
|
||||||
|
let payload = *payload_box;
|
||||||
if let Some(previous) = active.remove(&payload.id) {
|
if let Some(previous) = active.remove(&payload.id) {
|
||||||
let _ = previous.control_tx.send(DownloadControl::Replace).await;
|
let _ = previous.control_tx.send(DownloadControl::Replace).await;
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-18
@@ -48,20 +48,17 @@ async fn fetch_metadata(url: String, user_agent: Option<String>, username: Optio
|
|||||||
if let Some(host) = parsed.host_str() {
|
if let Some(host) = parsed.host_str() {
|
||||||
let port = parsed.port_or_known_default().unwrap_or(80);
|
let port = parsed.port_or_known_default().unwrap_or(80);
|
||||||
if let Ok(addrs) = std::net::ToSocketAddrs::to_socket_addrs(&(host, port)) {
|
if let Ok(addrs) = std::net::ToSocketAddrs::to_socket_addrs(&(host, port)) {
|
||||||
for addr in addrs {
|
if let Some(addr) = addrs.into_iter().next() {
|
||||||
let ip = addr.ip();
|
let ip = addr.ip();
|
||||||
if ip.is_loopback() || ip.is_multicast() || ip.is_unspecified() {
|
if ip.is_loopback() || ip.is_multicast() || ip.is_unspecified() {
|
||||||
return Err("SSRF blocked: Private/local IP not allowed".to_string());
|
return Err("SSRF blocked: Private/local IP not allowed".to_string());
|
||||||
}
|
}
|
||||||
match ip {
|
if let std::net::IpAddr::V4(ipv4) = ip {
|
||||||
std::net::IpAddr::V4(ipv4) if ipv4.is_private() || ipv4.is_link_local() => {
|
if ipv4.is_private() || ipv4.is_link_local() {
|
||||||
return Err("SSRF blocked: Private/local IP not allowed".to_string());
|
return Err("SSRF blocked: Private/local IP not allowed".to_string());
|
||||||
}
|
}
|
||||||
_ => {
|
|
||||||
resolved_addr = Some((host.to_string(), addr));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
resolved_addr = Some((host.to_string(), addr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,8 +124,8 @@ async fn fetch_metadata(url: String, user_agent: Option<String>, username: Optio
|
|||||||
|
|
||||||
if filename.is_empty() {
|
if filename.is_empty() {
|
||||||
if let Ok(parsed) = reqwest::Url::parse(¤t_url) {
|
if let Ok(parsed) = reqwest::Url::parse(¤t_url) {
|
||||||
if let Some(segments) = parsed.path_segments() {
|
if let Some(mut segments) = parsed.path_segments() {
|
||||||
if let Some(last) = segments.last() {
|
if let Some(last) = segments.next_back() {
|
||||||
let normalized = last.replace('\\', "/");
|
let normalized = last.replace('\\', "/");
|
||||||
filename = std::path::Path::new(&normalized)
|
filename = std::path::Path::new(&normalized)
|
||||||
.file_name()
|
.file_name()
|
||||||
@@ -390,10 +387,9 @@ pub use error::AppError;
|
|||||||
|
|
||||||
// Retained only for compatibility with the optional aria2 diagnostic monitor.
|
// Retained only for compatibility with the optional aria2 diagnostic monitor.
|
||||||
// Active downloads are owned by DownloadCoordinator.
|
// Active downloads are owned by DownloadCoordinator.
|
||||||
|
#[non_exhaustive]
|
||||||
pub enum TaskHandle {
|
pub enum TaskHandle {
|
||||||
Aria2(String),
|
Aria2(String),
|
||||||
#[doc(hidden)]
|
|
||||||
Inactive,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
@@ -421,9 +417,9 @@ pub struct DownloadProgressEvent {
|
|||||||
fn resolve_path(path: &str, app_handle: &tauri::AppHandle) -> std::path::PathBuf {
|
fn resolve_path(path: &str, app_handle: &tauri::AppHandle) -> std::path::PathBuf {
|
||||||
use tauri::Manager;
|
use tauri::Manager;
|
||||||
let mut resolved = std::path::PathBuf::from(path);
|
let mut resolved = std::path::PathBuf::from(path);
|
||||||
if path.starts_with("~/") {
|
if let Some(stripped) = path.strip_prefix("~/") {
|
||||||
if let Ok(home) = app_handle.path().home_dir() {
|
if let Ok(home) = app_handle.path().home_dir() {
|
||||||
resolved = home.join(&path[2..]);
|
resolved = home.join(stripped);
|
||||||
}
|
}
|
||||||
} else if path == "~" {
|
} else if path == "~" {
|
||||||
if let Ok(home) = app_handle.path().home_dir() {
|
if let Ok(home) = app_handle.path().home_dir() {
|
||||||
@@ -559,6 +555,7 @@ async fn test_aria2c(state: tauri::State<'_, AppState>) -> Result<String, String
|
|||||||
.ok_or_else(|| "aria2 returned an invalid version response".to_string())
|
.ok_or_else(|| "aria2 returned an invalid version response".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
async fn start_download(
|
async fn start_download(
|
||||||
app_handle: tauri::AppHandle,
|
app_handle: tauri::AppHandle,
|
||||||
@@ -646,13 +643,13 @@ async fn start_download(
|
|||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
let gid = result.as_str().unwrap_or("").to_string();
|
let gid = result.as_str().unwrap_or("").to_string();
|
||||||
state.aria2_gids.write().unwrap().insert(id.clone(), gid);
|
state.aria2_gids.write().unwrap().insert(id.clone(), gid);
|
||||||
return Ok(());
|
Ok(())
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("aria2 failed, falling back to native coordinator: {}", e);
|
eprintln!("aria2 failed, falling back to native coordinator: {}", e);
|
||||||
state
|
state
|
||||||
.download_coordinator
|
.download_coordinator
|
||||||
.send(download::DownloadCmd::Start(download::DownloadPayload {
|
.send(download::DownloadCmd::Start(Box::new(download::DownloadPayload {
|
||||||
id: download_id,
|
id: download_id,
|
||||||
urls: collect_download_uris(&url, mirrors.as_deref()),
|
urls: collect_download_uris(&url, mirrors.as_deref()),
|
||||||
output_path: resolved_dest.join(safe_filename),
|
output_path: resolved_dest.join(safe_filename),
|
||||||
@@ -664,14 +661,15 @@ async fn start_download(
|
|||||||
user_agent,
|
user_agent,
|
||||||
max_tries: mt,
|
max_tries: mt,
|
||||||
proxy,
|
proxy,
|
||||||
}))
|
})))
|
||||||
.await
|
.await
|
||||||
.map_err(AppError::Internal)?;
|
.map_err(AppError::Internal)?;
|
||||||
return Ok(());
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
async fn start_media_download(
|
async fn start_media_download(
|
||||||
app_handle: tauri::AppHandle,
|
app_handle: tauri::AppHandle,
|
||||||
@@ -730,6 +728,7 @@ async fn start_media_download(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub(crate) async fn start_media_download_internal(
|
pub(crate) async fn start_media_download_internal(
|
||||||
app_handle: tauri::AppHandle,
|
app_handle: tauri::AppHandle,
|
||||||
id: &str,
|
id: &str,
|
||||||
@@ -1120,7 +1119,7 @@ fn open_automation_settings(app_handle: tauri::AppHandle) -> Result<(), String>
|
|||||||
use tauri_plugin_opener::OpenerExt;
|
use tauri_plugin_opener::OpenerExt;
|
||||||
app_handle.opener().open_url("x-apple.systempreferences:com.apple.preference.security?Privacy_Automation", None::<String>)
|
app_handle.opener().open_url("x-apple.systempreferences:com.apple.preference.security?Privacy_Automation", None::<String>)
|
||||||
.map_err(|e| format!("Failed to open Automation settings: {}", e))?;
|
.map_err(|e| format!("Failed to open Automation settings: {}", e))?;
|
||||||
return Ok(());
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ pub async fn check_for_updates(app_handle: tauri::AppHandle) -> Result<ReleaseCh
|
|||||||
None => return Err("No stable release was found.".to_string()),
|
None => return Err("No stable release was found.".to_string()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let latest_version = release.tag_name.trim_start_matches(|c| c == 'v' || c == 'V').to_string();
|
let latest_version = release.tag_name.trim_start_matches(['v', 'V']).to_string();
|
||||||
|
|
||||||
if cmp_versions(&latest_version, ¤t_version) == std::cmp::Ordering::Greater {
|
if cmp_versions(&latest_version, ¤t_version) == std::cmp::Ordering::Greater {
|
||||||
Ok(ReleaseCheckOutcome::UpdateAvailable {
|
Ok(ReleaseCheckOutcome::UpdateAvailable {
|
||||||
@@ -131,8 +131,8 @@ pub async fn check_for_updates(app_handle: tauri::AppHandle) -> Result<ReleaseCh
|
|||||||
fn cmp_versions(a: &str, b: &str) -> std::cmp::Ordering {
|
fn cmp_versions(a: &str, b: &str) -> std::cmp::Ordering {
|
||||||
use semver::Version;
|
use semver::Version;
|
||||||
|
|
||||||
let a_clean = a.trim_start_matches(|c| c == 'v' || c == 'V');
|
let a_clean = a.trim_start_matches(['v', 'V']);
|
||||||
let b_clean = b.trim_start_matches(|c| c == 'v' || c == 'V');
|
let b_clean = b.trim_start_matches(['v', 'V']);
|
||||||
|
|
||||||
let a_ver = Version::parse(a_clean).unwrap_or_else(|_| Version::new(0, 0, 0));
|
let a_ver = Version::parse(a_clean).unwrap_or_else(|_| Version::new(0, 0, 0));
|
||||||
let b_ver = Version::parse(b_clean).unwrap_or_else(|_| Version::new(0, 0, 0));
|
let b_ver = Version::parse(b_clean).unwrap_or_else(|_| Version::new(0, 0, 0));
|
||||||
@@ -145,9 +145,9 @@ pub async fn create_category_directories(app_handle: tauri::AppHandle, paths: Ve
|
|||||||
use tauri::Manager;
|
use tauri::Manager;
|
||||||
for path in paths {
|
for path in paths {
|
||||||
let mut expanded = std::path::PathBuf::from(&path);
|
let mut expanded = std::path::PathBuf::from(&path);
|
||||||
if path.starts_with("~/") {
|
if let Some(stripped) = path.strip_prefix("~/") {
|
||||||
if let Ok(home) = app_handle.path().home_dir() {
|
if let Ok(home) = app_handle.path().home_dir() {
|
||||||
expanded = home.join(&path[2..]);
|
expanded = home.join(stripped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !expanded.exists() {
|
if !expanded.exists() {
|
||||||
|
|||||||
@@ -284,7 +284,7 @@ async fn pause_then_resume_uses_range_and_preserves_integrity() {
|
|||||||
let (coordinator, mut events) = DownloadCoordinator::spawn_headless();
|
let (coordinator, mut events) = DownloadCoordinator::spawn_headless();
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(download))
|
.send(DownloadCmd::Start(Box::new(download)))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
wait_for_progress(&mut events, id, 256 * 1024).await;
|
wait_for_progress(&mut events, id, 256 * 1024).await;
|
||||||
@@ -296,11 +296,11 @@ async fn pause_then_resume_uses_range_and_preserves_integrity() {
|
|||||||
assert!(paused_len < expected.len() as u64);
|
assert!(paused_len < expected.len() as u64);
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(payload(
|
.send(DownloadCmd::Start(Box::new(payload(
|
||||||
id,
|
id,
|
||||||
server.file_url(),
|
server.file_url(),
|
||||||
output_path.clone(),
|
output_path.clone(),
|
||||||
)))
|
))))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
wait_for_completion(&mut events, id).await;
|
wait_for_completion(&mut events, id).await;
|
||||||
@@ -331,11 +331,11 @@ async fn aggregates_many_http_chunks_with_complete_progress() {
|
|||||||
let started = Instant::now();
|
let started = Instant::now();
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(payload(
|
.send(DownloadCmd::Start(Box::new(payload(
|
||||||
id,
|
id,
|
||||||
server.file_url(),
|
server.file_url(),
|
||||||
output_path.clone(),
|
output_path.clone(),
|
||||||
)))
|
))))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let observed = wait_for_completion(&mut events, id).await;
|
let observed = wait_for_completion(&mut events, id).await;
|
||||||
@@ -376,7 +376,7 @@ async fn retries_transient_http_failures_then_completes() {
|
|||||||
download.max_tries = 3;
|
download.max_tries = 3;
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(download))
|
.send(DownloadCmd::Start(Box::new(download)))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
wait_for_completion(&mut events, id).await;
|
wait_for_completion(&mut events, id).await;
|
||||||
@@ -399,7 +399,7 @@ async fn reports_terminal_http_errors_after_retry_budget() {
|
|||||||
download.max_tries = 2;
|
download.max_tries = 2;
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(download))
|
.send(DownloadCmd::Start(Box::new(download)))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let error = loop {
|
let error = loop {
|
||||||
@@ -430,11 +430,11 @@ async fn cancel_removes_partial_file_without_terminal_success_event() {
|
|||||||
let (coordinator, mut events) = DownloadCoordinator::spawn_headless();
|
let (coordinator, mut events) = DownloadCoordinator::spawn_headless();
|
||||||
|
|
||||||
coordinator
|
coordinator
|
||||||
.send(DownloadCmd::Start(payload(
|
.send(DownloadCmd::Start(Box::new(payload(
|
||||||
id,
|
id,
|
||||||
server.file_url(),
|
server.file_url(),
|
||||||
output_path.clone(),
|
output_path.clone(),
|
||||||
)))
|
))))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
wait_for_progress(&mut events, id, 256 * 1024).await;
|
wait_for_progress(&mut events, id, 256 * 1024).await;
|
||||||
|
|||||||
Reference in New Issue
Block a user