commit 7a884f4560d54a23691d62f7d1d09b8e8e18d8ed
parent 7ea5a73494875aa02eb2ee9603699caac620d86a
Author: triesap <tyson@radroots.org>
Date: Thu, 2 Apr 2026 19:10:53 +0000
nip46: return effective remote session capability
Diffstat:
2 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/src/policy.rs b/src/policy.rs
@@ -515,6 +515,7 @@ fn required_permission_for_request(
match request {
RadrootsNostrConnectRequest::Connect { .. }
| RadrootsNostrConnectRequest::GetPublicKey
+ | RadrootsNostrConnectRequest::GetSessionCapability
| RadrootsNostrConnectRequest::Ping => None,
RadrootsNostrConnectRequest::SignEvent(unsigned_event) => {
Some(RadrootsNostrConnectPermission::with_parameter(
@@ -584,6 +585,7 @@ fn request_requires_auth(request: &RadrootsNostrConnectRequest) -> bool {
request,
RadrootsNostrConnectRequest::Connect { .. }
| RadrootsNostrConnectRequest::GetPublicKey
+ | RadrootsNostrConnectRequest::GetSessionCapability
| RadrootsNostrConnectRequest::Ping
)
}
diff --git a/src/transport/nip46.rs b/src/transport/nip46.rs
@@ -121,6 +121,7 @@ impl MycNip46Handler {
self.handle_crypto_request(client_public_key, request_message)
}
RadrootsNostrConnectRequest::GetPublicKey
+ | RadrootsNostrConnectRequest::GetSessionCapability
| RadrootsNostrConnectRequest::Ping
| RadrootsNostrConnectRequest::SwitchRelays => {
self.handle_base_request(client_public_key, request_message)
@@ -448,6 +449,7 @@ impl MycNip46Handler {
}
},
RadrootsNostrConnectRequest::GetPublicKey
+ | RadrootsNostrConnectRequest::GetSessionCapability
| RadrootsNostrConnectRequest::Ping
| RadrootsNostrConnectRequest::SwitchRelays => match evaluation.action {
RadrootsNostrSignerRequestAction::Denied { reason } => {
@@ -1135,6 +1137,9 @@ fn response_from_hint(
RadrootsNostrSignerRequestResponseHint::UserPublicKey(public_key) => {
RadrootsNostrConnectResponse::UserPublicKey(public_key)
}
+ RadrootsNostrSignerRequestResponseHint::RemoteSessionCapability(capability) => {
+ RadrootsNostrConnectResponse::RemoteSessionCapability(capability)
+ }
RadrootsNostrSignerRequestResponseHint::RelayList(relays) => {
if relays == connection.relays {
RadrootsNostrConnectResponse::RelayList(relays)
@@ -1979,6 +1984,29 @@ mod tests {
runtime.transport().expect("transport").relays().to_vec()
)
);
+
+ let capability = handler
+ .handle_request_response(
+ client_keys().public_key(),
+ RadrootsNostrConnectRequestMessage::new(
+ "req-capability",
+ RadrootsNostrConnectRequest::GetSessionCapability,
+ ),
+ )
+ .expect("get session capability");
+ assert_eq!(
+ capability,
+ RadrootsNostrConnectResponse::RemoteSessionCapability(
+ radroots_nostr_connect::prelude::RadrootsNostrConnectRemoteSessionCapability {
+ user_public_key: runtime.user_identity().public_key(),
+ relays: runtime.transport().expect("transport").relays().to_vec(),
+ permissions: vec![RadrootsNostrConnectPermission::new(
+ RadrootsNostrConnectMethod::SwitchRelays,
+ )]
+ .into(),
+ },
+ )
+ );
}
#[test]