opgpcard: Make TouchPolicy type safe

This commit is contained in:
Nora Widdecke 2022-10-25 00:06:33 +02:00
parent 9dd4f3ab56
commit e9787dcbd3
No known key found for this signature in database
GPG key ID: 2D4111B31DBB99B6
2 changed files with 30 additions and 16 deletions

View file

@ -207,12 +207,8 @@ pub enum AdminCommand {
#[clap(name = "Key slot", short = 'k', long = "key", value_enum)] #[clap(name = "Key slot", short = 'k', long = "key", value_enum)]
key: BasePlusAttKeySlot, key: BasePlusAttKeySlot,
#[clap( #[clap(name = "Policy", short = 'p', long = "policy", value_enum)]
name = "Policy (Off|On|Fixed|Cached|Cached-Fixed)", policy: TouchPolicy,
short = 'p',
long = "policy"
)]
policy: String,
}, },
} }
@ -334,3 +330,30 @@ impl From<BasePlusAttKeySlot> 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<TouchPolicy> 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,
}
}
}

View file

@ -335,16 +335,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
cli::AdminCommand::Touch { key, policy } => { cli::AdminCommand::Touch { key, policy } => {
let kt = KeyType::from(key); let kt = KeyType::from(key);
let pol = match policy.as_str() { let pol = TouchPolicy::from(policy);
"Off" => TouchPolicy::Off,
"On" => TouchPolicy::On,
"Fixed" => TouchPolicy::Fixed,
"Cached" => TouchPolicy::Cached,
"Cached-Fixed" => TouchPolicy::CachedFixed,
_ => {
return Err(anyhow!("Unexpected Policy {}", policy).into());
}
};
let mut admin = util::verify_to_admin(&mut open, admin_pin.as_deref())?; let mut admin = util::verify_to_admin(&mut open, admin_pin.as_deref())?;