Add subcommands

This commit is contained in:
Pierre HUBERT 2022-03-21 13:56:52 +01:00
parent 5350b380e2
commit ac9f033656

View File

@ -1,7 +1,7 @@
use std::time::{SystemTime, UNIX_EPOCH};
use base32::Alphabet;
use clap::Parser;
use clap::{Parser, Subcommand};
use totp_rfc6238::{HashAlgorithm, TotpGenerator};
/// Get the current time since epoch
@ -14,36 +14,50 @@ pub fn time() -> u64 {
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
/// The secret to use
#[clap(short, long)]
secret: String,
#[clap(subcommand)]
command: SubCommands
}
/// Interval between two numbers generation
#[clap(short, long, default_value_t = 30)]
topt_step: u64,
#[derive(Subcommand, Debug)]
enum SubCommands {
/// Get a code
#[clap(arg_required_else_help = true)]
Code {
/// The secret to use
#[clap(short, long)]
secret: String,
/// Size of generated secret
#[clap(short, long, default_value_t = 6)]
len: usize,
/// Interval between two numbers generation
#[clap(short, long, default_value_t = 30)]
topt_step: u64,
/// Size of generated secret
#[clap(short, long, default_value_t = 6)]
len: usize,
}
}
fn main() {
let args: Args = Args::parse();
let totp_generator = TotpGenerator::new()
.set_digit(args.len).unwrap()
.set_step(args.topt_step).unwrap()
.set_hash_algorithm(HashAlgorithm::SHA1)
.build();
match args.command {
SubCommands::Code { secret, topt_step, len } => {
let totp_generator = TotpGenerator::new()
.set_digit(len).unwrap()
.set_step(topt_step).unwrap()
.set_hash_algorithm(HashAlgorithm::SHA1)
.build();
let key = base32::decode(
Alphabet::RFC4648 { padding: true },
&args.secret,
).unwrap();
let key = base32::decode(
Alphabet::RFC4648 { padding: true },
&secret,
).unwrap();
let code = totp_generator.get_code(&key);
let next_update = totp_generator.get_next_update_time().unwrap();
let code = totp_generator.get_code(&key);
let next_update = totp_generator.get_next_update_time().unwrap();
println!("Secret = {}", code);
println!("Next update = {} seconds", next_update - time());
println!("Secret = {}", code);
println!("Next update = {} seconds", next_update - time());
}
}
}