From 9fd668bb8275c04e0064f379b1a2ded253d98a06 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Fri, 6 Jan 2023 02:40:35 +1300 Subject: [PATCH] Simplify UI for importing private key (no separation between hex and bech32, autodetected) --- src/overlord/mod.rs | 43 ++++++++++++++++++--------------------- src/ui/mod.rs | 6 ++---- src/ui/you.rs | 49 +++++++++------------------------------------ 3 files changed, 31 insertions(+), 67 deletions(-) diff --git a/src/overlord/mod.rs b/src/overlord/mod.rs index 599ac99a..38fe2196 100644 --- a/src/overlord/mod.rs +++ b/src/overlord/mod.rs @@ -416,31 +416,26 @@ impl Overlord { password.zeroize(); GLOBALS.signer.read().await.save_through_settings().await?; } - "import_bech32" => { - let (mut import_bech32, mut password): (String, String) = + "import_priv" => { + let (mut import_priv, mut password): (String, String) = serde_json::from_str(&bus_message.json_payload)?; - let pk = PrivateKey::try_from_bech32_string(&import_bech32)?; - import_bech32.zeroize(); - GLOBALS - .signer - .write() - .await - .set_private_key(pk, &password)?; - password.zeroize(); - GLOBALS.signer.read().await.save_through_settings().await?; - } - "import_hex" => { - let (mut import_hex, mut password): (String, String) = - serde_json::from_str(&bus_message.json_payload)?; - let pk = PrivateKey::try_from_hex_string(&import_hex)?; - import_hex.zeroize(); - GLOBALS - .signer - .write() - .await - .set_private_key(pk, &password)?; - password.zeroize(); - GLOBALS.signer.read().await.save_through_settings().await?; + let maybe_pk1 = PrivateKey::try_from_bech32_string(&import_priv); + let maybe_pk2 = PrivateKey::try_from_hex_string(&import_priv); + import_priv.zeroize(); + if maybe_pk1.is_err() && maybe_pk2.is_err() { + password.zeroize(); + *GLOBALS.status_message.write().await = + "Private key not recognized.".to_owned(); + } else { + let privkey = maybe_pk1.unwrap_or_else(|_| maybe_pk2.unwrap()); + GLOBALS + .signer + .write() + .await + .set_private_key(privkey, &password)?; + password.zeroize(); + GLOBALS.signer.read().await.save_through_settings().await?; + } } "import_pub" => { let pubstr: String = serde_json::from_str(&bus_message.json_payload)?; diff --git a/src/ui/mod.rs b/src/ui/mod.rs index dc4d662a..41572696 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -82,8 +82,7 @@ struct GossipUi { follow_hex_pubkey: String, follow_pubkey_at_relay: String, password: String, - import_bech32: String, - import_hex: String, + import_priv: String, import_pub: String, replying_to: Option, person_view_pubkey: Option, @@ -153,8 +152,7 @@ impl GossipUi { follow_hex_pubkey: "".to_owned(), follow_pubkey_at_relay: "".to_owned(), password: "".to_owned(), - import_bech32: "".to_owned(), - import_hex: "".to_owned(), + import_priv: "".to_owned(), import_pub: "".to_owned(), replying_to: None, person_view_pubkey: None, diff --git a/src/ui/you.rs b/src/ui/you.rs index d3e95448..a3cb0e8f 100644 --- a/src/ui/you.rs +++ b/src/ui/you.rs @@ -172,13 +172,13 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.separator(); ui.add_space(10.0); - ui.heading("Import a bech32 private key"); + ui.heading("Import a Private Key"); ui.horizontal(|ui| { - ui.label("Enter bech32 private key"); + ui.label("Enter private key"); ui.add( - TextEdit::singleline(&mut app.import_bech32) - .hint_text("nsec1...") + TextEdit::singleline(&mut app.import_priv) + .hint_text("nsec1 or hex") .password(true), ); }); @@ -190,40 +190,11 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr let tx = GLOBALS.to_overlord.clone(); let _ = tx.send(BusMessage { target: "overlord".to_string(), - kind: "import_bech32".to_string(), - json_payload: serde_json::to_string(&(&app.import_bech32, &app.password)).unwrap(), + kind: "import_priv".to_string(), + json_payload: serde_json::to_string(&(&app.import_priv, &app.password)).unwrap(), }); - app.import_bech32.zeroize(); - app.import_bech32 = "".to_owned(); - app.password.zeroize(); - app.password = "".to_owned(); - } - - ui.add_space(20.0); - - ui.heading("Import a hex private key"); - - ui.horizontal(|ui| { - ui.label("Enter hex-encoded private key"); - ui.add( - TextEdit::singleline(&mut app.import_hex) - .hint_text("0123456789abcdef...") - .password(true), - ); - }); - ui.horizontal(|ui| { - ui.label("Enter a password to keep it encrypted under"); - ui.add(TextEdit::singleline(&mut app.password).password(true)); - }); - if ui.button("import").clicked() { - let tx = GLOBALS.to_overlord.clone(); - let _ = tx.send(BusMessage { - target: "overlord".to_string(), - kind: "import_hex".to_string(), - json_payload: serde_json::to_string(&(&app.import_hex, &app.password)).unwrap(), - }); - app.import_hex.zeroize(); - app.import_hex = "".to_owned(); + app.import_priv.zeroize(); + app.import_priv = "".to_owned(); app.password.zeroize(); app.password = "".to_owned(); } @@ -232,10 +203,10 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.separator(); ui.add_space(10.0); - ui.heading("Public Key"); + ui.heading("Import a Public Key"); ui.add_space(10.0); - ui.label("You can just import your public key if you only want to view events and don't want to use gossip to create events. This will allow you to (eventually) sync your follow list and follow people on gossip without copying your private key here."); + ui.label("This won't let you post or react to posts, but you can view other people's posts (and fetch your following list) with just a public key."); if let Some(pk) = GLOBALS.signer.blocking_read().public_key() { let pkhex: PublicKeyHex = pk.into();