summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Breitmoser <look@my.amazin.horse>2024-03-19 09:51:49 +0100
committerVincent Breitmoser <look@my.amazin.horse>2024-03-24 13:09:04 +0100
commitcfd9fd8eb3cfb3477843b3eea31700b54d721dcf (patch)
tree5b7f86392b481d64b0a21e8b8dc68c6801812cea
parent13ddd4ff3ac578f198103547650fecb61f632cfa (diff)
tester: add gen-reqs command
-rw-r--r--tester/src/generate.rs4
-rw-r--r--tester/src/genreqs.rs52
-rw-r--r--tester/src/main.rs27
-rw-r--r--tester/src/util.rs3
4 files changed, 84 insertions, 2 deletions
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<String> = 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<PathBuf> = 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)
+}