diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e003d84..3ae8b65 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -48,7 +48,7 @@ diff --git a/android/app/src/main/java/com/github/haorendashu/nowser/NowserSignerProvider.java b/android/app/src/main/java/com/github/haorendashu/nowser/NowserSignerProvider.java index 5b74804..bf5e23f 100644 --- a/android/app/src/main/java/com/github/haorendashu/nowser/NowserSignerProvider.java +++ b/android/app/src/main/java/com/github/haorendashu/nowser/NowserSignerProvider.java @@ -8,7 +8,7 @@ public class NowserSignerProvider extends AndroidContentProvider { @NotNull @Override public String getAuthority() { - return "com.github.haorendashu.nowser.SIGN_EVENT;com.github.haorendashu.nowser.NIP04_ENCRYPT;com.github.haorendashu.nowser.NIP04_DECRYPT;com.github.haorendashu.nowser.NIP44_ENCRYPT;com.github.haorendashu.nowser.NIP44_DECRYPT;com.github.haorendashu.nowser.GET_PUBLIC_KEY"; + return "com.github.haorendashu.nowser.SIGN_EVENT;com.github.haorendashu.nowser.NIP04_ENCRYPT;com.github.haorendashu.nowser.NIP04_DECRYPT;com.github.haorendashu.nowser.NIP44_ENCRYPT;com.github.haorendashu.nowser.NIP44_DECRYPT;com.github.haorendashu.nowser.GET_PUBLIC_KEY;com.github.haorendashu.nowser.DECRYPT_ZAP_EVENT"; } @NotNull diff --git a/lib/component/auth_dialog/auth_dialog.dart b/lib/component/auth_dialog/auth_dialog.dart index c015ce1..ad9a0f1 100644 --- a/lib/component/auth_dialog/auth_dialog.dart +++ b/lib/component/auth_dialog/auth_dialog.dart @@ -88,6 +88,9 @@ class _AuthDialog extends State { } else if (widget.authType == AuthType.NIP44_DECRYPT) { authTitle = "Decrypt (NIP-44)"; authDes += "Decrypt (NIP-44)"; + } else if (widget.authType == AuthType.DECRYPT_ZAP_EVENT) { + authTitle = "Decrypt zap event"; + authDes += "Decrypt zap event"; } List list = []; diff --git a/lib/const/auth_type.dart b/lib/const/auth_type.dart index a917897..1620834 100644 --- a/lib/const/auth_type.dart +++ b/lib/const/auth_type.dart @@ -15,6 +15,8 @@ class AuthType { static const NIP44_DECRYPT = 7; + static const DECRYPT_ZAP_EVENT = 8; + static String getAuthName(BuildContext context, int authType) { if (authType == GET_PUBLIC_KEY) { return "Get Public Key"; @@ -30,6 +32,8 @@ class AuthType { return "Encrypt (NIP-44)"; } else if (authType == NIP44_DECRYPT) { return "Decrypt (NIP-44)"; + } else if (authType == DECRYPT_ZAP_EVENT) { + return "Decrypt zap event"; } return "Unknow"; diff --git a/lib/main.dart b/lib/main.dart index 6c4c8b4..c9fb0e2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -341,5 +341,5 @@ Future nowserSignerProviderEntrypoint() async { // if we call content resolver this should init first, to receive request. // so, doInit() method move to query method. AndroidSignerContentResolverProvider( - 'com.github.haorendashu.nowser.SIGN_EVENT;com.github.haorendashu.nowser.NIP04_ENCRYPT;com.github.haorendashu.nowser.NIP04_DECRYPT;com.github.haorendashu.nowser.NIP44_ENCRYPT;com.github.haorendashu.nowser.NIP44_DECRYPT;com.github.haorendashu.nowser.GET_PUBLIC_KEY'); + 'com.github.haorendashu.nowser.SIGN_EVENT;com.github.haorendashu.nowser.NIP04_ENCRYPT;com.github.haorendashu.nowser.NIP04_DECRYPT;com.github.haorendashu.nowser.NIP44_ENCRYPT;com.github.haorendashu.nowser.NIP44_DECRYPT;com.github.haorendashu.nowser.GET_PUBLIC_KEY;com.github.haorendashu.nowser.DECRYPT_ZAP_EVENT'); } diff --git a/lib/provider/android_signer_content_resolver_provider.dart b/lib/provider/android_signer_content_resolver_provider.dart index 3c66e07..6786a21 100644 --- a/lib/provider/android_signer_content_resolver_provider.dart +++ b/lib/provider/android_signer_content_resolver_provider.dart @@ -7,6 +7,7 @@ import 'package:nostr_sdk/event.dart'; import 'package:nostr_sdk/nip19/nip19.dart'; import 'package:nostr_sdk/signer/nostr_signer.dart'; import 'package:nostr_sdk/utils/string_util.dart'; +import 'package:nostr_sdk/zap/private_zap.dart'; import 'package:nowser/const/app_type.dart'; import 'package:nowser/provider/permission_check_mixin.dart'; @@ -75,6 +76,8 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider authType = AuthType.NIP44_ENCRYPT; } else if (authTypeStr == "NIP44_DECRYPT") { authType = AuthType.NIP44_DECRYPT; + } else if (authTypeStr == "DECRYPT_ZAP_EVENT") { + authType = AuthType.DECRYPT_ZAP_EVENT; } int appType = AppType.ANDROID_APP; @@ -86,9 +89,10 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider int? eventKind; dynamic eventObj; - if (authType == AuthType.SIGN_EVENT) { + if (authType == AuthType.SIGN_EVENT || + authType == AuthType.DECRYPT_ZAP_EVENT) { eventObj = jsonDecode(authDetail); - if (eventObj != null) { + if (eventObj != null && authType == AuthType.SIGN_EVENT) { eventKind = eventObj["kind"]; } } @@ -98,7 +102,9 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider var complete = Completer(); rejectFunc(_app) { - saveAuthLog(_app, authType, eventKind, authDetail, AuthResult.REJECT); + if (_app != null) { + saveAuthLog(_app, authType, eventKind, authDetail, AuthResult.REJECT); + } complete.complete(); } @@ -170,6 +176,14 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider columnNames: ["signature"], notificationUris: [uri]); data.addRow([result]); } + } else if (authType == AuthType.DECRYPT_ZAP_EVENT) { + var event = Event.fromJson(eventObj); + var result = await PrivateZap.decryptZapEvent(signer!, event); + if (StringUtil.isNotBlank(result)) { + data = MatrixCursorData( + columnNames: ["signature"], notificationUris: [uri]); + data.addRow([result]); + } } if (data != null) { diff --git a/lib/provider/android_signer_mixin.dart b/lib/provider/android_signer_mixin.dart index b3a4e70..352dcc6 100644 --- a/lib/provider/android_signer_mixin.dart +++ b/lib/provider/android_signer_mixin.dart @@ -3,13 +3,16 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:nostr_sdk/event.dart'; +import 'package:nostr_sdk/nip04/nip04.dart'; import 'package:nostr_sdk/nip19/nip19.dart'; import 'package:nostr_sdk/utils/string_util.dart'; +import 'package:nostr_sdk/zap/private_zap.dart'; import 'package:nowser/const/app_type.dart'; import 'package:nowser/const/auth_result.dart'; import 'package:nowser/const/auth_type.dart'; import 'package:nowser/provider/permission_check_mixin.dart'; import 'package:receive_intent/receive_intent.dart' as receiveIntent; +import 'package:hex/hex.dart'; mixin AndroidSignerMixin on PermissionCheckMixin { // StreamSubscription? _sub; @@ -77,15 +80,18 @@ mixin AndroidSignerMixin on PermissionCheckMixin { authType = AuthType.NIP44_ENCRYPT; } else if (authTypeStr == "nip44_decrypt") { authType = AuthType.NIP44_DECRYPT; + } else if (authTypeStr == "decrypt_zap_event") { + authType = AuthType.DECRYPT_ZAP_EVENT; } var playload = intent.data!.replaceFirst(PREFIX, ""); int? eventKind; dynamic eventObj; - if (authType == AuthType.SIGN_EVENT) { + if (authType == AuthType.SIGN_EVENT || + authType == AuthType.DECRYPT_ZAP_EVENT) { print(playload); eventObj = jsonDecode(playload); - if (eventObj != null) { + if (eventObj != null && authType == AuthType.SIGN_EVENT) { eventKind = eventObj["kind"]; print("eventKind $eventKind"); } @@ -107,12 +113,12 @@ mixin AndroidSignerMixin on PermissionCheckMixin { // confirm Map data = {}; data["id"] = callId; + var signerPubkey = await signer.getPublicKey(); if (authType == AuthType.GET_PUBLIC_KEY) { // TODO should handle permissions // var permissions = extra["permissions"]; - var pubkey = await signer.getPublicKey(); - data["signature"] = Nip19.encodePubKey(pubkey!); + data["signature"] = Nip19.encodePubKey(signerPubkey!); data["package"] = "com.github.haorendashu.nowser"; } else if (authType == AuthType.SIGN_EVENT) { var tags = eventObj["tags"]; @@ -150,6 +156,10 @@ mixin AndroidSignerMixin on PermissionCheckMixin { if (StringUtil.isNotBlank(result)) { data["signature"] = result; } + } else if (authType == AuthType.DECRYPT_ZAP_EVENT) { + var event = Event.fromJson(eventObj); + var source = await PrivateZap.decryptZapEvent(signer, event); + data["signature"] = source; } saveAuthLog(app, authType, eventKind, playload, AuthResult.OK); diff --git a/lib/provider/permission_check_mixin.dart b/lib/provider/permission_check_mixin.dart index ce52ec8..cbd3e55 100644 --- a/lib/provider/permission_check_mixin.dart +++ b/lib/provider/permission_check_mixin.dart @@ -50,16 +50,28 @@ mixin PermissionCheckMixin { } if (app.connectType == ConnectType.FULLY_TRUST) { - saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); - confirm(app, signer); + try { + confirm(app, signer); + saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); + } catch (e) { + print("confirm error $e"); + reject(app); + saveAuthLog(app, authType, eventKind, authDetail, AuthResult.REJECT); + } return; } else if (app.connectType == ConnectType.REASONABLE) { var permissionCheckResult = appProvider .checkPermission(appType, code, authType, eventKind: eventKind); print("permissionCheckResult $permissionCheckResult"); if (permissionCheckResult == AuthResult.OK) { - saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); - confirm(app, signer); + try { + confirm(app, signer); + saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); + } catch (e) { + print("confirm error $e"); + reject(app); + saveAuthLog(app, authType, eventKind, authDetail, AuthResult.REJECT); + } return; } else if (permissionCheckResult == AuthResult.REJECT) { saveAuthLog(app, authType, eventKind, authDetail, AuthResult.REJECT); @@ -71,8 +83,15 @@ mixin PermissionCheckMixin { var authResult = await AuthDialog.show(context, app, authType, eventKind: eventKind, authDetail: authDetail); if (authResult == AuthResult.OK) { - saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); - confirm(app, signer); + try { + confirm(app, signer); + saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); + } catch (e) { + print("confirm error $e"); + reject(app); + saveAuthLog( + app, authType, eventKind, authDetail, AuthResult.REJECT); + } return; } } diff --git a/packages/nostr_sdk b/packages/nostr_sdk index bfa2e7d..ec94e10 160000 --- a/packages/nostr_sdk +++ b/packages/nostr_sdk @@ -1 +1 @@ -Subproject commit bfa2e7d4d0f352678f1528a903270645f269a61f +Subproject commit ec94e1025884555f7e8f2972e7a3a1785e0b3317