aboutsummaryrefslogtreecommitdiff
path: root/nitrocli/src/args.rs
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-01-05 21:56:38 +0100
committerDaniel Mueller <deso@posteo.net>2019-01-13 18:36:46 -0800
commitbbb54f26c6101225a4f79f2f7f89cf5d71a62dd1 (patch)
tree708e14d408ecef67854f067c5033b78ed15c98a3 /nitrocli/src/args.rs
parent1af4c0771034aa5d5f0a1f558dabc58c87fa3b19 (diff)
downloadnitrocli-bbb54f26c6101225a4f79f2f7f89cf5d71a62dd1.tar.gz
nitrocli-bbb54f26c6101225a4f79f2f7f89cf5d71a62dd1.tar.bz2
Add the --model option to restrict the device model to connect to
This patch adds the -m/--model option that can be used to restrict the device model to connect to. Per default, nitrocli connects to any available Nitrokey device. If this new option is set, it will instead only connect to devices of the given Nitrokey model. We introduce a new struct DeviceModel instead of using nitrokey::DeviceModel to make sure that the command-line options are parsed properly. On the long term, we should add a connect_model function to the nitrokey crate to make the connection code easier.
Diffstat (limited to 'nitrocli/src/args.rs')
-rw-r--r--nitrocli/src/args.rs41
1 files changed, 40 insertions, 1 deletions
diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs
index 869734c..ad296c2 100644
--- a/nitrocli/src/args.rs
+++ b/nitrocli/src/args.rs
@@ -28,10 +28,43 @@ use crate::pinentry;
type Result<T> = result::Result<T, Error>;
+/// The available Nitrokey models.
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum DeviceModel {
+ Pro,
+ Storage,
+}
+
+impl fmt::Display for DeviceModel {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(
+ f,
+ "{}",
+ match *self {
+ DeviceModel::Pro => "pro",
+ DeviceModel::Storage => "storage",
+ }
+ )
+ }
+}
+
+impl str::FromStr for DeviceModel {
+ type Err = ();
+
+ fn from_str(s: &str) -> result::Result<Self, Self::Err> {
+ match s {
+ "pro" => Ok(DeviceModel::Pro),
+ "storage" => Ok(DeviceModel::Storage),
+ _ => Err(()),
+ }
+ }
+}
+
/// A command execution context that captures additional data pertaining
/// the command execution.
#[derive(Debug)]
pub struct ExecCtx {
+ pub model: Option<DeviceModel>,
pub verbosity: u64,
}
@@ -952,6 +985,7 @@ fn pws_status(ctx: &ExecCtx, args: Vec<String>) -> Result<()> {
/// 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, ExecCtx, Vec<String>)> {
+ let mut model: Option<DeviceModel> = None;
let mut verbosity = 0;
let mut command = Command::Status;
let mut subargs = vec![];
@@ -961,6 +995,11 @@ fn parse_arguments(args: Vec<String>) -> Result<(Command, ExecCtx, Vec<String>)>
argparse::IncrBy::<u64>(1),
"Increase the log level (can be supplied multiple times)",
);
+ let _ = parser.refer(&mut model).add_option(
+ &["-m", "--model"],
+ argparse::StoreOption,
+ "Select the device model to connect to (pro|storage)",
+ );
parser.set_description("Provides access to a Nitrokey device");
let _ = parser.refer(&mut command).required().add_argument(
"command",
@@ -978,7 +1017,7 @@ fn parse_arguments(args: Vec<String>) -> Result<(Command, ExecCtx, Vec<String>)>
subargs.insert(0, format!("nitrocli {}", command));
- let ctx = ExecCtx { verbosity };
+ let ctx = ExecCtx { model, verbosity };
Ok((command, ctx, subargs))
}