feat: save user key to keyring

This commit is contained in:
2024-11-21 09:03:48 +07:00
parent c60a37a245
commit 126506522d
6 changed files with 31 additions and 7 deletions

View File

@@ -27,3 +27,9 @@ chrono = "0.4.38"
tracing = "0.1.40"
anyhow = "1.0.44"
smallvec = "1.13.2"
keyring-search = "1.2.0"
keyring = { version = "3", features = [
"apple-native",
"windows-native",
"sync-secret-service",
] }

View File

@@ -8,3 +8,5 @@ gpui.workspace = true
nostr-sdk.workspace = true
dirs.workspace = true
tokio.workspace = true
keyring-search.workspace = true
keyring.workspace = true

View File

@@ -1,4 +1,5 @@
use gpui::Global;
use keyring::Entry;
use nostr_sdk::prelude::*;
use state::get_client;
@@ -17,4 +18,15 @@ impl NostrClient {
Self { client }
}
pub fn add_account(&self, keys: Keys) -> Result<()> {
let public_key = keys.public_key().to_bech32()?;
let secret = keys.secret_key().to_secret_hex();
let entry = Entry::new("Coop Safe Storage", &public_key)?;
// Add secret to keyring
entry.set_password(&secret)?;
Ok(())
}
}

View File

@@ -13,8 +13,7 @@ gpui.workspace = true
components.workspace = true
tokio.workspace = true
nostr-sdk.workspace = true
keyring-search.workspace = true
keyring.workspace = true
client = { version = "0.1.0", path = "../client" }
keyring-search = "1.2.0"
keyring-lib = { version = "1.0.2", features = ["tokio", "derive"] }

View File

@@ -4,7 +4,7 @@ use std::collections::HashSet;
pub fn get_all_accounts_from_keyring() -> HashSet<PublicKey> {
let search = Search::new().expect("Keyring not working.");
let results = search.by_service("coop");
let results = search.by_service("Coop Safe Storage");
let list = List::list_credentials(&results, Limit::All);
let accounts: HashSet<PublicKey> = list
.split_whitespace()

View File

@@ -1,3 +1,4 @@
use ::client::NostrClient;
use components::{
input::{InputEvent, TextInput},
label::Label,
@@ -23,9 +24,13 @@ impl SetupView {
if let InputEvent::PressEnter = input_event {
let content = text_input.read(cx).text().to_string();
if let Ok(public_key) = PublicKey::parse(content) {
cx.global_mut::<AppState>().accounts.insert(public_key);
cx.notify();
if let Ok(keys) = Keys::parse(content) {
let public_key = keys.public_key();
if cx.global::<NostrClient>().add_account(keys).is_ok() {
cx.global_mut::<AppState>().accounts.insert(public_key);
cx.notify();
}
};
}
})