From cfd9fd8eb3cfb3477843b3eea31700b54d721dcf Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 19 Mar 2024 09:51:49 +0100 Subject: tester: add gen-reqs command --- tester/src/generate.rs | 4 +++- tester/src/genreqs.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ tester/src/main.rs | 27 +++++++++++++++++++++++++- tester/src/util.rs | 3 +++ 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 tester/src/genreqs.rs create mode 100644 tester/src/util.rs diff --git a/tester/src/generate.rs b/tester/src/generate.rs index b75a325..bc68597 100644 --- a/tester/src/generate.rs +++ b/tester/src/generate.rs @@ -5,6 +5,8 @@ use anyhow::Result; use indicatif::{ProgressBar, ProgressStyle}; use openpgp::{cert::CertBuilder, serialize::Serialize}; +use crate::util; + pub fn do_generate(count: u64, output_path: &Path, fprs_path: Option<&Path>) -> Result<()> { let progress_bar = ProgressBar::new(count); progress_bar.set_style( @@ -22,7 +24,7 @@ pub fn do_generate(count: u64, output_path: &Path, fprs_path: Option<&Path>) -> }; for i in 0..count { let (cert, _) = - CertBuilder::general_purpose(None, Some(format!("{:07}@hagrid.invalid", i))) + CertBuilder::general_purpose(None, Some(util::gen_email(i))) .generate()?; cert.serialize(&mut output)?; if let Some(ref mut output_fprs) = output_fprs { diff --git a/tester/src/genreqs.rs b/tester/src/genreqs.rs new file mode 100644 index 0000000..fd3d588 --- /dev/null +++ b/tester/src/genreqs.rs @@ -0,0 +1,52 @@ +use std::io::Write; +use std::{fs::File, io, io::BufRead, path::Path}; + +use anyhow::Result; +use rand::seq::SliceRandom; +use rand::{thread_rng, Rng}; + +use crate::util; + +pub fn do_genreqs(host: &str, fprs_path: &Path) -> Result<()> { + let file = File::open(fprs_path)?; + let fingerprints: Vec = io::BufReader::new(file).lines().flatten().collect(); + + /* possible requests: + * /vks/v1/by-fingerprint/ + * /vks/v1/by-keyid/ + * /vks/v1/by-email/ + */ + + let mut rng = thread_rng(); + let mut stdout = io::LineWriter::new(io::stdout()); + loop { + let result = match rng.gen_range(0, 3) { + 0 => { + let email = util::gen_email(rng.gen_range(0, fingerprints.len() as u64)); + stdout.write_fmt(format_args!( + "GET {}/vks/v1/by-email/{}\n", + host, email + )) + } + 1 => { + let random_fpr = fingerprints.choose(&mut rng).unwrap(); + stdout.write_fmt(format_args!( + "GET {}/vks/v1/by-keyid/{}\n", + host, + &random_fpr[24..40] + )) + } + _ => { + let random_fpr = fingerprints.choose(&mut rng).unwrap(); + stdout.write_fmt(format_args!( + "GET {}/vks/v1/by-fingerprint/{}\n", + host, random_fpr + )) + } + }; + + if result.is_err() { + return Ok(()); + } + } +} diff --git a/tester/src/main.rs b/tester/src/main.rs index a2de67c..3ece95f 100644 --- a/tester/src/main.rs +++ b/tester/src/main.rs @@ -1,6 +1,7 @@ extern crate anyhow; extern crate clap; extern crate indicatif; +extern crate rand; extern crate sequoia_openpgp as openpgp; extern crate serde_derive; @@ -11,6 +12,8 @@ use anyhow::Result; use clap::{App, Arg, SubCommand}; mod generate; +mod genreqs; +mod util; fn main() -> Result<()> { let matches = App::new("Hagrid Tester") @@ -46,6 +49,17 @@ fn main() -> Result<()> { .help("path to file to store fingerprints in"), ), ) + .subcommand( + SubCommand::with_name("gen-reqs") + .about("generate requests") + .arg( + Arg::with_name("fingerprints file") + .long("fingerprints-file") + .default_value("fingerprints.txt") + .help("path to read fingerprints from"), + ) + .arg(Arg::with_name("host").index(1).required(true)), + ) .get_matches(); if let Some(matches) = matches.subcommand_matches("generate") { @@ -58,7 +72,18 @@ fn main() -> Result<()> { let output_fprs: Option = matches .value_of("fingerprints output file") .map(|s| s.parse().unwrap()); - generate::do_generate(count, output_certs.as_path(), output_fprs.as_ref().map(|f| f.as_path()))?; + generate::do_generate( + count, + output_certs.as_path(), + output_fprs.as_ref().map(|f| f.as_path()), + )?; + } else if let Some(matches) = matches.subcommand_matches("gen-reqs") { + let host = matches.value_of("host").unwrap(); + let fprs_file: PathBuf = matches + .value_of("fingerprints file") + .map(|s| s.parse().unwrap()) + .unwrap(); + genreqs::do_genreqs(host, fprs_file.as_path())?; } else { println!("{}", matches.usage()); } diff --git a/tester/src/util.rs b/tester/src/util.rs new file mode 100644 index 0000000..f8edd21 --- /dev/null +++ b/tester/src/util.rs @@ -0,0 +1,3 @@ +pub fn gen_email(i: u64) -> String { + format!("{:07}@hagrid.invalid", i) +} -- cgit v1.2.3-70-g09d2