try to add decryptZapEvent support

This commit is contained in:
DASHU
2024-10-16 10:53:55 +08:00
parent 44ed45bdd8
commit d3da4f2829
9 changed files with 67 additions and 17 deletions

View File

@@ -48,7 +48,7 @@
<provider <provider
android:name="com.github.haorendashu.nowser.NowserSignerProvider" android:name="com.github.haorendashu.nowser.NowserSignerProvider"
android:authorities="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" android:authorities="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"
android:exported="true" /> android:exported="true" />
</application> </application>

View File

@@ -8,7 +8,7 @@ public class NowserSignerProvider extends AndroidContentProvider {
@NotNull @NotNull
@Override @Override
public String getAuthority() { 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 @NotNull

View File

@@ -88,6 +88,9 @@ class _AuthDialog extends State<AuthDialog> {
} else if (widget.authType == AuthType.NIP44_DECRYPT) { } else if (widget.authType == AuthType.NIP44_DECRYPT) {
authTitle = "Decrypt (NIP-44)"; authTitle = "Decrypt (NIP-44)";
authDes += "Decrypt (NIP-44)"; authDes += "Decrypt (NIP-44)";
} else if (widget.authType == AuthType.DECRYPT_ZAP_EVENT) {
authTitle = "Decrypt zap event";
authDes += "Decrypt zap event";
} }
List<Widget> list = []; List<Widget> list = [];

View File

@@ -15,6 +15,8 @@ class AuthType {
static const NIP44_DECRYPT = 7; static const NIP44_DECRYPT = 7;
static const DECRYPT_ZAP_EVENT = 8;
static String getAuthName(BuildContext context, int authType) { static String getAuthName(BuildContext context, int authType) {
if (authType == GET_PUBLIC_KEY) { if (authType == GET_PUBLIC_KEY) {
return "Get Public Key"; return "Get Public Key";
@@ -30,6 +32,8 @@ class AuthType {
return "Encrypt (NIP-44)"; return "Encrypt (NIP-44)";
} else if (authType == NIP44_DECRYPT) { } else if (authType == NIP44_DECRYPT) {
return "Decrypt (NIP-44)"; return "Decrypt (NIP-44)";
} else if (authType == DECRYPT_ZAP_EVENT) {
return "Decrypt zap event";
} }
return "Unknow"; return "Unknow";

View File

@@ -341,5 +341,5 @@ Future<void> nowserSignerProviderEntrypoint() async {
// if we call content resolver this should init first, to receive request. // if we call content resolver this should init first, to receive request.
// so, doInit() method move to query method. // so, doInit() method move to query method.
AndroidSignerContentResolverProvider( 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');
} }

View File

@@ -7,6 +7,7 @@ import 'package:nostr_sdk/event.dart';
import 'package:nostr_sdk/nip19/nip19.dart'; import 'package:nostr_sdk/nip19/nip19.dart';
import 'package:nostr_sdk/signer/nostr_signer.dart'; import 'package:nostr_sdk/signer/nostr_signer.dart';
import 'package:nostr_sdk/utils/string_util.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/app_type.dart';
import 'package:nowser/provider/permission_check_mixin.dart'; import 'package:nowser/provider/permission_check_mixin.dart';
@@ -75,6 +76,8 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider
authType = AuthType.NIP44_ENCRYPT; authType = AuthType.NIP44_ENCRYPT;
} else if (authTypeStr == "NIP44_DECRYPT") { } else if (authTypeStr == "NIP44_DECRYPT") {
authType = AuthType.NIP44_DECRYPT; authType = AuthType.NIP44_DECRYPT;
} else if (authTypeStr == "DECRYPT_ZAP_EVENT") {
authType = AuthType.DECRYPT_ZAP_EVENT;
} }
int appType = AppType.ANDROID_APP; int appType = AppType.ANDROID_APP;
@@ -86,9 +89,10 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider
int? eventKind; int? eventKind;
dynamic eventObj; dynamic eventObj;
if (authType == AuthType.SIGN_EVENT) { if (authType == AuthType.SIGN_EVENT ||
authType == AuthType.DECRYPT_ZAP_EVENT) {
eventObj = jsonDecode(authDetail); eventObj = jsonDecode(authDetail);
if (eventObj != null) { if (eventObj != null && authType == AuthType.SIGN_EVENT) {
eventKind = eventObj["kind"]; eventKind = eventObj["kind"];
} }
} }
@@ -98,7 +102,9 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider
var complete = Completer(); var complete = Completer();
rejectFunc(_app) { rejectFunc(_app) {
if (_app != null) {
saveAuthLog(_app, authType, eventKind, authDetail, AuthResult.REJECT); saveAuthLog(_app, authType, eventKind, authDetail, AuthResult.REJECT);
}
complete.complete(); complete.complete();
} }
@@ -170,6 +176,14 @@ class AndroidSignerContentResolverProvider extends AndroidContentProvider
columnNames: ["signature"], notificationUris: [uri]); columnNames: ["signature"], notificationUris: [uri]);
data.addRow([result]); 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) { if (data != null) {

View File

@@ -3,13 +3,16 @@ import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:nostr_sdk/event.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/nip19/nip19.dart';
import 'package:nostr_sdk/utils/string_util.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/app_type.dart';
import 'package:nowser/const/auth_result.dart'; import 'package:nowser/const/auth_result.dart';
import 'package:nowser/const/auth_type.dart'; import 'package:nowser/const/auth_type.dart';
import 'package:nowser/provider/permission_check_mixin.dart'; import 'package:nowser/provider/permission_check_mixin.dart';
import 'package:receive_intent/receive_intent.dart' as receiveIntent; import 'package:receive_intent/receive_intent.dart' as receiveIntent;
import 'package:hex/hex.dart';
mixin AndroidSignerMixin on PermissionCheckMixin { mixin AndroidSignerMixin on PermissionCheckMixin {
// StreamSubscription? _sub; // StreamSubscription? _sub;
@@ -77,15 +80,18 @@ mixin AndroidSignerMixin on PermissionCheckMixin {
authType = AuthType.NIP44_ENCRYPT; authType = AuthType.NIP44_ENCRYPT;
} else if (authTypeStr == "nip44_decrypt") { } else if (authTypeStr == "nip44_decrypt") {
authType = AuthType.NIP44_DECRYPT; authType = AuthType.NIP44_DECRYPT;
} else if (authTypeStr == "decrypt_zap_event") {
authType = AuthType.DECRYPT_ZAP_EVENT;
} }
var playload = intent.data!.replaceFirst(PREFIX, ""); var playload = intent.data!.replaceFirst(PREFIX, "");
int? eventKind; int? eventKind;
dynamic eventObj; dynamic eventObj;
if (authType == AuthType.SIGN_EVENT) { if (authType == AuthType.SIGN_EVENT ||
authType == AuthType.DECRYPT_ZAP_EVENT) {
print(playload); print(playload);
eventObj = jsonDecode(playload); eventObj = jsonDecode(playload);
if (eventObj != null) { if (eventObj != null && authType == AuthType.SIGN_EVENT) {
eventKind = eventObj["kind"]; eventKind = eventObj["kind"];
print("eventKind $eventKind"); print("eventKind $eventKind");
} }
@@ -107,12 +113,12 @@ mixin AndroidSignerMixin on PermissionCheckMixin {
// confirm // confirm
Map<String, Object?> data = {}; Map<String, Object?> data = {};
data["id"] = callId; data["id"] = callId;
var signerPubkey = await signer.getPublicKey();
if (authType == AuthType.GET_PUBLIC_KEY) { if (authType == AuthType.GET_PUBLIC_KEY) {
// TODO should handle permissions // TODO should handle permissions
// var permissions = extra["permissions"]; // var permissions = extra["permissions"];
var pubkey = await signer.getPublicKey(); data["signature"] = Nip19.encodePubKey(signerPubkey!);
data["signature"] = Nip19.encodePubKey(pubkey!);
data["package"] = "com.github.haorendashu.nowser"; data["package"] = "com.github.haorendashu.nowser";
} else if (authType == AuthType.SIGN_EVENT) { } else if (authType == AuthType.SIGN_EVENT) {
var tags = eventObj["tags"]; var tags = eventObj["tags"];
@@ -150,6 +156,10 @@ mixin AndroidSignerMixin on PermissionCheckMixin {
if (StringUtil.isNotBlank(result)) { if (StringUtil.isNotBlank(result)) {
data["signature"] = 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); saveAuthLog(app, authType, eventKind, playload, AuthResult.OK);

View File

@@ -50,16 +50,28 @@ mixin PermissionCheckMixin {
} }
if (app.connectType == ConnectType.FULLY_TRUST) { if (app.connectType == ConnectType.FULLY_TRUST) {
saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); try {
confirm(app, signer); 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; return;
} else if (app.connectType == ConnectType.REASONABLE) { } else if (app.connectType == ConnectType.REASONABLE) {
var permissionCheckResult = appProvider var permissionCheckResult = appProvider
.checkPermission(appType, code, authType, eventKind: eventKind); .checkPermission(appType, code, authType, eventKind: eventKind);
print("permissionCheckResult $permissionCheckResult"); print("permissionCheckResult $permissionCheckResult");
if (permissionCheckResult == AuthResult.OK) { if (permissionCheckResult == AuthResult.OK) {
saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); try {
confirm(app, signer); 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; return;
} else if (permissionCheckResult == AuthResult.REJECT) { } else if (permissionCheckResult == AuthResult.REJECT) {
saveAuthLog(app, authType, eventKind, authDetail, AuthResult.REJECT); saveAuthLog(app, authType, eventKind, authDetail, AuthResult.REJECT);
@@ -71,8 +83,15 @@ mixin PermissionCheckMixin {
var authResult = await AuthDialog.show(context, app, authType, var authResult = await AuthDialog.show(context, app, authType,
eventKind: eventKind, authDetail: authDetail); eventKind: eventKind, authDetail: authDetail);
if (authResult == AuthResult.OK) { if (authResult == AuthResult.OK) {
saveAuthLog(app, authType, eventKind, authDetail, AuthResult.OK); try {
confirm(app, signer); 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; return;
} }
} }