keyfork-{shard,prompt}: add Yes/No prompt for verifying QR codes

This commit is contained in:
Ryan Heywood 2025-04-18 17:12:28 -04:00
parent 739921d915
commit e7be91bdd4
Signed by: ryan
GPG Key ID: 8E401478A3FBEF72
2 changed files with 42 additions and 4 deletions

View File

@ -23,7 +23,7 @@ use keyfork_prompt::{
mnemonic::{MnemonicSetValidator, MnemonicValidator, WordLength}, mnemonic::{MnemonicSetValidator, MnemonicValidator, WordLength},
Validator, Validator,
}, },
Message as PromptMessage, PromptHandler, Message as PromptMessage, PromptHandler, YesNo,
}; };
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
use x25519_dalek::{EphemeralSecret, PublicKey}; use x25519_dalek::{EphemeralSecret, PublicKey};
@ -300,9 +300,19 @@ pub trait Format {
let small_mnemonic = Mnemonic::from_raw_bytes(small_sum); let small_mnemonic = Mnemonic::from_raw_bytes(small_sum);
let mut prompt = prompt.lock().expect(bug!(POISONED_MUTEX)); let mut prompt = prompt.lock().expect(bug!(POISONED_MUTEX));
prompt.prompt_message(PromptMessage::Text(format!( let question =
"Is THIS your card???? If not, press ctrl+c!: {small_mnemonic}" format!("Do these words match the expected words? {small_mnemonic}");
)))?; let response = keyfork_prompt::prompt_choice(
&mut **prompt,
&question,
&[YesNo::No, YesNo::Yes],
)?;
if response == YesNo::No {
prompt.prompt_message(PromptMessage::Text(String::from(
"Could not establish secure channel, exiting.",
)))?;
std::process::exit(1);
}
pubkey_data = Some(data); pubkey_data = Some(data);
break; break;

View File

@ -83,6 +83,34 @@ impl<T: Choice> Choice for &T {
} }
} }
/// A Yes/No Choice.
#[derive(PartialEq, Eq, Clone, Copy)]
pub enum YesNo {
/// Yes.
Yes,
/// No.
No,
}
impl std::fmt::Display for YesNo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
YesNo::Yes => f.write_str("Yes"),
YesNo::No => f.write_str("No"),
}
}
}
impl Choice for YesNo {
fn identifier(&self) -> Option<char> {
match self {
YesNo::Yes => Some('y'),
YesNo::No => Some('n'),
}
}
}
#[doc(hidden)] #[doc(hidden)]
pub type BoxResult = std::result::Result<(), Box<dyn std::error::Error>>; pub type BoxResult = std::result::Result<(), Box<dyn std::error::Error>>;