diff options
-rw-r--r-- | nitrocli/src/pinentry.rs | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/nitrocli/src/pinentry.rs b/nitrocli/src/pinentry.rs index f7a400c..68cc4aa 100644 --- a/nitrocli/src/pinentry.rs +++ b/nitrocli/src/pinentry.rs @@ -17,12 +17,15 @@ // * along with this program. If not, see <http://www.gnu.org/licenses/>. * // ************************************************************************* +use std::borrow; use std::fmt; use std::process; use std::str; use crate::error::Error; +type CowStr = borrow::Cow<'static, str>; + /// PIN type requested from pinentry. /// /// The available PIN types correspond to the PIN types used by the Nitrokey devices: user and @@ -35,11 +38,11 @@ Enum! {PinType, [ /// A trait representing a secret to be entered by the user. pub trait SecretEntry: fmt::Debug { /// The cache ID to use for this secret. - fn cache_id(&self) -> String; + fn cache_id(&self) -> CowStr; /// The prompt to display when asking for the secret. - fn prompt(&self) -> &'static str; + fn prompt(&self) -> CowStr; /// The description to display when asking for the secret. - fn description(&self, mode: Mode) -> String; + fn description(&self, mode: Mode) -> CowStr; } #[derive(Debug)] @@ -69,7 +72,7 @@ impl PinEntry { } impl SecretEntry for PinEntry { - fn cache_id(&self) -> String { + fn cache_id(&self) -> CowStr { let model = self.model.to_string().to_lowercase(); let suffix = format!("{}:{}", model, self.serial); @@ -77,16 +80,18 @@ impl SecretEntry for PinEntry { PinType::Admin => format!("nitrocli:admin:{}", suffix), PinType::User => format!("nitrocli:user:{}", suffix), } + .into() } - fn prompt(&self) -> &'static str { + fn prompt(&self) -> CowStr { match self.pin_type { PinType::Admin => "Admin PIN", PinType::User => "User PIN", } + .into() } - fn description(&self, mode: Mode) -> String { + fn description(&self, mode: Mode) -> CowStr { format!( "{} for\rNitrokey {} {}", match self.pin_type { @@ -104,6 +109,7 @@ impl SecretEntry for PinEntry { self.model, self.serial, ) + .into() } } @@ -167,7 +173,7 @@ pub fn inquire<E>(entry: &E, mode: Mode, error_msg: Option<&str>) -> crate::Resu where E: SecretEntry, { - let cache_id = entry.cache_id(); + let cache_id = entry.cache_id().into(); let error_msg = error_msg .map(|msg| msg.replace(" ", "+")) .unwrap_or_else(|| String::from("+")); |