diff --git a/mobile/lib/shared/relay/media_auth.dart b/mobile/lib/shared/relay/media_auth.dart index 8611ce5b56..cc423a99c6 100644 --- a/mobile/lib/shared/relay/media_auth.dart +++ b/mobile/lib/shared/relay/media_auth.dart @@ -31,6 +31,7 @@ const _mediaGetAuthRefreshMarginSeconds = 60; class MediaGetAuthService { final String _baseUrl; final String? _nsec; + final String? _pubkey; final DateTime Function() _now; Map? _cachedHeaders; @@ -39,9 +40,11 @@ class MediaGetAuthService { MediaGetAuthService({ required String baseUrl, required String? nsec, + String? pubkey, DateTime Function()? now, }) : _baseUrl = baseUrl, _nsec = nsec, + _pubkey = pubkey, _now = now ?? DateTime.now; bool isRelayMediaUrl(String url) { @@ -122,6 +125,8 @@ class MediaGetAuthService { content: 'Get buzz-media', tags: tags, secretKey: privkeyHex, + // Deriving the pubkey costs about a third of a signature, per image. + pubkey: _pubkey, verify: false, ); } @@ -129,7 +134,11 @@ class MediaGetAuthService { final mediaGetAuthServiceProvider = Provider((ref) { final config = ref.watch(relayConfigProvider); - return MediaGetAuthService(baseUrl: config.baseUrl, nsec: config.nsec); + return MediaGetAuthService( + baseUrl: config.baseUrl, + nsec: config.nsec, + pubkey: ref.watch(myPubkeyProvider), + ); }); Map mediaGetHeadersFor(WidgetRef ref, String url) { diff --git a/mobile/lib/shared/relay/relay_session.dart b/mobile/lib/shared/relay/relay_session.dart index 18e03bb2b7..3173afc85f 100644 --- a/mobile/lib/shared/relay/relay_session.dart +++ b/mobile/lib/shared/relay/relay_session.dart @@ -245,6 +245,7 @@ class RelaySessionNotifier extends Notifier { url: url, bodyBytes: bodyBytes, nsec: config.nsec, + pubkey: ref.read(myPubkeyProvider), ), 'Content-Type': 'application/json', }, diff --git a/mobile/lib/shared/relay/relay_session_auth.dart b/mobile/lib/shared/relay/relay_session_auth.dart index 9c6c79ae02..a198fc0151 100644 --- a/mobile/lib/shared/relay/relay_session_auth.dart +++ b/mobile/lib/shared/relay/relay_session_auth.dart @@ -1,10 +1,13 @@ part of 'relay_session.dart'; +/// Pass the signer's hex [pubkey] when it is already known: deriving it from +/// the key costs about a third of a signature, on the UI isolate. String buildNip98AuthHeader({ required String method, required String url, required List bodyBytes, required String? nsec, + String? pubkey, }) { if (nsec == null || nsec.isEmpty) { throw Exception('Cannot query relay: no signing key available'); @@ -27,6 +30,7 @@ String buildNip98AuthHeader({ ['nonce', const Uuid().v4()], ], secretKey: privkeyHex, + pubkey: pubkey, verify: false, ); return 'Nostr ${base64.encode(utf8.encode(event.toJson()))}';