aboutsummaryrefslogtreecommitdiff
path: root/nitrocli/src/pinentry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'nitrocli/src/pinentry.rs')
-rw-r--r--nitrocli/src/pinentry.rs35
1 files changed, 21 insertions, 14 deletions
diff --git a/nitrocli/src/pinentry.rs b/nitrocli/src/pinentry.rs
index 68cc4aa..1a3982e 100644
--- a/nitrocli/src/pinentry.rs
+++ b/nitrocli/src/pinentry.rs
@@ -38,7 +38,7 @@ 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) -> CowStr;
+ fn cache_id(&self) -> Option<CowStr>;
/// The prompt to display when asking for the secret.
fn prompt(&self) -> CowStr;
/// The description to display when asking for the secret.
@@ -72,15 +72,14 @@ impl PinEntry {
}
impl SecretEntry for PinEntry {
- fn cache_id(&self) -> CowStr {
+ fn cache_id(&self) -> Option<CowStr> {
let model = self.model.to_string().to_lowercase();
let suffix = format!("{}:{}", model, self.serial);
-
- match self.pin_type {
+ let cache_id = match self.pin_type {
PinType::Admin => format!("nitrocli:admin:{}", suffix),
PinType::User => format!("nitrocli:user:{}", suffix),
- }
- .into()
+ };
+ Some(cache_id.into())
}
fn prompt(&self) -> CowStr {
@@ -173,7 +172,11 @@ pub fn inquire<E>(entry: &E, mode: Mode, error_msg: Option<&str>) -> crate::Resu
where
E: SecretEntry,
{
- let cache_id = entry.cache_id().into();
+ let cache_id = entry
+ .cache_id()
+ // "X" is a sentinel value indicating that no caching is desired.
+ .unwrap_or_else(|| "X".into())
+ .into();
let error_msg = error_msg
.map(|msg| msg.replace(" ", "+"))
.unwrap_or_else(|| String::from("+"));
@@ -246,13 +249,17 @@ pub fn clear<E>(entry: &E) -> crate::Result<()>
where
E: SecretEntry,
{
- let command = format!("CLEAR_PASSPHRASE {}", entry.cache_id());
- let output = process::Command::new("gpg-connect-agent")
- .arg(command)
- .arg("/bye")
- .output()?;
-
- parse_pinentry_response(str::from_utf8(&output.stdout)?)
+ if let Some(cache_id) = entry.cache_id() {
+ let command = format!("CLEAR_PASSPHRASE {}", cache_id);
+ let output = process::Command::new("gpg-connect-agent")
+ .arg(command)
+ .arg("/bye")
+ .output()?;
+
+ parse_pinentry_response(str::from_utf8(&output.stdout)?)
+ } else {
+ Ok(())
+ }
}
#[cfg(test)]