Collect flag-parsing logic into PluginFlags struct
This commit is contained in:
+49
-26
@@ -1,3 +1,5 @@
|
|||||||
|
use std::convert::{TryFrom, TryInto};
|
||||||
|
|
||||||
use age_plugin::run_state_machine;
|
use age_plugin::run_state_machine;
|
||||||
use dialoguer::{Confirm, Input, Select};
|
use dialoguer::{Confirm, Input, Select};
|
||||||
use gumdrop::Options;
|
use gumdrop::Options;
|
||||||
@@ -5,7 +7,7 @@ use yubikey_piv::{
|
|||||||
certificate::PublicKeyInfo,
|
certificate::PublicKeyInfo,
|
||||||
key::{RetiredSlotId, SlotId},
|
key::{RetiredSlotId, SlotId},
|
||||||
policy::{PinPolicy, TouchPolicy},
|
policy::{PinPolicy, TouchPolicy},
|
||||||
Key, Readers,
|
Key, Readers, Serial,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod builder;
|
mod builder;
|
||||||
@@ -105,25 +107,49 @@ struct PluginOptions {
|
|||||||
touch_policy: Option<String>,
|
touch_policy: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate(opts: PluginOptions) -> Result<(), Error> {
|
struct PluginFlags {
|
||||||
let serial = opts.serial.map(|s| s.into());
|
serial: Option<Serial>,
|
||||||
let slot = opts.slot.map(util::ui_to_slot).transpose()?;
|
slot: Option<RetiredSlotId>,
|
||||||
let pin_policy = opts
|
name: Option<String>,
|
||||||
.pin_policy
|
pin_policy: Option<PinPolicy>,
|
||||||
.map(util::pin_policy_from_string)
|
touch_policy: Option<TouchPolicy>,
|
||||||
.transpose()?;
|
force: bool,
|
||||||
let touch_policy = opts
|
}
|
||||||
.touch_policy
|
|
||||||
.map(util::touch_policy_from_string)
|
|
||||||
.transpose()?;
|
|
||||||
|
|
||||||
let mut yubikey = yubikey::open(serial)?;
|
impl TryFrom<PluginOptions> for PluginFlags {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
let (stub, recipient, metadata) = builder::IdentityBuilder::new(slot)
|
fn try_from(opts: PluginOptions) -> Result<Self, Self::Error> {
|
||||||
.with_name(opts.name)
|
let serial = opts.serial.map(|s| s.into());
|
||||||
.with_pin_policy(pin_policy)
|
let slot = opts.slot.map(util::ui_to_slot).transpose()?;
|
||||||
.with_touch_policy(touch_policy)
|
let pin_policy = opts
|
||||||
.force(opts.force)
|
.pin_policy
|
||||||
|
.map(util::pin_policy_from_string)
|
||||||
|
.transpose()?;
|
||||||
|
let touch_policy = opts
|
||||||
|
.touch_policy
|
||||||
|
.map(util::touch_policy_from_string)
|
||||||
|
.transpose()?;
|
||||||
|
|
||||||
|
Ok(PluginFlags {
|
||||||
|
serial,
|
||||||
|
slot,
|
||||||
|
name: opts.name,
|
||||||
|
pin_policy,
|
||||||
|
touch_policy,
|
||||||
|
force: opts.force,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate(flags: PluginFlags) -> Result<(), Error> {
|
||||||
|
let mut yubikey = yubikey::open(flags.serial)?;
|
||||||
|
|
||||||
|
let (stub, recipient, metadata) = builder::IdentityBuilder::new(flags.slot)
|
||||||
|
.with_name(flags.name)
|
||||||
|
.with_pin_policy(flags.pin_policy)
|
||||||
|
.with_touch_policy(flags.touch_policy)
|
||||||
|
.force(flags.force)
|
||||||
.build(&mut yubikey)?;
|
.build(&mut yubikey)?;
|
||||||
|
|
||||||
util::print_identity(stub, recipient, metadata);
|
util::print_identity(stub, recipient, metadata);
|
||||||
@@ -131,11 +157,8 @@ fn generate(opts: PluginOptions) -> Result<(), Error> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn identity(opts: PluginOptions) -> Result<(), Error> {
|
fn identity(flags: PluginFlags) -> Result<(), Error> {
|
||||||
let serial = opts.serial.map(|s| s.into());
|
let mut yubikey = yubikey::open(flags.serial)?;
|
||||||
let slot = opts.slot.map(util::ui_to_slot).transpose()?;
|
|
||||||
|
|
||||||
let mut yubikey = yubikey::open(serial)?;
|
|
||||||
|
|
||||||
let mut keys = Key::list(&mut yubikey)?.into_iter().filter_map(|key| {
|
let mut keys = Key::list(&mut yubikey)?.into_iter().filter_map(|key| {
|
||||||
// - We only use the retired slots.
|
// - We only use the retired slots.
|
||||||
@@ -148,7 +171,7 @@ fn identity(opts: PluginOptions) -> Result<(), Error> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let (key, slot, recipient) = if let Some(slot) = slot {
|
let (key, slot, recipient) = if let Some(slot) = flags.slot {
|
||||||
keys.find(|(_, s, _)| s == &slot)
|
keys.find(|(_, s, _)| s == &slot)
|
||||||
.ok_or(Error::SlotHasNoIdentity(slot))
|
.ok_or(Error::SlotHasNoIdentity(slot))
|
||||||
} else {
|
} else {
|
||||||
@@ -252,9 +275,9 @@ fn main() -> Result<(), Error> {
|
|||||||
println!("age-plugin-yubikey {}", env!("CARGO_PKG_VERSION"));
|
println!("age-plugin-yubikey {}", env!("CARGO_PKG_VERSION"));
|
||||||
Ok(())
|
Ok(())
|
||||||
} else if opts.generate {
|
} else if opts.generate {
|
||||||
generate(opts)
|
generate(opts.try_into()?)
|
||||||
} else if opts.identity {
|
} else if opts.identity {
|
||||||
identity(opts)
|
identity(opts.try_into()?)
|
||||||
} else if opts.list {
|
} else if opts.list {
|
||||||
list(false)
|
list(false)
|
||||||
} else if opts.list_all {
|
} else if opts.list_all {
|
||||||
|
|||||||
Reference in New Issue
Block a user