From cc3aa7f14eaec746e6718ef155a59e10c67a03fb Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Sun, 30 Dec 2018 18:32:45 +0100 Subject: Implement the pin set command This change implements the pin set command which can be used to change a Nitrokey's user or admin PIN. --- nitrocli/src/args.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'nitrocli/src/args.rs') diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs index 4341235..f00ac2a 100644 --- a/nitrocli/src/args.rs +++ b/nitrocli/src/args.rs @@ -24,6 +24,7 @@ use std::str; use crate::commands; use crate::error::Error; +use crate::pinentry; type Result = result::Result; @@ -278,6 +279,7 @@ impl From for nitrokey::OtpMode { #[derive(Debug)] enum PinCommand { Clear, + Set, Unblock, } @@ -285,6 +287,7 @@ impl PinCommand { fn execute(&self, args: Vec) -> Result<()> { match *self { PinCommand::Clear => pin_clear(args), + PinCommand::Set => pin_set(args), PinCommand::Unblock => pin_unblock(args), } } @@ -297,6 +300,7 @@ impl fmt::Display for PinCommand { "{}", match *self { PinCommand::Clear => "clear", + PinCommand::Set => "set", PinCommand::Unblock => "unblock", } ) @@ -309,6 +313,7 @@ impl str::FromStr for PinCommand { fn from_str(s: &str) -> result::Result { match s { "clear" => Ok(PinCommand::Clear), + "set" => Ok(PinCommand::Set), "unblock" => Ok(PinCommand::Unblock), _ => Err(()), } @@ -693,7 +698,7 @@ fn pin(args: Vec) -> Result<()> { let _ = parser.refer(&mut subcommand).required().add_argument( "subcommand", argparse::Store, - "The subcommand to execute (clear|unblock)", + "The subcommand to execute (clear|set|unblock)", ); let _ = parser.refer(&mut subargs).add_argument( "arguments", @@ -717,6 +722,22 @@ fn pin_clear(args: Vec) -> Result<()> { commands::pin_clear() } +/// Change a PIN. +fn pin_set(args: Vec) -> Result<()> { + let mut pintype = pinentry::PinType::User; + let mut parser = argparse::ArgumentParser::new(); + parser.set_description("Changes a PIN"); + let _ = parser.refer(&mut pintype).required().add_argument( + "type", + argparse::Store, + "The PIN type to change (admin|user)", + ); + parse(&parser, args)?; + drop(parser); + + commands::pin_set(pintype) +} + /// Unblock and reset the user PIN. fn pin_unblock(args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); -- cgit v1.2.1