radrootsd

JSON-RPC bridge for Radroots event publishing
git clone https://radroots.dev/git/radrootsd.git
Log | Files | Refs | README | LICENSE

commit b9f53411f42a6e1eb50f29d376bd9298c9ef97c0
parent d7958d479b1d338b43dc488dcb21361361cdfd31
Author: triesap <triesap@radroots.dev>
Date:   Wed,  7 Jan 2026 15:27:28 +0000

nip46: fix session type imports

- import Nip46Session in get_public_key handler
- import Nip46Session in ping handler
- keep helper signatures explicit
- resolve jsonrpc nip46 compile errors

Diffstat:
Msrc/transport/jsonrpc/methods/nip46/get_public_key.rs | 11+++--------
Msrc/transport/jsonrpc/methods/nip46/nip04.rs | 29+++++------------------------
Msrc/transport/jsonrpc/methods/nip46/nip44.rs | 29+++++------------------------
Msrc/transport/jsonrpc/methods/nip46/ping.rs | 11+++--------
Msrc/transport/jsonrpc/methods/nip46/session_status.rs | 8++------
Msrc/transport/jsonrpc/methods/nip46/sign_event.rs | 18+++---------------
Msrc/transport/jsonrpc/nip46/mod.rs | 1+
Asrc/transport/jsonrpc/nip46/session.rs | 21+++++++++++++++++++++
8 files changed, 43 insertions(+), 85 deletions(-)

