diff options
| -rw-r--r-- | src/arg_defs.rs | 2 | ||||
| -rw-r--r-- | src/args.rs | 19 | ||||
| -rw-r--r-- | src/commands.rs | 27 | 
3 files changed, 16 insertions, 32 deletions
| diff --git a/src/arg_defs.rs b/src/arg_defs.rs index c63fd82..fd296e4 100644 --- a/src/arg_defs.rs +++ b/src/arg_defs.rs @@ -222,7 +222,7 @@ Command! {OtpCommand, [      crate::commands::otp_get(ctx, args.slot, args.algorithm, args.time)    },    /// Configures a one-time password slot -  Set(OtpSetArgs) => crate::args::otp_set, +  Set(OtpSetArgs) => crate::commands::otp_set,    /// Prints the status of the one-time password slots    Status(OtpStatusArgs) => |ctx, args: OtpStatusArgs| crate::commands::otp_status(ctx, args.all),  ]} diff --git a/src/args.rs b/src/args.rs index 720fabf..3a1f2c8 100644 --- a/src/args.rs +++ b/src/args.rs @@ -82,25 +82,6 @@ pub fn config_set(ctx: &mut ExecCtx<'_>, args: arg_defs::ConfigSetArgs) -> Resul    commands::config_set(ctx, numlock, capslock, scrollock, otp_pin)  } -pub fn otp_set(ctx: &mut ExecCtx<'_>, args: arg_defs::OtpSetArgs) -> Result<()> { -  let data = nitrokey::OtpSlotData { -    number: args.slot, -    name: args.name, -    secret: args.secret, -    mode: args.digits.into(), -    use_enter: false, -    token_id: None, -  }; -  commands::otp_set( -    ctx, -    data, -    args.algorithm, -    args.counter, -    args.time_window, -    args.format, -  ) -} -  /// Parse the command-line arguments and execute the selected command.  pub(crate) fn handle_arguments(ctx: &mut RunCtx<'_>, args: Vec<String>) -> Result<()> {    use structopt::StructOpt; diff --git a/src/commands.rs b/src/commands.rs index 5b5fce1..55e6707 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -18,6 +18,7 @@  // *************************************************************************  use std::fmt; +use std::mem;  use std::result;  use std::thread;  use std::time; @@ -694,16 +695,18 @@ fn prepare_base32_secret(secret: &str) -> Result<String> {  }  /// Configure a one-time password slot on the Nitrokey device. -pub fn otp_set( -  ctx: &mut args::ExecCtx<'_>, -  mut data: nitrokey::OtpSlotData, -  algorithm: arg_defs::OtpAlgorithm, -  counter: u64, -  time_window: u16, -  secret_format: arg_defs::OtpSecretFormat, -) -> Result<()> { +pub fn otp_set(ctx: &mut args::ExecCtx<'_>, mut args: arg_defs::OtpSetArgs) -> Result<()> { +  let mut data = nitrokey::OtpSlotData { +    number: args.slot, +    name: mem::take(&mut args.name), +    secret: mem::take(&mut args.secret), +    mode: args.digits.into(), +    use_enter: false, +    token_id: None, +  }; +    with_device(ctx, |ctx, device| { -    let secret = match secret_format { +    let secret = match args.format {        arg_defs::OtpSecretFormat::Ascii => prepare_ascii_secret(&data.secret)?,        arg_defs::OtpSecretFormat::Base32 => prepare_base32_secret(&data.secret)?,        arg_defs::OtpSecretFormat::Hex => { @@ -721,9 +724,9 @@ pub fn otp_set(      };      let data = nitrokey::OtpSlotData { secret, ..data };      let mut device = authenticate_admin(ctx, device)?; -    match algorithm { -      arg_defs::OtpAlgorithm::Hotp => device.write_hotp_slot(data, counter), -      arg_defs::OtpAlgorithm::Totp => device.write_totp_slot(data, time_window), +    match args.algorithm { +      arg_defs::OtpAlgorithm::Hotp => device.write_hotp_slot(data, args.counter), +      arg_defs::OtpAlgorithm::Totp => device.write_totp_slot(data, args.time_window),      }      .map_err(|err| get_error("Could not write OTP slot", err))?;      Ok(()) | 
