From e9787dcbd318b4551a1c2b7603912cecf01251d5 Mon Sep 17 00:00:00 2001 From: Nora Widdecke Date: Tue, 25 Oct 2022 00:06:33 +0200 Subject: [PATCH] opgpcard: Make TouchPolicy type safe --- tools/src/bin/opgpcard/cli.rs | 35 ++++++++++++++++++++++++++++------ tools/src/bin/opgpcard/main.rs | 11 +---------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/tools/src/bin/opgpcard/cli.rs b/tools/src/bin/opgpcard/cli.rs index fe8d191..bae7d92 100644 --- a/tools/src/bin/opgpcard/cli.rs +++ b/tools/src/bin/opgpcard/cli.rs @@ -207,12 +207,8 @@ pub enum AdminCommand { #[clap(name = "Key slot", short = 'k', long = "key", value_enum)] key: BasePlusAttKeySlot, - #[clap( - name = "Policy (Off|On|Fixed|Cached|Cached-Fixed)", - short = 'p', - long = "policy" - )] - policy: String, + #[clap(name = "Policy", short = 'p', long = "policy", value_enum)] + policy: TouchPolicy, }, } @@ -334,3 +330,30 @@ impl From for openpgp_card_sequoia::types::KeyType { } } } + +#[derive(ValueEnum, Debug, Clone)] +pub enum TouchPolicy { + #[clap(name = "Off")] + Off, + #[clap(name = "On")] + On, + #[clap(name = "Fixed")] + Fixed, + #[clap(name = "Cached")] + Cached, + #[clap(name = "Cached-Fixed")] + CachedFixed, +} + +impl From for openpgp_card_sequoia::types::TouchPolicy { + fn from(tp: TouchPolicy) -> Self { + use openpgp_card_sequoia::types::TouchPolicy as OCTouchPolicy; + match tp { + TouchPolicy::On => OCTouchPolicy::On, + TouchPolicy::Off => OCTouchPolicy::Off, + TouchPolicy::Fixed => OCTouchPolicy::Fixed, + TouchPolicy::Cached => OCTouchPolicy::Cached, + TouchPolicy::CachedFixed => OCTouchPolicy::CachedFixed, + } + } +} diff --git a/tools/src/bin/opgpcard/main.rs b/tools/src/bin/opgpcard/main.rs index 868fe71..815ed07 100644 --- a/tools/src/bin/opgpcard/main.rs +++ b/tools/src/bin/opgpcard/main.rs @@ -335,16 +335,7 @@ fn main() -> Result<(), Box> { cli::AdminCommand::Touch { key, policy } => { let kt = KeyType::from(key); - let pol = match policy.as_str() { - "Off" => TouchPolicy::Off, - "On" => TouchPolicy::On, - "Fixed" => TouchPolicy::Fixed, - "Cached" => TouchPolicy::Cached, - "Cached-Fixed" => TouchPolicy::CachedFixed, - _ => { - return Err(anyhow!("Unexpected Policy {}", policy).into()); - } - }; + let pol = TouchPolicy::from(policy); let mut admin = util::verify_to_admin(&mut open, admin_pin.as_deref())?;