From 91c42e137d63fe68d64361f5e1f74ccab43a06c3 Mon Sep 17 00:00:00 2001 From: epi Date: Wed, 9 Dec 2020 19:43:46 -0600 Subject: [PATCH] poc for max time works --- src/main.rs | 6 +++ src/scan_manager.rs | 94 +++++++++++++++++++++++++-------------------- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index cf9b1ff..8f002c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -220,6 +220,12 @@ async fn wrapped_main() { PROGRESS_BAR.join().unwrap(); }); + // if CONFIG...max time todo + tokio::spawn(async move { + // todo remove hard code seconds + scan_manager::start_max_time_thread(4).await; + }); + // can't trace main until after logger is initialized and the above task is started log::trace!("enter: main"); diff --git a/src/scan_manager.rs b/src/scan_manager.rs index d7059f3..27f8182 100644 --- a/src/scan_manager.rs +++ b/src/scan_manager.rs @@ -16,6 +16,7 @@ use serde::{ }; use serde_json::Value; use std::collections::HashMap; +use std::process::exit; use std::{ cmp::PartialEq, fmt, @@ -589,51 +590,62 @@ impl FeroxSerialize for FeroxState { } } +/// todo doc +pub async fn start_max_time_thread(seconds: u64) { + // todo trace + time::delay_for(time::Duration::new(seconds, 0)).await; + kill_self(); +} + +/// todo doc +fn kill_self() { + // todo trace + let ts = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs(); + + let slug = if !CONFIGURATION.target_url.is_empty() { + // target url populated + CONFIGURATION + .target_url + .replace("://", "_") + .replace("/", "_") + .replace(".", "_") + } else { + // stdin used + "stdin".to_string() + }; + + let filename = format!("ferox-{}-{}.state", slug, ts); + let warning = format!( + "🚨 Caught {} 🚨 saving scan state to {} ...", + style("ctrl+c").yellow(), + filename + ); + + PROGRESS_PRINTER.println(warning); + + let state = FeroxState { + config: &CONFIGURATION, + scans: &SCANNED_URLS, + responses: &RESPONSES, + }; + + let state_file = open_file(&filename); + + if let Some(buffered_file) = state_file { + safe_file_write(&state, buffered_file, true); + } + + std::process::exit(1); +} + /// Initialize the ctrl+c handler that saves scan state to disk pub fn initialize() { log::trace!("enter: initialize"); - let result = ctrlc::set_handler(move || { - let ts = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs(); - - let slug = if !CONFIGURATION.target_url.is_empty() { - // target url populated - CONFIGURATION - .target_url - .replace("://", "_") - .replace("/", "_") - .replace(".", "_") - } else { - // stdin used - "stdin".to_string() - }; - - let filename = format!("ferox-{}-{}.state", slug, ts); - let warning = format!( - "🚨 Caught {} 🚨 saving scan state to {} ...", - style("ctrl+c").yellow(), - filename - ); - - PROGRESS_PRINTER.println(warning); - - let state = FeroxState { - config: &CONFIGURATION, - scans: &SCANNED_URLS, - responses: &RESPONSES, - }; - - let state_file = open_file(&filename); - - if let Some(buffered_file) = state_file { - safe_file_write(&state, buffered_file, true); - } - - std::process::exit(1); - }); + let result = ctrlc::set_handler(kill_self); if result.is_err() { log::error!("Could not set Ctrl+c handler");