aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nitrocli/src/commands.rs2
-rw-r--r--nitrocli/src/pinentry.rs45
2 files changed, 39 insertions, 8 deletions
diff --git a/nitrocli/src/commands.rs b/nitrocli/src/commands.rs
index 47a955d..17c8c8c 100644
--- a/nitrocli/src/commands.rs
+++ b/nitrocli/src/commands.rs
@@ -131,7 +131,7 @@ where
let mut retry = 3;
let mut error_msg = None;
loop {
- let passphrase = match pinentry::inquire_passphrase(pin, error_msg) {
+ let passphrase = match pinentry::inquire_passphrase(pin, pinentry::Mode::Query, error_msg) {
Ok(passphrase) => passphrase,
Err(err) => return Err((data, err)),
};
diff --git a/nitrocli/src/pinentry.rs b/nitrocli/src/pinentry.rs
index 891de38..90986be 100644
--- a/nitrocli/src/pinentry.rs
+++ b/nitrocli/src/pinentry.rs
@@ -48,14 +48,35 @@ impl PinType {
}
}
- fn description(self) -> &'static str {
+ fn description(self, mode: Mode) -> &'static str {
match self {
- PinType::Admin => "Please enter admin PIN",
- PinType::User => "Please enter user PIN",
+ PinType::Admin => match mode {
+ Mode::Query => "Please enter the admin PIN",
+ },
+ PinType::User => match mode {
+ Mode::Query => "Please enter the user PIN",
+ },
}
}
}
+/// PIN entry mode for pinentry.
+///
+/// This enum describes the context of the pinentry query, for example prompting for the current
+/// PIN or requesting a new PIN. The mode may affect the pinentry description and whether a
+/// quality bar is shown.
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum Mode {
+ /// Query an existing PIN.
+ Query,
+}
+
+impl Mode {
+ fn show_quality_bar(self) -> bool {
+ false
+ }
+}
+
fn parse_pinentry_passphrase(response: Vec<u8>) -> Result<Vec<u8>, Error> {
let string = String::from_utf8(response)?;
let lines: Vec<&str> = string.lines().collect();
@@ -83,17 +104,27 @@ fn parse_pinentry_passphrase(response: Vec<u8>) -> Result<Vec<u8>, Error> {
/// Inquire a PIN of the given type from the user.
///
/// This function inquires a PIN of the given type from the user or returns the cached passphrase,
-/// if available. If an error message is set, it is displayed in the passphrase dialog.
-pub fn inquire_passphrase(pin_type: PinType, error_msg: Option<&str>) -> Result<Vec<u8>, Error> {
+/// if available. If an error message is set, it is displayed in the passphrase dialog. The
+/// mode describes the context of the pinentry dialog. It is used to choose an appropriate
+/// description and to decide whether a quality bar is shown in the dialog.
+pub fn inquire_passphrase(
+ pin_type: PinType,
+ mode: Mode,
+ error_msg: Option<&str>,
+) -> Result<Vec<u8>, Error> {
let cache_id = pin_type.cache_id();
let error_msg = error_msg
.map(|msg| msg.replace(" ", "+"))
.unwrap_or_else(|| String::from("+"));
let prompt = pin_type.prompt().replace(" ", "+");
- let description = pin_type.description().replace(" ", "+");
+ let description = pin_type.description(mode).replace(" ", "+");
let args = vec![cache_id, &error_msg, &prompt, &description].join(" ");
- let command = "GET_PASSPHRASE --data ".to_string() + &args;
+ let mut command = "GET_PASSPHRASE --data ".to_string();
+ if mode.show_quality_bar() {
+ command += "--qualitybar ";
+ }
+ command += &args;
// We could also use the --data parameter here to have a more direct
// representation of the passphrase but the resulting response was
// considered more difficult to parse overall. It appears an error