From 0730c16de1be6db590f18fdb02c6f0d86111a3b5 Mon Sep 17 00:00:00 2001 From: Alex Roan Date: Mon, 18 Mar 2024 19:35:05 +0000 Subject: [PATCH] Output: stdout (#232) --- aderyn/src/main.rs | 6 ++++ aderyn_core/src/lib.rs | 40 ++++++++++++++------- aderyn_core/src/report/json_printer.rs | 9 ++++- aderyn_core/src/report/markdown_printer.rs | 1 + aderyn_core/src/report/printer.rs | 1 + aderyn_driver/src/driver.rs | 5 +++ aderyn_py/src/lib.rs | 1 + bot/src/bot_brain/custom_detectors.rs | 1 + bot/src/runner.rs | 1 + bot_example/src/main.rs | 3 ++ nyth/archive.zip | Bin 150272 -> 150287 bytes 11 files changed, 55 insertions(+), 13 deletions(-) diff --git a/aderyn/src/main.rs b/aderyn/src/main.rs index fa8d0f001..b2f3f6322 100644 --- a/aderyn/src/main.rs +++ b/aderyn/src/main.rs @@ -39,6 +39,10 @@ pub struct CommandLineArgs { #[arg(short, long)] no_snippets: bool, + /// Print the output to stdout instead of a file + #[arg(long)] + stdout: bool, + /// Path to aderyn.config.json #[arg(short, long)] config_file: Option, @@ -81,6 +85,7 @@ fn main() { scope: cmd_args.scope, exclude: cmd_args.exclude, no_snippets: cmd_args.no_snippets, + stdout: cmd_args.stdout, }; let aderyn_config_path = match cmd_args.config_file { @@ -176,6 +181,7 @@ fn main() { scope: scope_lines, exclude: args.exclude, no_snippets: args.no_snippets, + stdout: args.stdout, }; driver::drive_with(new_args, subscriptions); } diff --git a/aderyn_core/src/lib.rs b/aderyn_core/src/lib.rs index 6eb24a015..556671304 100644 --- a/aderyn_core/src/lib.rs +++ b/aderyn_core/src/lib.rs @@ -27,6 +27,7 @@ pub fn run_with_printer( reporter: T, root_rel_path: PathBuf, no_snippets: bool, + stdout: bool, ) -> Result<(), Box> where T: ReportPrinter<()>, @@ -38,6 +39,7 @@ where reporter, root_rel_path, no_snippets, + stdout, detectors, ) } @@ -48,6 +50,7 @@ pub fn run_with_printer_and_given_detectors( reporter: T, root_rel_path: PathBuf, no_snippets: bool, + stdout: bool, mut detectors: Vec>, ) -> Result<(), Box> where @@ -104,21 +107,34 @@ where println!("Detectors run, processing found issues"); println!("Found issues processed. Printing report"); - reporter.print_report( - get_markdown_writer(&output_file_path)?, - &report, - context, - root_rel_path, - Some(output_file_path.clone()), - no_snippets, - detectors_used, - )?; - - println!("Report printed to {}", output_file_path); + if !stdout { + reporter.print_report( + get_writer(&output_file_path)?, + &report, + context, + root_rel_path, + Some(output_file_path.clone()), + no_snippets, + stdout, + detectors_used, + )?; + println!("Report printed to {}", output_file_path); + } else { + reporter.print_report( + io::stdout(), + &report, + context, + root_rel_path, + Some(output_file_path.clone()), + no_snippets, + stdout, + detectors_used, + )?; + } Ok(()) } -fn get_markdown_writer(filename: &str) -> io::Result { +fn get_writer(filename: &str) -> io::Result { let file_path = Path::new(filename); if let Some(parent_dir) = file_path.parent() { std::fs::create_dir_all(parent_dir)?; diff --git a/aderyn_core/src/report/json_printer.rs b/aderyn_core/src/report/json_printer.rs index c0cc63075..a06a4dfe4 100644 --- a/aderyn_core/src/report/json_printer.rs +++ b/aderyn_core/src/report/json_printer.rs @@ -1,5 +1,5 @@ use std::{ - io::{Result, Write}, + io::{self, Result, Write}, path::PathBuf, }; @@ -47,6 +47,7 @@ impl ReportPrinter<()> for JsonPrinter { _: PathBuf, _: Option, _: bool, + stdout: bool, detectors_used: &[(String, String)], ) -> Result<()> { let detectors_used_names: Vec<_> = detectors_used.iter().map(|x| x.0.clone()).collect(); @@ -63,6 +64,12 @@ impl ReportPrinter<()> for JsonPrinter { detectors_used: detectors_used_names, }; let value = serde_json::to_value(content).unwrap(); + if stdout { + println!("STDOUT START"); + let _ = serde_json::to_writer_pretty(io::stdout(), &value); + println!("STDOUT END"); + return Ok(()); + } _ = serde_json::to_writer_pretty(writer, &value); Ok(()) } diff --git a/aderyn_core/src/report/markdown_printer.rs b/aderyn_core/src/report/markdown_printer.rs index 4264db9e1..204dcd6a2 100644 --- a/aderyn_core/src/report/markdown_printer.rs +++ b/aderyn_core/src/report/markdown_printer.rs @@ -21,6 +21,7 @@ impl ReportPrinter<()> for MarkdownReportPrinter { root_path: PathBuf, output_rel_path: Option, no_snippets: bool, + _: bool, detectors_used: &[(String, String)], ) -> Result<()> { self.print_title_and_disclaimer(&mut writer)?; diff --git a/aderyn_core/src/report/printer.rs b/aderyn_core/src/report/printer.rs index 8063b3362..b7f873f43 100644 --- a/aderyn_core/src/report/printer.rs +++ b/aderyn_core/src/report/printer.rs @@ -17,6 +17,7 @@ pub trait ReportPrinter { root_rel_path: PathBuf, output_rel_path: Option, // you writer 'W' may or may not be writing a file. Eg: it can simply consume and forget :P no_snippets: bool, + stdout: bool, detectors_used: &[(String, String)], ) -> Result; } diff --git a/aderyn_driver/src/driver.rs b/aderyn_driver/src/driver.rs index c72a83c46..0f5c6d62f 100644 --- a/aderyn_driver/src/driver.rs +++ b/aderyn_driver/src/driver.rs @@ -14,6 +14,7 @@ pub struct Args { pub exclude: Option>, pub scope: Option>, pub no_snippets: bool, + pub stdout: bool, } enum Framework { @@ -35,6 +36,7 @@ pub fn drive(args: Args) { JsonPrinter, root_rel_path, args.no_snippets, + args.stdout, ) .unwrap_or_else(|err| { // Exit with a non-zero exit code @@ -50,6 +52,7 @@ pub fn drive(args: Args) { MarkdownReportPrinter, root_rel_path, args.no_snippets, + args.stdout, ) .unwrap_or_else(|err| { // Exit with a non-zero exit code @@ -74,6 +77,7 @@ pub fn drive_with(args: Args, detectors: Vec>) { JsonPrinter, root_rel_path, args.no_snippets, + args.stdout, detectors, ) .unwrap_or_else(|err| { @@ -90,6 +94,7 @@ pub fn drive_with(args: Args, detectors: Vec>) { MarkdownReportPrinter, root_rel_path, args.no_snippets, + args.stdout, detectors, ) .unwrap_or_else(|err| { diff --git a/aderyn_py/src/lib.rs b/aderyn_py/src/lib.rs index 8d80daacc..4797d2b5c 100644 --- a/aderyn_py/src/lib.rs +++ b/aderyn_py/src/lib.rs @@ -13,6 +13,7 @@ fn main() { no_snippets: false, // TODO support this later scope: None, // TODO support this later exclude: None, // TODO support this later + stdout: false, // TODO support this later }; driver::drive(args); } diff --git a/bot/src/bot_brain/custom_detectors.rs b/bot/src/bot_brain/custom_detectors.rs index 53eb635e9..6295fbb78 100644 --- a/bot/src/bot_brain/custom_detectors.rs +++ b/bot/src/bot_brain/custom_detectors.rs @@ -56,6 +56,7 @@ pub fn generate_report_for_judge( exclude, scope, no_snippets, + stdout: false, }, custom_detectors(), ) diff --git a/bot/src/runner.rs b/bot/src/runner.rs index 1f944d4eb..cc94c873b 100644 --- a/bot/src/runner.rs +++ b/bot/src/runner.rs @@ -20,6 +20,7 @@ pub fn run() { exclude: None, scope: None, no_snippets: false, + stdout: false, }, subscriptions, ) diff --git a/bot_example/src/main.rs b/bot_example/src/main.rs index 8c4ea7b01..14126bc92 100644 --- a/bot_example/src/main.rs +++ b/bot_example/src/main.rs @@ -33,6 +33,7 @@ fn main() { output: format!("bot_reports/{}default_analysis_report.md", cmd_args.prefix).to_string(), exclude: None, no_snippets: false, + stdout: false, scope: None, }); @@ -54,6 +55,7 @@ fn main() { .to_string(), exclude: None, no_snippets: false, + stdout: false, scope: None, }, subscribe_to, // inject subscriptions here @@ -80,6 +82,7 @@ fn main() { .to_string(), exclude: None, no_snippets: false, + stdout: false, scope: None, }, subscribe_to_hybrid, // inject subscriptions here diff --git a/nyth/archive.zip b/nyth/archive.zip index 899e691e8e21328f25c2f9034cd5718138133f7f..ce1571237de08c3a47165d8b2a6ce59d57086860 100644 GIT binary patch delta 1678 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 Pm-|Wr4hB*d0ssI2dllUG