diff options
| -rw-r--r-- | nitrocli/CHANGELOG.md | 5 | ||||
| -rw-r--r-- | nitrocli/src/args.rs | 66 | 
2 files changed, 70 insertions, 1 deletions
| diff --git a/nitrocli/CHANGELOG.md b/nitrocli/CHANGELOG.md index 1b24ba2..f582461 100644 --- a/nitrocli/CHANGELOG.md +++ b/nitrocli/CHANGELOG.md @@ -1,3 +1,8 @@ +Unreleased +---------- +- Added the `pws` command for accessing the password safe + +  0.2.0  -----  - Use the `nitrokey` crate for the `open`, `close`, and `status` diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs index f00ac2a..df7f56c 100644 --- a/nitrocli/src/args.rs +++ b/nitrocli/src/args.rs @@ -34,6 +34,7 @@ pub enum Command {    Config,    Otp,    Pin, +  Pws,    Status,    Storage,  } @@ -45,6 +46,7 @@ impl Command {        Command::Config => config(args),        Command::Otp => otp(args),        Command::Pin => pin(args), +      Command::Pws => pws(args),        Command::Status => status(args),        Command::Storage => storage(args),      } @@ -60,6 +62,7 @@ impl fmt::Display for Command {          Command::Config => "config",          Command::Otp => "otp",          Command::Pin => "pin", +        Command::Pws => "pws",          Command::Status => "status",          Command::Storage => "storage",        } @@ -75,6 +78,7 @@ impl str::FromStr for Command {        "config" => Ok(Command::Config),        "otp" => Ok(Command::Otp),        "pin" => Ok(Command::Pin), +      "pws" => Ok(Command::Pws),        "status" => Ok(Command::Status),        "storage" => Ok(Command::Storage),        _ => Err(()), @@ -320,6 +324,42 @@ impl str::FromStr for PinCommand {    }  } +#[derive(Debug)] +enum PwsCommand { +  Get, +} + +impl PwsCommand { +  fn execute(&self, _args: Vec<String>) -> Result<()> { +    match *self { +      PwsCommand::Get => Err(Error::Error("Not implemented".to_string())), +    } +  } +} + +impl fmt::Display for PwsCommand { +  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +    write!( +      f, +      "{}", +      match *self { +        PwsCommand::Get => "get", +      } +    ) +  } +} + +impl str::FromStr for PwsCommand { +  type Err = (); + +  fn from_str(s: &str) -> result::Result<Self, Self::Err> { +    match s { +      "get" => Ok(PwsCommand::Get), +      _ => Err(()), +    } +  } +} +  fn parse(parser: &argparse::ArgumentParser<'_>, args: Vec<String>) -> Result<()> {    if let Err(err) = parser.parse(args, &mut io::stdout(), &mut io::stderr()) {      Err(Error::ArgparseError(err)) @@ -747,6 +787,30 @@ fn pin_unblock(args: Vec<String>) -> Result<()> {    commands::pin_unblock()  } +/// Execute a PWS subcommand. +fn pws(args: Vec<String>) -> Result<()> { +  let mut subcommand = PwsCommand::Get; +  let mut subargs = vec![]; +  let mut parser = argparse::ArgumentParser::new(); +  parser.set_description("Accesses the password safe"); +  let _ = parser.refer(&mut subcommand).required().add_argument( +    "subcommand", +    argparse::Store, +    "The subcommand to execute (get)", +  ); +  let _ = parser.refer(&mut subargs).add_argument( +    "arguments", +    argparse::List, +    "The arguments for the subcommand", +  ); +  parser.stop_on_first_argument(true); +  parse(&parser, args)?; +  drop(parser); + +  subargs.insert(0, format!("nitrocli pws {}", subcommand)); +  subcommand.execute(subargs) +} +  /// Parse the command-line arguments and return the selected command and  /// the remaining arguments for the command.  fn parse_arguments(args: Vec<String>) -> Result<(Command, Vec<String>)> { @@ -757,7 +821,7 @@ fn parse_arguments(args: Vec<String>) -> Result<(Command, Vec<String>)> {    let _ = parser.refer(&mut command).required().add_argument(      "command",      argparse::Store, -    "The command to execute (config|otp|pin|status|storage)", +    "The command to execute (config|otp|pin|pws|status|storage)",    );    let _ = parser.refer(&mut subargs).add_argument(      "arguments", | 