diff --git a/src/transport/jsonrpc/methods/nip46/get_public_key.rs b/src/transport/jsonrpc/methods/nip46/get_public_key.rs @@ -2,9 +2,9 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; -use crate::core::nip46::session::Nip46Session; +use crate::core::nip46::Nip46Session; +use crate::transport::jsonrpc::nip46::{client, session}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; -use crate::transport::jsonrpc::nip46::client; use nostr::nips::nip46::{NostrConnectMethod, NostrConnectRequest, ResponseResult}; #[derive(Debug, Deserialize)] @@ -23,12 +23,7 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res let Nip46GetPublicKeyParams { session_id } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; + let session = session::get_session(ctx.as_ref(), &session_id).await?; let (pubkey, updated) = request_get_public_key(&session).await?; if updated { if !ctx diff --git a/src/transport/jsonrpc/methods/nip46/nip04.rs b/src/transport/jsonrpc/methods/nip46/nip04.rs @@ -2,8 +2,7 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; -use crate::core::nip46::session::Nip46Session; -use crate::transport::jsonrpc::nip46::client; +use crate::transport::jsonrpc::nip46::{client, session}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; use nostr::nips::nip46::{NostrConnectMethod, NostrConnectRequest, ResponseResult}; @@ -41,15 +40,8 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; - if !has_permission(&session, "nip04_encrypt") { - return Err(RpcError::Other("unauthorized nip04_encrypt".to_string())); - } + let session = session::get_session(ctx.as_ref(), &session_id).await?; + session::require_permission(&session, "nip04_encrypt")?; let public_key = radroots_nostr::prelude::radroots_nostr_parse_pubkey(&public_key) .map_err(|e| RpcError::InvalidParams(format!("invalid public_key: {e}")))?; let req = NostrConnectRequest::Nip04Encrypt { public_key, text }; @@ -88,15 +80,8 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; - if !has_permission(&session, "nip04_decrypt") { - return Err(RpcError::Other("unauthorized nip04_decrypt".to_string())); - } + let session = session::get_session(ctx.as_ref(), &session_id).await?; + session::require_permission(&session, "nip04_decrypt")?; let public_key = radroots_nostr::prelude::radroots_nostr_parse_pubkey(&public_key) .map_err(|e| RpcError::InvalidParams(format!("invalid public_key: {e}")))?; let req = NostrConnectRequest::Nip04Decrypt { @@ -131,7 +116,3 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res Ok(()) } - -fn has_permission(session: &Nip46Session, perm: &str) -> bool { - session.perms.iter().any(|entry| entry == perm) -} diff --git a/src/transport/jsonrpc/methods/nip46/nip44.rs b/src/transport/jsonrpc/methods/nip46/nip44.rs @@ -2,8 +2,7 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; -use crate::core::nip46::session::Nip46Session; -use crate::transport::jsonrpc::nip46::client; +use crate::transport::jsonrpc::nip46::{client, session}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; use nostr::nips::nip46::{NostrConnectMethod, NostrConnectRequest, ResponseResult}; @@ -41,15 +40,8 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; - if !has_permission(&session, "nip44_encrypt") { - return Err(RpcError::Other("unauthorized nip44_encrypt".to_string())); - } + let session = session::get_session(ctx.as_ref(), &session_id).await?; + session::require_permission(&session, "nip44_encrypt")?; let public_key = radroots_nostr::prelude::radroots_nostr_parse_pubkey(&public_key) .map_err(|e| RpcError::InvalidParams(format!("invalid public_key: {e}")))?; let req = NostrConnectRequest::Nip44Encrypt { public_key, text }; @@ -88,15 +80,8 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; - if !has_permission(&session, "nip44_decrypt") { - return Err(RpcError::Other("unauthorized nip44_decrypt".to_string())); - } + let session = session::get_session(ctx.as_ref(), &session_id).await?; + session::require_permission(&session, "nip44_decrypt")?; let public_key = radroots_nostr::prelude::radroots_nostr_parse_pubkey(&public_key) .map_err(|e| RpcError::InvalidParams(format!("invalid public_key: {e}")))?; let req = NostrConnectRequest::Nip44Decrypt { @@ -131,7 +116,3 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res Ok(()) } - -fn has_permission(session: &Nip46Session, perm: &str) -> bool { - session.perms.iter().any(|entry| entry == perm) -} diff --git a/src/transport/jsonrpc/methods/nip46/ping.rs b/src/transport/jsonrpc/methods/nip46/ping.rs @@ -2,9 +2,9 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; -use crate::core::nip46::session::Nip46Session; +use crate::core::nip46::Nip46Session; +use crate::transport::jsonrpc::nip46::{client, session}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; -use crate::transport::jsonrpc::nip46::client; use nostr::nips::nip46::{NostrConnectMethod, NostrConnectRequest, ResponseResult}; #[derive(Debug, Deserialize)] @@ -23,12 +23,7 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res let Nip46PingParams { session_id } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; + let session = session::get_session(ctx.as_ref(), &session_id).await?; Ok::<Nip46PingResponse, RpcError>(Nip46PingResponse { result: request_ping(&session).await?, }) diff --git a/src/transport/jsonrpc/methods/nip46/session_status.rs b/src/transport/jsonrpc/methods/nip46/session_status.rs @@ -2,6 +2,7 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; +use crate::transport::jsonrpc::nip46::session; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; #[derive(Debug, Deserialize)] @@ -28,12 +29,7 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res let Nip46SessionStatusParams { session_id } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; + let session = session::get_session(ctx.as_ref(), &session_id).await?; Ok::<Nip46SessionStatusResponse, RpcError>(Nip46SessionStatusResponse { session_id, client_pubkey: session.client_pubkey.to_hex(), diff --git a/src/transport/jsonrpc/methods/nip46/sign_event.rs b/src/transport/jsonrpc/methods/nip46/sign_event.rs @@ -2,8 +2,7 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use serde::{Deserialize, Serialize}; -use crate::core::nip46::session::Nip46Session; -use crate::transport::jsonrpc::nip46::client; +use crate::transport::jsonrpc::nip46::{client, session}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; use nostr::UnsignedEvent; @@ -24,15 +23,8 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res let Nip46SignEventParams { session_id, event } = params .parse() .map_err(|e| RpcError::InvalidParams(e.to_string()))?; - let session = ctx - .state - .nip46_sessions - .get(&session_id) - .await - .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; - if !has_permission(&session, "sign_event") { - return Err(RpcError::Other("unauthorized sign_event".to_string())); - } + let session = session::get_session(ctx.as_ref(), &session_id).await?; + session::require_permission(&session, "sign_event")?; if event.pubkey != session.remote_signer_pubkey { return Err(RpcError::InvalidParams( "event pubkey does not match remote signer".to_string(), @@ -43,7 +35,3 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res })?; Ok(()) } - -fn has_permission(session: &Nip46Session, perm: &str) -> bool { - session.perms.iter().any(|entry| entry == perm) -} diff --git a/src/transport/jsonrpc/nip46/mod.rs b/src/transport/jsonrpc/nip46/mod.rs @@ -1,2 +1,3 @@ pub mod client; pub mod connection; +pub mod session; diff --git a/src/transport/jsonrpc/nip46/session.rs b/src/transport/jsonrpc/nip46/session.rs @@ -0,0 +1,21 @@ +use crate::core::nip46::session::Nip46Session; +use crate::transport::jsonrpc::{RpcContext, RpcError}; + +pub async fn get_session( + ctx: &RpcContext, + session_id: &str, +) -> Result<Nip46Session, RpcError> { + ctx.state + .nip46_sessions + .get(session_id) + .await + .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string())) +} + +pub fn require_permission(session: &Nip46Session, perm: &str) -> Result<(), RpcError> { + if session.perms.iter().any(|entry| entry == perm) { + Ok(()) + } else { + Err(RpcError::Other(format!("unauthorized {perm}"))) + } +}