myc

Self-custodial remote signer for Radroots apps
git clone https://radroots.dev/git/myc.git
Log | Files | Refs | README | LICENSE

commit 6010c5c8a94c1c09669506f8d0909b201835885e
parent 3e873414506d509799cc36d1a6c2722e4fb533cc
Author: triesap <tyson@radroots.org>
Date:   Fri, 17 Jul 2026 22:08:43 +0000

build: qualify current NIP-46 dependency baseline

- align the standalone toolchain with Rust 1.97
- refresh the Nix overlay and valid library search paths
- adopt metadata-aware connect constructors and logout policy
- update schema expectations for the qualified signer migration

Diffstat:
MCargo.toml | 2+-
Mflake.lock | 6+++---
Mflake.nix | 11++++++++++-
Mrust-toolchain.toml | 2+-
Msrc/control.rs | 1+
Msrc/policy.rs | 3++-
Msrc/transport/nip46.rs | 17+++++++++++++++++
Mtests/nip46_e2e.rs | 4++++
Mtests/operability_e2e.rs | 2+-
9 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -3,7 +3,7 @@ name = "myc" version = "0.1.0" edition = "2024" authors = ["Radroots Authors"] -rust-version = "1.92.0" +rust-version = "1.97.0" license = "AGPL-3.0-or-later" description = "Radroots NIP-46 remote signer for delegated Nostr accounts" diff --git a/flake.lock b/flake.lock @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1774926780, - "narHash": "sha256-JMdDYn0F+swYBILlpCeHDbCSyzqkeSGNxZ/Q5J584jM=", + "lastModified": 1784265529, + "narHash": "sha256-ohQQiPOngux8ofsrSlloHCMDhRMvocXqJiG8uH45Q5k=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "962a0934d0e32f42d1b5e49186f9595f9b178d2d", + "rev": "068175006cfb69d5b541a140ed93e361488c9e53", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix @@ -42,7 +42,16 @@ ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.darwin.libiconv ]; - libraryPath = pkgs.lib.makeLibraryPath basePackages; + libraryPackages = + [ + pkgs.libsodium + pkgs.openssl + pkgs.sqlite + ] + ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ + pkgs.darwin.libiconv + ]; + libraryPath = pkgs.lib.makeLibraryPath libraryPackages; includePath = pkgs.lib.makeSearchPathOutput "dev" "include" basePackages; darwinLdFlags = pkgs.lib.optionalString pkgs.stdenv.isDarwin "-L${pkgs.darwin.libiconv}/lib"; darwinRustFlags = pkgs.lib.optionalString pkgs.stdenv.isDarwin "-L native=${pkgs.darwin.libiconv}/lib"; diff --git a/rust-toolchain.toml b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.92.0" +channel = "1.97.0" diff --git a/src/control.rs b/src/control.rs @@ -91,6 +91,7 @@ pub async fn accept_client_uri( remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some(client_uri.secret.clone()), requested_permissions: client_uri.metadata.requested_permissions.clone(), + client_metadata: None, }; let backend = runtime.signer_backend(); let Some(approval_requirement) = runtime diff --git a/src/policy.rs b/src/policy.rs @@ -557,7 +557,8 @@ fn required_permission_for_request( RadrootsNostrConnectRequest::Connect { .. } | RadrootsNostrConnectRequest::GetPublicKey | RadrootsNostrConnectRequest::GetSessionCapability - | RadrootsNostrConnectRequest::Ping => None, + | RadrootsNostrConnectRequest::Ping + | RadrootsNostrConnectRequest::Logout => None, RadrootsNostrConnectRequest::SignEvent(unsigned_event) => { Some(RadrootsNostrConnectPermission::with_parameter( RadrootsNostrConnectMethod::SignEvent, diff --git a/src/transport/nip46.rs b/src/transport/nip46.rs @@ -817,6 +817,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: requested_permissions.into(), + client_metadata: None, }, ), ) @@ -884,6 +885,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some("s3cr3t".to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -925,6 +927,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -961,6 +964,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some("s3cr3t".to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -974,6 +978,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some("s3cr3t".to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -999,6 +1004,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some("s3cr3t".to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -1031,6 +1037,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: Some("s3cr3t".to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -1066,6 +1073,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -1081,6 +1089,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -1109,6 +1118,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: Default::default(), + client_metadata: None, }, ), ) @@ -1130,6 +1140,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: vec![sign_event_permission(1)].into(), + client_metadata: None, }, ), ) @@ -1189,6 +1200,7 @@ mod tests { sign_event_permission(7), ] .into(), + client_metadata: None, }, ), ) @@ -1229,6 +1241,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: vec![sign_event_permission(1)].into(), + client_metadata: None, }, ), ) @@ -1321,6 +1334,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: vec![sign_event_permission(1)].into(), + client_metadata: None, }, ), ) @@ -1397,6 +1411,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: vec![sign_event_permission(1)].into(), + client_metadata: None, }, ), ) @@ -1458,6 +1473,7 @@ mod tests { RadrootsNostrConnectMethod::SwitchRelays, )] .into(), + client_metadata: None, }, ), ) @@ -1541,6 +1557,7 @@ mod tests { remote_signer_public_key: runtime.signer_identity().public_key(), secret: None, requested_permissions: vec![sign_event_permission(1)].into(), + client_metadata: None, }, ), ) diff --git a/tests/nip46_e2e.rs b/tests/nip46_e2e.rs @@ -556,6 +556,7 @@ fn connect_request_message( remote_signer_public_key: signer_public_key, secret: Some(secret.to_owned()), requested_permissions: Default::default(), + client_metadata: None, }, ) } @@ -884,6 +885,7 @@ async fn live_listener_rejects_denied_clients_without_registering_connection() - remote_signer_public_key: signer_public_key, secret: Some("denied-secret".to_owned()), requested_permissions: Default::default(), + client_metadata: None, } .method(), response, @@ -2128,6 +2130,7 @@ async fn trusted_client_reauths_after_authorized_ttl() -> TestResult<()> { remote_signer_public_key: signer_public_key, secret: None, requested_permissions: "sign_event:1".parse().expect("requested permissions"), + client_metadata: None, }, ), Timestamp::now().as_secs(), @@ -2144,6 +2147,7 @@ async fn trusted_client_reauths_after_authorized_ttl() -> TestResult<()> { remote_signer_public_key: signer_public_key, secret: None, requested_permissions: "sign_event:1".parse().expect("requested permissions"), + client_metadata: None, } .method(), connect_response, diff --git a/tests/operability_e2e.rs b/tests/operability_e2e.rs @@ -360,7 +360,7 @@ async fn status_reports_sqlite_persistence_schema_state() -> TestResult<()> { .as_ref() .expect("signer sqlite schema") .applied_migration_count, - Some(2) + Some(3) ); assert_eq!( status