mirror of
https://github.com/haorendashu/nowser.git
synced 2025-12-18 02:04:18 +01:00
simple support for nip07
This commit is contained in:
101
lib/provider/app_provider.dart
Normal file
101
lib/provider/app_provider.dart
Normal file
@@ -0,0 +1,101 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:nostr_sdk/utils/string_util.dart';
|
||||
import 'package:nowser/const/connect_type.dart';
|
||||
import 'package:nowser/data/app_db.dart';
|
||||
|
||||
import '../const/auth_result.dart';
|
||||
import '../data/app.dart';
|
||||
|
||||
class AppProvider extends ChangeNotifier {
|
||||
List<App> _list = [];
|
||||
|
||||
Map<String, Map<String, int>> appPermissions = {};
|
||||
|
||||
Future<void> reload() async {
|
||||
appPermissions = {};
|
||||
var allApp = await AppDB.all();
|
||||
_list = allApp;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> add(App app) async {
|
||||
if (await AppDB.insert(app) > 0) {
|
||||
_list.add(app);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
String getAppCode(int appType, String code) {
|
||||
return "${appType}_$code";
|
||||
}
|
||||
|
||||
int checkPermission(int appType, String code, int authType,
|
||||
{int? eventKind}) {
|
||||
var app = getApp(appType, code);
|
||||
if (app != null) {
|
||||
if (app.connectType == ConnectType.FULLY_TRUST) {
|
||||
return AuthResult.OK;
|
||||
} else if (app.connectType == ConnectType.ALWAY_REJECT) {
|
||||
return AuthResult.REJECT;
|
||||
} else {
|
||||
var appCode = getAppCode(appType, code);
|
||||
var permissionsMap = appPermissions[appCode];
|
||||
if (permissionsMap == null) {
|
||||
permissionsMap = _getPermissionMap(app);
|
||||
appPermissions[appCode] = permissionsMap;
|
||||
}
|
||||
|
||||
var key = "$authType";
|
||||
if (eventKind != null) {
|
||||
key = "$key-$eventKind";
|
||||
}
|
||||
|
||||
var value = permissionsMap[key];
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return AuthResult.ASK;
|
||||
}
|
||||
|
||||
Map<String, int> _getPermissionMap(App app) {
|
||||
Map<String, int> m = {};
|
||||
_putPermissionMapValue(m, app.alwaysAllow, 1);
|
||||
_putPermissionMapValue(m, app.alwaysReject, -1);
|
||||
return m;
|
||||
}
|
||||
|
||||
void _putPermissionMapValue(
|
||||
Map<String, int> m, String? permissionText, int value) {
|
||||
if (StringUtil.isNotBlank(permissionText)) {
|
||||
var permissionStrs = permissionText!.split(";");
|
||||
for (var permissionStr in permissionStrs) {
|
||||
var strs = permissionStr.split("-");
|
||||
|
||||
var kindStr = strs[0];
|
||||
if (strs.length == 1) {
|
||||
m[kindStr] = value;
|
||||
} else if (strs.length > 1) {
|
||||
var eventKindsStr = strs[1];
|
||||
var eventKindStrs = eventKindsStr.split(",");
|
||||
for (var eventKindStr in eventKindStrs) {
|
||||
var key = "$kindStr-$eventKindStr";
|
||||
m[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
App? getApp(int appType, String code) {
|
||||
for (var app in _list) {
|
||||
if (app.appType == appType && app.code == code) {
|
||||
return app;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@ import 'dart:convert';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:nostr_sdk/client_utils/keys.dart';
|
||||
import 'package:nostr_sdk/signer/local_nostr_signer.dart';
|
||||
import 'package:nostr_sdk/signer/nostr_signer.dart';
|
||||
import 'package:nostr_sdk/utils/string_util.dart';
|
||||
|
||||
class KeyProvider extends ChangeNotifier {
|
||||
@@ -104,4 +106,13 @@ class KeyProvider extends ChangeNotifier {
|
||||
bool exist(String privateKey) {
|
||||
return keys.contains(privateKey);
|
||||
}
|
||||
|
||||
NostrSigner? getSigner(String pubkey) {
|
||||
var key = keysMap[pubkey];
|
||||
if (StringUtil.isNotBlank(key)) {
|
||||
return LocalNostrSigner(key!);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user