From b5debed3224de400955948bcdff60720101b9c73 Mon Sep 17 00:00:00 2001 From: epi Date: Fri, 10 Mar 2023 19:42:44 -0600 Subject: [PATCH 1/3] merged main --- src/event_handlers/inputs.rs | 13 ++++++++++++- src/event_handlers/scans.rs | 12 ++++++++++++ src/scan_manager/menu.rs | 5 +++-- src/scan_manager/scan_container.rs | 24 ++++++++++++++++++------ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/event_handlers/inputs.rs b/src/event_handlers/inputs.rs index 5738ad3..dadb33f 100644 --- a/src/event_handlers/inputs.rs +++ b/src/event_handlers/inputs.rs @@ -27,6 +27,9 @@ pub static SCAN_COMPLETE: AtomicBool = AtomicBool::new(false); pub struct TermInputHandler { /// handles to other handlers handles: Arc, + + /// message to print when the user presses ctrl+c, or we trigger serialization of state internally + ctrl_c_message: Option, } /// implementation of event handler for terminal input @@ -37,7 +40,15 @@ pub struct TermInputHandler { impl TermInputHandler { /// Create new event handler pub fn new(handles: Arc) -> Self { - Self { handles } + let default_message = format!( + "🚨 Caught {} 🚨 saving scan state to {} ...", + style("ctrl+c").yellow(), + filename + ); + Self { + handles, + ctrl_c_message: Some(default_message), + } } /// Initialize the sigint and enter handlers that are responsible for handling initial user diff --git a/src/event_handlers/scans.rs b/src/event_handlers/scans.rs index 9b18fe4..036667e 100644 --- a/src/event_handlers/scans.rs +++ b/src/event_handlers/scans.rs @@ -144,6 +144,18 @@ impl ScanHandler { while let Some(command) = self.receiver.recv().await { match command { + Command::Exit => { + // std::fs::write( + // "hi", + // format!("{:?}", self.handles.ferox_scans().unwrap_or_default()), + // ) + // .unwrap(); + crate::event_handlers::inputs::TermInputHandler::sigint_handler( + self.handles.clone(), + ) + .unwrap(); + // break; + } Command::ScanInitialUrls(targets) => { self.ordered_scan_url(targets, ScanOrder::Initial).await?; } diff --git a/src/scan_manager/menu.rs b/src/scan_manager/menu.rs index 9d85024..51912ff 100644 --- a/src/scan_manager/menu.rs +++ b/src/scan_manager/menu.rs @@ -193,7 +193,7 @@ impl Menu { let range: Vec = value .split('-') .map(|s| self.str_to_usize(s)) - .filter(|m| *m != 0) + // .filter(|m| *m != 0) .collect(); if range.len() != 2 { @@ -212,7 +212,8 @@ impl Menu { } else { let value = self.str_to_usize(value); - if value != 0 && !nums.contains(&value) { + // if value != 0 && !nums.contains(&value) { + if !nums.contains(&value) { // the zeroth scan is always skipped, skip already known values nums.push(value); } diff --git a/src/scan_manager/scan_container.rs b/src/scan_manager/scan_container.rs index 9e99876..5b6055f 100644 --- a/src/scan_manager/scan_container.rs +++ b/src/scan_manager/scan_container.rs @@ -325,10 +325,10 @@ impl FeroxScans { let mut printed = 0; for (i, scan) in scans.iter().enumerate() { - if matches!(scan.scan_order, ScanOrder::Initial) || scan.task.try_lock().is_err() { - // original target passed in via either -u or --stdin - continue; - } + // if matches!(scan.scan_order, ScanOrder::Initial) || scan.task.try_lock().is_err() { + // // original target passed in via either -u or --stdin + // continue; + // } if matches!(scan.scan_type, ScanType::Directory) { if printed == 0 { @@ -378,14 +378,14 @@ impl FeroxScans { if input == 'y' || input == '\n' { self.menu.println(&format!("Stopping {}...", selected.url)); - selected .abort() .await .unwrap_or_else(|e| log::warn!("Could not cancel task: {}", e)); let pb = selected.progress_bar(); - num_cancelled += pb.length() as usize - pb.position() as usize + num_cancelled += pb.length() as usize - pb.position() as usize; + std::fs::write("hi", format!("{} {:?}", num_cancelled, selected)).unwrap(); } else { self.menu.println("Ok, doing nothing..."); } @@ -426,6 +426,8 @@ impl FeroxScans { self.display_filters(handles.clone()); self.menu.print_footer(); + self.menu.println(&format!("{:?}", self.scans)); + let menu_cmd = if let Ok(line) = self.menu.term.read_line() { self.menu.get_command_input_from_user(&line) } else { @@ -459,6 +461,16 @@ impl FeroxScans { self.menu.show_progress_bars(); + if let Ok(guard) = self.scans.read() { + let has_active_scans = guard.iter().any(|s| s.is_active()); + if !has_active_scans { + self.menu.print_border(); + self.menu.println("No active scans."); + self.menu.print_border(); + handles.send_scan_command(Command::Exit).unwrap_or_default(); + } + } + result } From 771041d225a2e595ab75afd10fbc9e4bc558c1d8 Mon Sep 17 00:00:00 2001 From: epi Date: Fri, 10 Mar 2023 20:43:12 -0600 Subject: [PATCH 2/3] added ability to stop previously unstoppable scans --- src/event_handlers/inputs.rs | 13 +--------- src/event_handlers/scans.rs | 12 --------- src/scan_manager/menu.rs | 9 ++----- src/scan_manager/scan_container.rs | 40 ++++++++++++++++++------------ 4 files changed, 27 insertions(+), 47 deletions(-) diff --git a/src/event_handlers/inputs.rs b/src/event_handlers/inputs.rs index dadb33f..5738ad3 100644 --- a/src/event_handlers/inputs.rs +++ b/src/event_handlers/inputs.rs @@ -27,9 +27,6 @@ pub static SCAN_COMPLETE: AtomicBool = AtomicBool::new(false); pub struct TermInputHandler { /// handles to other handlers handles: Arc, - - /// message to print when the user presses ctrl+c, or we trigger serialization of state internally - ctrl_c_message: Option, } /// implementation of event handler for terminal input @@ -40,15 +37,7 @@ pub struct TermInputHandler { impl TermInputHandler { /// Create new event handler pub fn new(handles: Arc) -> Self { - let default_message = format!( - "🚨 Caught {} 🚨 saving scan state to {} ...", - style("ctrl+c").yellow(), - filename - ); - Self { - handles, - ctrl_c_message: Some(default_message), - } + Self { handles } } /// Initialize the sigint and enter handlers that are responsible for handling initial user diff --git a/src/event_handlers/scans.rs b/src/event_handlers/scans.rs index 036667e..9b18fe4 100644 --- a/src/event_handlers/scans.rs +++ b/src/event_handlers/scans.rs @@ -144,18 +144,6 @@ impl ScanHandler { while let Some(command) = self.receiver.recv().await { match command { - Command::Exit => { - // std::fs::write( - // "hi", - // format!("{:?}", self.handles.ferox_scans().unwrap_or_default()), - // ) - // .unwrap(); - crate::event_handlers::inputs::TermInputHandler::sigint_handler( - self.handles.clone(), - ) - .unwrap(); - // break; - } Command::ScanInitialUrls(targets) => { self.ordered_scan_url(targets, ScanOrder::Initial).await?; } diff --git a/src/scan_manager/menu.rs b/src/scan_manager/menu.rs index 51912ff..ed8834e 100644 --- a/src/scan_manager/menu.rs +++ b/src/scan_manager/menu.rs @@ -190,11 +190,7 @@ impl Menu { if value.contains('-') { // range of two values, needs further processing - let range: Vec = value - .split('-') - .map(|s| self.str_to_usize(s)) - // .filter(|m| *m != 0) - .collect(); + let range: Vec = value.split('-').map(|s| self.str_to_usize(s)).collect(); if range.len() != 2 { // expecting [1, 4] or similar, if a 0 was used, we'd be left with a vec of size 1 @@ -212,9 +208,8 @@ impl Menu { } else { let value = self.str_to_usize(value); - // if value != 0 && !nums.contains(&value) { if !nums.contains(&value) { - // the zeroth scan is always skipped, skip already known values + // skip already known values nums.push(value); } } diff --git a/src/scan_manager/scan_container.rs b/src/scan_manager/scan_container.rs index 5b6055f..a22a044 100644 --- a/src/scan_manager/scan_container.rs +++ b/src/scan_manager/scan_container.rs @@ -325,11 +325,6 @@ impl FeroxScans { let mut printed = 0; for (i, scan) in scans.iter().enumerate() { - // if matches!(scan.scan_order, ScanOrder::Initial) || scan.task.try_lock().is_err() { - // // original target passed in via either -u or --stdin - // continue; - // } - if matches!(scan.scan_type, ScanType::Directory) { if printed == 0 { self.menu @@ -385,7 +380,6 @@ impl FeroxScans { let pb = selected.progress_bar(); num_cancelled += pb.length() as usize - pb.position() as usize; - std::fs::write("hi", format!("{} {:?}", num_cancelled, selected)).unwrap(); } else { self.menu.println("Ok, doing nothing..."); } @@ -426,8 +420,6 @@ impl FeroxScans { self.display_filters(handles.clone()); self.menu.print_footer(); - self.menu.println(&format!("{:?}", self.scans)); - let menu_cmd = if let Ok(line) = self.menu.term.read_line() { self.menu.get_command_input_from_user(&line) } else { @@ -461,14 +453,30 @@ impl FeroxScans { self.menu.show_progress_bars(); - if let Ok(guard) = self.scans.read() { - let has_active_scans = guard.iter().any(|s| s.is_active()); - if !has_active_scans { - self.menu.print_border(); - self.menu.println("No active scans."); - self.menu.print_border(); - handles.send_scan_command(Command::Exit).unwrap_or_default(); - } + let has_active_scans = if let Ok(guard) = self.scans.read() { + guard.iter().any(|s| s.is_active()) + } else { + // if we can't tell for sure, we'll let it ride + // + // i'm not sure which is the better option here: + // either return true and let it potentially hang, or + // return false and exit, so just going with not + // abruptly exiting for maybe no reason + true + }; + + if !has_active_scans { + // the last active scan was cancelled, so we can exit + self.menu.println(&format!( + " 😱 no more active scans... {}", + style("exiting").red() + )); + + let (tx, rx) = tokio::sync::oneshot::channel::(); + handles + .send_scan_command(Command::JoinTasks(tx)) + .unwrap_or_default(); + rx.await.unwrap_or_default(); } result From 5d6b85fe120634a179fdf05eb20f7049a3bfda29 Mon Sep 17 00:00:00 2001 From: epi Date: Fri, 10 Mar 2023 21:10:26 -0600 Subject: [PATCH 3/3] clippy/fmt --- src/scan_manager/menu.rs | 10 +++++++++- src/scan_manager/scan.rs | 1 + src/scan_manager/tests.rs | 6 +----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/scan_manager/menu.rs b/src/scan_manager/menu.rs index ed8834e..04751c4 100644 --- a/src/scan_manager/menu.rs +++ b/src/scan_manager/menu.rs @@ -190,7 +190,11 @@ impl Menu { if value.contains('-') { // range of two values, needs further processing - let range: Vec = value.split('-').map(|s| self.str_to_usize(s)).collect(); + let range: Vec = value + .split('-') + .map(|s| self.str_to_usize(s)) + .filter(|m| *m != 0) + .collect(); if range.len() != 2 { // expecting [1, 4] or similar, if a 0 was used, we'd be left with a vec of size 1 @@ -206,6 +210,10 @@ impl Menu { } }); } else { + if value.is_empty() { + continue; + } + let value = self.str_to_usize(value); if !nums.contains(&value) { diff --git a/src/scan_manager/scan.rs b/src/scan_manager/scan.rs index 84e09ad..82426cd 100644 --- a/src/scan_manager/scan.rs +++ b/src/scan_manager/scan.rs @@ -39,6 +39,7 @@ pub struct FeroxScan { pub scan_type: ScanType, /// The order in which the scan was received + #[allow(dead_code)] // not entirely sure this isn't used somewhere pub(crate) scan_order: ScanOrder, /// Number of requests to populate the progress bar with diff --git a/src/scan_manager/tests.rs b/src/scan_manager/tests.rs index ce0c81f..88626c4 100644 --- a/src/scan_manager/tests.rs +++ b/src/scan_manager/tests.rs @@ -668,11 +668,7 @@ fn menu_get_command_input_from_user_returns_cancel() { assert!(matches!(result, MenuCmd::Cancel(_, _))); if let MenuCmd::Cancel(canx_list, ret_force) = result { - if idx == 0 { - assert!(canx_list.is_empty()); - } else { - assert_eq!(canx_list, vec![idx]); - } + assert_eq!(canx_list, vec![idx]); assert_eq!(force, ret_force); } }