Add subcommands
This commit is contained in:
parent
5350b380e2
commit
ac9f033656
60
src/main.rs
60
src/main.rs
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user