chore: update nostr-sdk and nostr-connect

This commit is contained in:
2024-11-01 09:57:46 +07:00
parent 18e1ac0e6c
commit d37e2a3c80
4 changed files with 67 additions and 74 deletions

45
src-tauri/Cargo.lock generated
View File

@@ -17,6 +17,7 @@ dependencies = [
"keyring", "keyring",
"keyring-search", "keyring-search",
"linkify", "linkify",
"nostr-connect",
"nostr-sdk", "nostr-sdk",
"regex", "regex",
"reqwest", "reqwest",
@@ -3480,9 +3481,10 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
[[package]] [[package]]
name = "nostr" name = "nostr"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"aes", "aes",
"async-trait",
"base64 0.22.1", "base64 0.22.1",
"bech32", "bech32",
"bip39", "bip39",
@@ -3507,10 +3509,24 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "nostr-connect"
version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [
"async-trait",
"async-utility",
"nostr",
"nostr-relay-pool",
"thiserror",
"tokio",
"tracing",
]
[[package]] [[package]]
name = "nostr-database" name = "nostr-database"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"flatbuffers", "flatbuffers",
@@ -3524,7 +3540,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-lmdb" name = "nostr-lmdb"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"heed", "heed",
"nostr", "nostr",
@@ -3537,7 +3553,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-relay-pool" name = "nostr-relay-pool"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"async-wsocket", "async-wsocket",
@@ -3555,7 +3571,7 @@ dependencies = [
[[package]] [[package]]
name = "nostr-sdk" name = "nostr-sdk"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"async-utility", "async-utility",
"atomic-destructor", "atomic-destructor",
@@ -3564,7 +3580,6 @@ dependencies = [
"nostr-database", "nostr-database",
"nostr-lmdb", "nostr-lmdb",
"nostr-relay-pool", "nostr-relay-pool",
"nostr-signer",
"nostr-zapper", "nostr-zapper",
"nwc", "nwc",
"thiserror", "thiserror",
@@ -3572,23 +3587,10 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "nostr-signer"
version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94"
dependencies = [
"async-utility",
"nostr",
"nostr-relay-pool",
"thiserror",
"tokio",
"tracing",
]
[[package]] [[package]]
name = "nostr-zapper" name = "nostr-zapper"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"nostr", "nostr",
@@ -3732,8 +3734,9 @@ dependencies = [
[[package]] [[package]]
name = "nwc" name = "nwc"
version = "0.35.0" version = "0.35.0"
source = "git+https://github.com/rust-nostr/nostr#939ebbdbc0b7c605411676e810c775ac3d80ef94" source = "git+https://github.com/rust-nostr/nostr#0ffae5b49f14d88d704fdd804969302533b5c576"
dependencies = [ dependencies = [
"async-trait",
"async-utility", "async-utility",
"nostr", "nostr",
"nostr-relay-pool", "nostr-relay-pool",

View File

@@ -34,6 +34,7 @@ tauri-plugin-decorum = { git = "https://github.com/clearlysid/tauri-plugin-decor
tauri-specta = { version = "2.0.0-rc.15", features = ["derive", "typescript"] } tauri-specta = { version = "2.0.0-rc.15", features = ["derive", "typescript"] }
nostr-sdk = { git = "https://github.com/rust-nostr/nostr", features = ["lmdb"] } nostr-sdk = { git = "https://github.com/rust-nostr/nostr", features = ["lmdb"] }
nostr-connect = { git = "https://github.com/rust-nostr/nostr" }
specta = "^2.0.0-rc.20" specta = "^2.0.0-rc.20"
specta-typescript = "0.0.7" specta-typescript = "0.0.7"

View File

@@ -1,4 +1,5 @@
use keyring::Entry; use keyring::Entry;
use nostr_connect::prelude::*;
use nostr_sdk::prelude::*; use nostr_sdk::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use specta::Type; use specta::Type;
@@ -61,7 +62,6 @@ pub async fn import_account(
let public_key = keys.public_key(); let public_key = keys.public_key();
let npub = public_key.to_bech32().map_err(|err| err.to_string())?; let npub = public_key.to_bech32().map_err(|err| err.to_string())?;
let signer = NostrSigner::Keys(keys);
let keyring = Entry::new("Lume Safe Storage", &npub).map_err(|e| e.to_string())?; let keyring = Entry::new("Lume Safe Storage", &npub).map_err(|e| e.to_string())?;
let account = Account { let account = Account {
@@ -74,12 +74,7 @@ pub async fn import_account(
keyring.set_password(&pwd).map_err(|e| e.to_string())?; keyring.set_password(&pwd).map_err(|e| e.to_string())?;
// Update signer // Update signer
client.set_signer(Some(signer)).await; client.set_signer(keys).await;
// Get user's profile
let _ = client
.fetch_metadata(public_key, Some(Duration::from_secs(4)))
.await;
Ok(npub) Ok(npub)
} }
@@ -88,32 +83,30 @@ pub async fn import_account(
#[specta::specta] #[specta::specta]
pub async fn connect_account(uri: String, state: State<'_, Nostr>) -> Result<String, String> { pub async fn connect_account(uri: String, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client; let client = &state.client;
let bunker_uri = NostrConnectURI::parse(&uri).map_err(|err| err.to_string())?;
match NostrConnectURI::parse(uri.clone()) {
Ok(bunker_uri) => {
// Local user // Local user
let app_keys = Keys::generate(); let app_keys = Keys::generate();
let app_secret = app_keys.secret_key().to_secret_hex(); let app_secret = app_keys.secret_key().to_secret_hex();
// Get remote user // Get remote user
let remote_user = bunker_uri.signer_public_key().unwrap(); let remote_user = bunker_uri.remote_signer_public_key().unwrap();
let remote_npub = remote_user.to_bech32().unwrap(); let remote_npub = remote_user.to_bech32().map_err(|err| err.to_string())?;
match Nip46Signer::new(bunker_uri, app_keys, Duration::from_secs(120), None) { // Init nostr connect
Ok(signer) => { let nostr_connect = NostrConnect::new(bunker_uri, app_keys, Duration::from_secs(120), None)
let mut url = Url::parse(&uri).unwrap(); .map_err(|err| err.to_string())?;
let query: Vec<(String, String)> = url
.query_pairs() let bunker_uri = nostr_connect
.filter(|(name, _)| name != "secret") .bunker_uri()
.map(|(name, value)| (name.into_owned(), value.into_owned())) .await
.collect(); .map_err(|err| err.to_string())?;
url.query_pairs_mut().clear().extend_pairs(&query);
let keyring = Entry::new("Lume Safe Storage", &remote_npub).map_err(|err| err.to_string())?;
let key = format!("{}_nostrconnect", remote_npub);
let keyring = Entry::new("Lume Safe Storage", &key).unwrap();
let account = Account { let account = Account {
secret_key: app_secret, secret_key: app_secret,
nostr_connect: Some(url.to_string()), nostr_connect: Some(bunker_uri.to_string()),
}; };
// Save secret key to keyring // Save secret key to keyring
@@ -121,20 +114,9 @@ pub async fn connect_account(uri: String, state: State<'_, Nostr>) -> Result<Str
keyring.set_password(&pwd).map_err(|e| e.to_string())?; keyring.set_password(&pwd).map_err(|e| e.to_string())?;
// Update signer // Update signer
let _ = client.set_signer(Some(signer.into())).await; let _ = client.set_signer(nostr_connect).await;
// Get user's profile
let _ = client
.fetch_metadata(remote_user, Some(Duration::from_secs(4)))
.await;
Ok(remote_npub) Ok(remote_npub)
}
Err(err) => Err(err.to_string()),
}
}
Err(err) => Err(err.to_string()),
}
} }
#[tauri::command] #[tauri::command]
@@ -186,7 +168,7 @@ pub async fn has_signer(id: String, state: State<'_, Nostr>) -> Result<bool, Str
match client.signer().await { match client.signer().await {
Ok(signer) => { Ok(signer) => {
let signer_key = signer.public_key().await.map_err(|e| e.to_string())?; let signer_key = signer.get_public_key().await.map_err(|e| e.to_string())?;
let is_match = signer_key == public_key; let is_match = signer_key == public_key;
Ok(is_match) Ok(is_match)
@@ -222,10 +204,9 @@ pub async fn set_signer(
None => { None => {
let secret_key = SecretKey::from_str(&account.secret_key).map_err(|e| e.to_string())?; let secret_key = SecretKey::from_str(&account.secret_key).map_err(|e| e.to_string())?;
let keys = Keys::new(secret_key); let keys = Keys::new(secret_key);
let signer = NostrSigner::Keys(keys);
// Update signer // Update signer
client.set_signer(Some(signer)).await; client.set_signer(keys).await;
// Emit to front-end // Emit to front-end
handle.emit("signer-updated", ()).unwrap(); handle.emit("signer-updated", ()).unwrap();
@@ -235,10 +216,10 @@ pub async fn set_signer(
let uri = NostrConnectURI::parse(bunker).map_err(|e| e.to_string())?; let uri = NostrConnectURI::parse(bunker).map_err(|e| e.to_string())?;
let app_keys = Keys::from_str(&account.secret_key).map_err(|e| e.to_string())?; let app_keys = Keys::from_str(&account.secret_key).map_err(|e| e.to_string())?;
match Nip46Signer::new(uri, app_keys, Duration::from_secs(120), None) { match NostrConnect::new(uri, app_keys, Duration::from_secs(120), None) {
Ok(signer) => { Ok(signer) => {
// Update signer // Update signer
client.set_signer(Some(signer.into())).await; client.set_signer(signer).await;
// Emit to front-end // Emit to front-end
handle.emit("signer-updated", ()).unwrap(); handle.emit("signer-updated", ()).unwrap();

View File

@@ -402,7 +402,10 @@ pub async fn repost(raw: String, state: State<'_, Nostr>) -> Result<String, Stri
pub async fn is_reposted(id: String, state: State<'_, Nostr>) -> Result<bool, String> { pub async fn is_reposted(id: String, state: State<'_, Nostr>) -> Result<bool, String> {
let client = &state.client; let client = &state.client;
let signer = client.signer().await.map_err(|err| err.to_string())?; let signer = client.signer().await.map_err(|err| err.to_string())?;
let public_key = signer.public_key().await.map_err(|err| err.to_string())?; let public_key = signer
.get_public_key()
.await
.map_err(|err| err.to_string())?;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?; let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
@@ -434,8 +437,13 @@ pub async fn request_delete(id: String, state: State<'_, Nostr>) -> Result<(), S
pub async fn is_deleted_event(id: String, state: State<'_, Nostr>) -> Result<bool, String> { pub async fn is_deleted_event(id: String, state: State<'_, Nostr>) -> Result<bool, String> {
let client = &state.client; let client = &state.client;
let signer = client.signer().await.map_err(|err| err.to_string())?; let signer = client.signer().await.map_err(|err| err.to_string())?;
let public_key = signer.public_key().await.map_err(|err| err.to_string())?; let public_key = signer
.get_public_key()
.await
.map_err(|err| err.to_string())?;
let event_id = EventId::from_str(&id).map_err(|err| err.to_string())?; let event_id = EventId::from_str(&id).map_err(|err| err.to_string())?;
let filter = Filter::new() let filter = Filter::new()
.author(public_key) .author(public_key)
.event(event_id) .event(event_id)