support cli key
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1369,6 +1369,7 @@ dependencies = [
|
||||
"gpui_platform",
|
||||
"gpui_windows",
|
||||
"log",
|
||||
"nostr-sdk",
|
||||
"person",
|
||||
"reqwest_client",
|
||||
"settings",
|
||||
|
||||
@@ -24,7 +24,7 @@ pub use nip4e::*;
|
||||
pub use nip05::*;
|
||||
pub use signer::{CoopAuthUrlHandler, UniversalSigner};
|
||||
|
||||
pub fn init(window: &mut Window, cx: &mut App) {
|
||||
pub fn init(window: &mut Window, cx: &mut App, cli_key: Option<SecretKey>) {
|
||||
// rustls uses the `aws_lc_rs` provider by default
|
||||
// This only errors if the default provider has already
|
||||
// been installed. We can ignore this `Result`.
|
||||
@@ -37,7 +37,7 @@ pub fn init(window: &mut Window, cx: &mut App) {
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
gpui_tokio::init(cx);
|
||||
|
||||
NostrRegistry::set_global(cx.new(|cx| NostrRegistry::new(window, cx)), cx);
|
||||
NostrRegistry::set_global(cx.new(|cx| NostrRegistry::new(window, cx, cli_key)), cx);
|
||||
}
|
||||
|
||||
struct GlobalNostrRegistry(Entity<NostrRegistry>);
|
||||
@@ -58,16 +58,16 @@ pub enum StateEvent {
|
||||
}
|
||||
|
||||
impl StateEvent {
|
||||
pub fn signer_changed(&self) -> bool {
|
||||
matches!(self, StateEvent::SignerChanged)
|
||||
}
|
||||
|
||||
pub fn error<T>(error: T) -> Self
|
||||
where
|
||||
T: Into<String>,
|
||||
{
|
||||
Self::Error(error.into())
|
||||
}
|
||||
|
||||
pub fn signer_changed(&self) -> bool {
|
||||
matches!(self, StateEvent::SignerChanged)
|
||||
}
|
||||
}
|
||||
|
||||
/// Nostr Registry
|
||||
@@ -100,7 +100,7 @@ impl NostrRegistry {
|
||||
}
|
||||
|
||||
/// Create a new nostr instance
|
||||
fn new(window: &mut Window, cx: &mut Context<Self>) -> Self {
|
||||
fn new(window: &mut Window, cx: &mut Context<Self>, cli_key: Option<SecretKey>) -> Self {
|
||||
let signer = UniversalSigner::new(Keys::generate());
|
||||
let authenticator = SignerAuthenticator::new(signer.clone());
|
||||
|
||||
@@ -133,6 +133,10 @@ impl NostrRegistry {
|
||||
|
||||
if cfg!(target_arch = "wasm32") {
|
||||
cx.emit(StateEvent::NoSigner);
|
||||
} else if let Some(secret) = cli_key {
|
||||
// Use CLI-provided key -- same path as get_user_credential
|
||||
let keys = Keys::new(secret);
|
||||
this.set_signer(keys, cx);
|
||||
} else {
|
||||
this.get_user_credential(cx);
|
||||
}
|
||||
|
||||
@@ -48,3 +48,4 @@ reqwest_client.workspace = true
|
||||
|
||||
log.workspace = true
|
||||
tracing-subscriber.workspace = true
|
||||
nostr-sdk.workspace = true
|
||||
|
||||
@@ -7,6 +7,7 @@ use gpui::{
|
||||
actions, point, px, size,
|
||||
};
|
||||
use gpui_platform::application;
|
||||
use nostr_sdk::prelude::SecretKey;
|
||||
use state::{APP_ID, CLIENT_NAME};
|
||||
use ui::Root;
|
||||
|
||||
@@ -16,6 +17,14 @@ fn main() {
|
||||
// Initialize logging
|
||||
tracing_subscriber::fmt::init();
|
||||
|
||||
// Parse CLI arguments for --sec <nsec1>
|
||||
let cli_key = parse_cli_key();
|
||||
if let Err(ref e) = cli_key {
|
||||
eprintln!("Failed to parse --sec argument: {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
let cli_key = cli_key.unwrap();
|
||||
|
||||
// Run application
|
||||
application()
|
||||
.with_assets(Assets)
|
||||
@@ -75,7 +84,7 @@ fn main() {
|
||||
settings::init(window, cx);
|
||||
|
||||
// Initialize the nostr client
|
||||
state::init(window, cx);
|
||||
state::init(window, cx, cli_key);
|
||||
|
||||
// Initialize person registry
|
||||
person::init(window, cx);
|
||||
@@ -125,6 +134,25 @@ fn load_embedded_fonts(cx: &App) {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn parse_cli_key() -> Result<Option<SecretKey>, String> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
let mut i = 0;
|
||||
while i < args.len() {
|
||||
if args[i] == "--sec" {
|
||||
if i + 1 < args.len() {
|
||||
let nsec = &args[i + 1];
|
||||
return SecretKey::parse(nsec)
|
||||
.map(Some)
|
||||
.map_err(|e| format!("Invalid nsec key '{nsec}': {e}"));
|
||||
} else {
|
||||
return Err("--sec requires a value (nsec1...)".to_string());
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
fn quit(_ev: &Quit, cx: &mut App) {
|
||||
log::info!("Gracefully quitting the application . . .");
|
||||
cx.quit();
|
||||
|
||||
@@ -59,7 +59,7 @@ pub fn run() -> Result<(), JsValue> {
|
||||
settings::init(window, cx);
|
||||
|
||||
// Initialize the nostr client
|
||||
state::init(window, cx);
|
||||
state::init(window, cx, None);
|
||||
|
||||
// Initialize person registry
|
||||
person::init(window, cx);
|
||||
|
||||
Reference in New Issue
Block a user