diff options
author | Robin Krahl <robin.krahl@ireas.org> | 2020-01-25 20:33:57 +0100 |
---|---|---|
committer | Daniel Mueller <deso@posteo.net> | 2021-01-10 17:37:56 -0800 |
commit | 6ce6dc4f3db67c3f6b6148b1fb03644e91900291 (patch) | |
tree | 6e3b2901c8cd27e43d0d85943de81b307be82f74 /src/config.rs | |
parent | 6f029e744abc0f6d4cfe756d7e6b771be1be3999 (diff) | |
download | nitrocli-6ce6dc4f3db67c3f6b6148b1fb03644e91900291.tar.gz nitrocli-6ce6dc4f3db67c3f6b6148b1fb03644e91900291.tar.bz2 |
Add --serial-number option
This patch adds the --serial-number option that allows the user to
filter the attached Nitrokey devices by serial number. As the Nitrokey
Storage does not include its serial number in the USB device descriptor
and as we don't want to connect to it just to query the serial number,
this option only works for Nitrokey Storage devices.
Diffstat (limited to 'src/config.rs')
-rw-r--r-- | src/config.rs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/config.rs b/src/config.rs index caa1ef9..a609189 100644 --- a/src/config.rs +++ b/src/config.rs @@ -5,6 +5,10 @@ use std::fs; use std::path; +use std::str::FromStr as _; + +use serde::de::Error as _; +use serde::Deserialize as _; use crate::args; @@ -20,10 +24,14 @@ const CONFIG_FILE: &str = "config.toml"; /// The configuration for nitrocli, usually read from configuration /// files and environment variables. -#[derive(Clone, Copy, Debug, Default, PartialEq, merge::Merge, serde::Deserialize)] +#[derive(Clone, Debug, Default, PartialEq, merge::Merge, serde::Deserialize)] pub struct Config { /// The model to connect to. pub model: Option<args::DeviceModel>, + /// The serial numbers of the device to connect to. + #[merge(strategy = merge::vec::overwrite_empty)] + #[serde(default, deserialize_with = "deserialize_serial_number_vec")] + pub serial_numbers: Vec<nitrokey::SerialNumber>, /// Whether to bypass the cache for all secrets or not. #[merge(strategy = merge::bool::overwrite_false)] #[serde(default)] @@ -34,6 +42,18 @@ pub struct Config { pub verbosity: u8, } +fn deserialize_serial_number_vec<'de, D>(d: D) -> Result<Vec<nitrokey::SerialNumber>, D::Error> +where + D: serde::Deserializer<'de>, +{ + let strings = Vec::<String>::deserialize(d).map_err(D::Error::custom)?; + let result = strings + .iter() + .map(|s| nitrokey::SerialNumber::from_str(s)) + .collect::<Result<_, _>>(); + result.map_err(D::Error::custom) +} + impl Config { pub fn load() -> anyhow::Result<Self> { use merge::Merge as _; @@ -51,6 +71,9 @@ impl Config { if args.model.is_some() { self.model = args.model; } + if !args.serial_numbers.is_empty() { + self.serial_numbers = args.serial_numbers.clone(); + } if args.no_cache { self.no_cache = true; } |