remote signer bugfix and make it support multi relays

This commit is contained in:
DASHU
2024-11-28 01:23:02 +08:00
parent 26a375f84d
commit 87c9ac7351
3 changed files with 33 additions and 26 deletions

View File

@@ -81,7 +81,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
var relay = RelayIsolate(relayAddr, RelayStatus(remoteSignerPubkey)); var relay = RelayIsolate(relayAddr, RelayStatus(remoteSignerPubkey));
var filter = Filter( var filter = Filter(
p: [remoteSigningInfo.remotePubkey!], p: [remoteSignerPubkey],
since: DateTime.now().millisecondsSinceEpoch ~/ 1000); since: DateTime.now().millisecondsSinceEpoch ~/ 1000);
relay.pendingAuthedMessages relay.pendingAuthedMessages
.add(["REQ", StringUtil.rndNameStr(10), filter.toJson()]); .add(["REQ", StringUtil.rndNameStr(10), filter.toJson()]);
@@ -97,7 +97,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
} }
Future<void> onRequest( Future<void> onRequest(
Relay relay, List<Relay> relays,
NostrRemoteRequest request, NostrRemoteRequest request,
RemoteSigningInfo remoteSigningInfo, RemoteSigningInfo remoteSigningInfo,
String localPubkey, String localPubkey,
@@ -114,7 +114,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
response = NostrRemoteResponse(request.id, "pong"); response = NostrRemoteResponse(request.id, "pong");
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
} else if (request.method == "connect") { } else if (request.method == "connect") {
if (app != null) { if (app != null) {
response = NostrRemoteResponse(request.id, "ack"); response = NostrRemoteResponse(request.id, "ack");
@@ -160,7 +160,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
if (response != null) { if (response != null) {
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
} }
} else { } else {
if (remoteSigningInfo.localPubkey != localPubkey) { if (remoteSigningInfo.localPubkey != localPubkey) {
@@ -168,7 +168,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
response = NostrRemoteResponse(request.id, "", response = NostrRemoteResponse(request.id, "",
error: "Local pubkey not allow."); error: "Local pubkey not allow.");
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
return; return;
} }
if (app == null) { if (app == null) {
@@ -176,7 +176,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
response = NostrRemoteResponse(request.id, "", response = NostrRemoteResponse(request.id, "",
error: "Remote signing should connect first."); error: "Remote signing should connect first.");
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
return; return;
} }
@@ -213,7 +213,7 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
eventKind: eventKind, authDetail: authDetail, (app) { eventKind: eventKind, authDetail: authDetail, (app) {
response = NostrRemoteResponse(request.id, "", error: "forbid"); response = NostrRemoteResponse(request.id, "", error: "forbid");
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
}, (app, signer) async { }, (app, signer) async {
if (request.method == "sign_event") { if (request.method == "sign_event") {
var tags = eventObj["tags"]; var tags = eventObj["tags"];
@@ -249,12 +249,12 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
} }
sendResponse( sendResponse(
relay, response, signerSigner, localPubkey, remoteSignerPubkey); relays, response, signerSigner, localPubkey, remoteSignerPubkey);
}); });
} }
} }
Future<void> sendResponse(Relay relay, NostrRemoteResponse? response, Future<void> sendResponse(List<Relay> relays, NostrRemoteResponse? response,
NostrSigner signer, String localPubkey, String remoteSignerPubkey) async { NostrSigner signer, String localPubkey, String remoteSignerPubkey) async {
if (response != null) { if (response != null) {
var result = await response.encrypt(signer, localPubkey); var result = await response.encrypt(signer, localPubkey);
@@ -271,11 +271,15 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
// print("response:"); // print("response:");
if (event != null) { if (event != null) {
// print(event.toJson()); // print(event.toJson());
relay.send(["EVENT", event.toJson()]); for (var relay in relays) {
relay.send(["EVENT", event.toJson()]);
}
} }
} }
} }
Map<String, int> handledIds = {};
Future<void> _onEvent(Relay relay, List<dynamic> json) async { Future<void> _onEvent(Relay relay, List<dynamic> json) async {
// print("request"); // print("request");
// print(json); // print(json);
@@ -303,11 +307,19 @@ class RemoteSigningProvider extends ChangeNotifier with PermissionCheckMixin {
event.sources.add(relay.url); event.sources.add(relay.url);
if (event.kind == EventKind.NOSTR_REMOTE_SIGNING) { if (event.kind == EventKind.NOSTR_REMOTE_SIGNING) {
var request = await NostrRemoteRequest.decrypt( if (handledIds[event.id] == null) {
event.content, signer, event.pubkey); var request = await NostrRemoteRequest.decrypt(
if (request != null) { event.content, signer, event.pubkey);
onRequest(relay, request, remoteSigningInfo, event.pubkey, var relays = relayMap[remoteSignerPubkey];
appMap[remoteSignerPubkey]); if (relays == null || relays.isEmpty) {
relays = [relay];
}
if (request != null) {
onRequest(relays, request, remoteSigningInfo, event.pubkey,
appMap[remoteSignerPubkey]);
}
handledIds[event.id] = 1;
} }
} }
} catch (err) { } catch (err) {

View File

@@ -309,6 +309,8 @@ class _AddRemoteAppRouter extends State<AddRemoteAppRouter> {
} }
} }
String remoteSignerKey = generatePrivateKey();
void confirmNostrConnect() { void confirmNostrConnect() {
var remoteSigningInfo = var remoteSigningInfo =
RemoteSigningInfo.parseNostrConnectUrl(nostrconnectConn.text); RemoteSigningInfo.parseNostrConnectUrl(nostrconnectConn.text);
@@ -317,21 +319,19 @@ class _AddRemoteAppRouter extends State<AddRemoteAppRouter> {
return; return;
} }
remoteSigningInfo.remoteSignerKey = generatePrivateKey(); remoteSigningInfo.remoteSignerKey = remoteSignerKey;
remoteSigningInfo.createdAt = DateTime.now().millisecondsSinceEpoch ~/ 1000; remoteSigningInfo.createdAt = DateTime.now().millisecondsSinceEpoch ~/ 1000;
remoteSigningInfo.updatedAt = remoteSigningInfo.createdAt; remoteSigningInfo.updatedAt = remoteSigningInfo.createdAt;
// TODO // TODO
} }
TextEditingController remoteSignerKeyController = TextEditingController();
TextEditingController relayAddrController = TextEditingController(); TextEditingController relayAddrController = TextEditingController();
TextEditingController secretController = TextEditingController(); TextEditingController secretController = TextEditingController();
void refreshBunkerUrl() { void refreshBunkerUrl() {
remoteSignerKeyController.text = generatePrivateKey(); remoteSignerKey = generatePrivateKey();
secretController.text = StringUtil.rndNameStr(20); secretController.text = StringUtil.rndNameStr(20);
relayAddrController.text = "wss://relay.nsec.app"; relayAddrController.text = "wss://relay.nsec.app";
@@ -354,7 +354,6 @@ class _AddRemoteAppRouter extends State<AddRemoteAppRouter> {
return; return;
} }
var remoteSignerKey = remoteSignerKeyController.text;
var relays = [relayAddrController.text]; var relays = [relayAddrController.text];
var remoteSigningInfo = RemoteSigningInfo( var remoteSigningInfo = RemoteSigningInfo(
@@ -371,12 +370,8 @@ class _AddRemoteAppRouter extends State<AddRemoteAppRouter> {
} }
void reloadBunker() { void reloadBunker() {
if (StringUtil.isBlank(pubkey)) {
return;
}
var nostrRemoteSignerInfo = NostrRemoteSignerInfo( var nostrRemoteSignerInfo = NostrRemoteSignerInfo(
remoteUserPubkey: pubkey!, remoteSignerPubkey: getPublicKey(remoteSignerKey),
relays: [relayAddrController.text], relays: [relayAddrController.text],
optionalSecret: secretController.text, optionalSecret: secretController.text,
); );