radrootsd

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

session_authorize.rs (2032B)


      1 #![forbid(unsafe_code)]
      2 
      3 use anyhow::Result;
      4 use jsonrpsee::server::RpcModule;
      5 use serde::{Deserialize, Serialize};
      6 
      7 use nostr::nips::nip46::NostrConnectMessage;
      8 
      9 use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError};
     10 use crate::transport::nostr::protocol::sign_nip46_message;
     11 
     12 #[derive(Debug, Deserialize)]
     13 struct Nip46SessionAuthorizeParams {
     14     session_id: String,
     15 }
     16 
     17 #[derive(Clone, Debug, Serialize)]
     18 struct Nip46SessionAuthorizeResponse {
     19     authorized: bool,
     20     replayed: bool,
     21 }
     22 
     23 pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> {
     24     registry.track("nip46.session.authorize");
     25     m.register_async_method("nip46.session.authorize", |params, ctx, _| async move {
     26         let Nip46SessionAuthorizeParams { session_id } = params
     27             .parse()
     28             .map_err(|e| RpcError::InvalidParams(e.to_string()))?;
     29         let outcome = ctx
     30             .state
     31             .nip46_sessions
     32             .authorize(&session_id)
     33             .await
     34             .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?;
     35         let mut replayed = false;
     36         if let Some(pending) = outcome.pending {
     37             let response = crate::transport::nostr::listener::handle_request(
     38                 &ctx.state,
     39                 &pending.client_pubkey,
     40                 &pending.request_id,
     41                 pending.request,
     42             )
     43             .await;
     44             let message = NostrConnectMessage::response(pending.request_id, response);
     45             let response_event =
     46                 sign_nip46_message(&ctx.state.keys, pending.client_pubkey, message).map_err(
     47                     |err| RpcError::Other(format!("nip46 response build failed: {err}")),
     48                 )?;
     49             let _ = ctx.state.client.send_event(&response_event).await;
     50             replayed = true;
     51         }
     52         Ok::<Nip46SessionAuthorizeResponse, RpcError>(Nip46SessionAuthorizeResponse {
     53             authorized: true,
     54             replayed,
     55         })
     56     })?;
     57     Ok(())
     58 }