fix: only file share creator can delete it

This commit is contained in:
Gringo
2026-03-03 15:21:35 +01:00
parent 9069e3fe36
commit dcf5523012
5 changed files with 74 additions and 33 deletions
+2
View File
@@ -33,6 +33,8 @@ void main() async {
pubkey: keyPair.publicKey, pubkey: keyPair.publicKey,
privkey: keyPair.privateKey!, privkey: keyPair.privateKey!,
); );
await ndkFlutter.saveAccountsState();
} }
runApp(const MainApp()); runApp(const MainApp());
@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:ndk/ndk.dart'; import 'package:ndk/ndk.dart';
import 'package:ndk/shared/nips/nip01/bip340.dart';
Future<Nip01Event> createEvent({ Future<Nip01Event> createEvent({
required Ndk ndk, required Ndk ndk,
@@ -9,32 +10,32 @@ Future<Nip01Event> createEvent({
required String nonce, required String nonce,
String? filename, String? filename,
}) async { }) async {
final keyPair = Bip340.generatePrivateKey(); final fileMetadata = [
final signer = Bip340EventSigner( if (descriptor.type != null) ["file-type", descriptor.type!],
privateKey: keyPair.privateKey, if (filename != null && filename.isNotEmpty) ["filename", filename],
publicKey: keyPair.publicKey, ["encryption-algorithm", "aes-gcm"],
["decryption-key", key],
["decryption-nonce", nonce],
["x", descriptor.sha256],
if (descriptor.size != null) ["size", descriptor.size.toString()],
];
final signer = ndk.accounts.getLoggedAccount()!.signer;
final content = await ndk.accounts.getLoggedAccount()!.signer.encryptNip44(
plaintext: jsonEncode(fileMetadata),
recipientPubKey: recipientPubkey,
); );
final rumor = Nip01Event( final event = Nip01Event(
pubKey: signer.publicKey, pubKey: signer.getPublicKey(),
kind: 15, kind: 1515,
tags: [ tags: [
if (descriptor.type != null) ["file-type", descriptor.type!], ["p", recipientPubkey],
if (filename != null && filename.isNotEmpty) ["filename", filename],
["encryption-algorithm", "aes-gcm"],
["decryption-key", key],
["decryption-nonce", nonce],
["x", descriptor.sha256],
if (descriptor.size != null) ["size", descriptor.size.toString()],
], ],
content: descriptor.url, content: content!,
); );
final giftwrap = await ndk.giftWrap.toGiftWrap( final signedEvent = await signer.sign(event);
rumor: rumor,
recipientPubkey: recipientPubkey,
customSigner: signer,
);
return giftwrap; return signedEvent;
} }
@@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:file_transfer_sdk/file_transfer_sdk.dart'; import 'package:file_transfer_sdk/file_transfer_sdk.dart';
import 'package:ndk/ndk.dart'; import 'package:ndk/ndk.dart';
import 'package:ndk/shared/nips/nip01/bip340.dart'; import 'package:ndk/shared/nips/nip01/bip340.dart';
@@ -12,14 +14,14 @@ Future<FileMetadata> fetchFileMetadata({
filter: Filter(ids: [decodedNevent.eventId]), filter: Filter(ids: [decodedNevent.eventId]),
); );
Nip01Event? giftWrap; Nip01Event? event;
await for (var event in query.stream) { await for (var e in query.stream) {
if (event.id != decodedNevent.eventId) continue; if (e.id != decodedNevent.eventId) continue;
giftWrap = event; event = e;
break; break;
} }
if (giftWrap == null) throw Exception("Event not found"); if (event == null) throw Exception("Event not found");
final privateKey = Nip19.decode(sharedFile.encodedPrivateKey); final privateKey = Nip19.decode(sharedFile.encodedPrivateKey);
final publicKey = Bip340.getPublicKey(privateKey); final publicKey = Bip340.getPublicKey(privateKey);
@@ -28,10 +30,14 @@ Future<FileMetadata> fetchFileMetadata({
publicKey: publicKey, publicKey: publicKey,
); );
final event = await ndk.giftWrap.fromGiftWrap( final decryptedContent = await signer.decryptNip44(
giftWrap: giftWrap, ciphertext: event.content,
customSigner: signer, senderPubKey: event.pubKey,
); );
return FileMetadata.fromEvent(event); List<List<String>> tags = (jsonDecode(decryptedContent!) as List)
.map((tag) => List<String>.from(tag as List))
.toList();
return FileMetadata.fromTags(tags);
} }
@@ -19,7 +19,9 @@ class FileMetadata {
required this.size, required this.size,
}); });
factory FileMetadata.fromEvent(Nip01Event event) { factory FileMetadata.fromTags(List<List<String>> tags) {
final event = Nip01Event(pubKey: "", kind: 1, tags: tags, content: "");
return FileMetadata( return FileMetadata(
fileType: event.getFirstTag('file-type'), fileType: event.getFirstTag('file-type'),
filename: event.getFirstTag('filename'), filename: event.getFirstTag('filename'),
@@ -1 +1,31 @@
void main() {} import 'dart:typed_data';
import 'package:file_transfer_sdk/src/functions/fetch_blob.dart';
import 'package:file_transfer_sdk/src/functions/fetch_file_metdata.dart';
import 'package:file_transfer_sdk/src/functions/share_file.dart';
import 'package:ndk/ndk.dart';
import 'package:ndk/shared/nips/nip01/bip340.dart';
import 'package:test/test.dart';
void main() {
test("First test", () async {
final ndk = Ndk(
NdkConfig(eventVerifier: Bip340EventVerifier(), cache: MemCacheManager()),
);
final keyPair = Bip340.generatePrivateKey();
ndk.accounts.loginPrivateKey(
pubkey: keyPair.publicKey,
privkey: keyPair.privateKey!,
);
final originalData = Uint8List.fromList('Hello, World!'.codeUnits);
final share = await shareFile(ndk: ndk, bytes: originalData);
final fileMetadata = await fetchFileMetadata(ndk: ndk, sharedFile: share);
final fetchedData = await fetchBlob(ndk: ndk, fileMetadata: fileMetadata);
expect(fetchedData, originalData);
});
}