From dcf552301281ca4a9f49b16a8594bbd981a4d828 Mon Sep 17 00:00:00 2001 From: Gringo Date: Tue, 3 Mar 2026 15:21:35 +0100 Subject: [PATCH] fix: only file share creator can delete it --- lib/main.dart | 2 + .../lib/src/functions/create_event.dart | 45 ++++++++++--------- .../lib/src/functions/fetch_file_metdata.dart | 24 ++++++---- .../lib/src/models/file_metadata.dart | 4 +- .../test/file_transfer_sdk_test.dart | 32 ++++++++++++- 5 files changed, 74 insertions(+), 33 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index a1fa03a..2ff6a08 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -33,6 +33,8 @@ void main() async { pubkey: keyPair.publicKey, privkey: keyPair.privateKey!, ); + + await ndkFlutter.saveAccountsState(); } runApp(const MainApp()); diff --git a/packages/file_transfer_sdk/lib/src/functions/create_event.dart b/packages/file_transfer_sdk/lib/src/functions/create_event.dart index a40262a..cbf160b 100644 --- a/packages/file_transfer_sdk/lib/src/functions/create_event.dart +++ b/packages/file_transfer_sdk/lib/src/functions/create_event.dart @@ -1,5 +1,6 @@ +import 'dart:convert'; + import 'package:ndk/ndk.dart'; -import 'package:ndk/shared/nips/nip01/bip340.dart'; Future createEvent({ required Ndk ndk, @@ -9,32 +10,32 @@ Future createEvent({ required String nonce, String? filename, }) async { - final keyPair = Bip340.generatePrivateKey(); - final signer = Bip340EventSigner( - privateKey: keyPair.privateKey, - publicKey: keyPair.publicKey, + final fileMetadata = [ + if (descriptor.type != null) ["file-type", descriptor.type!], + 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()], + ]; + + final signer = ndk.accounts.getLoggedAccount()!.signer; + final content = await ndk.accounts.getLoggedAccount()!.signer.encryptNip44( + plaintext: jsonEncode(fileMetadata), + recipientPubKey: recipientPubkey, ); - final rumor = Nip01Event( - pubKey: signer.publicKey, - kind: 15, + final event = Nip01Event( + pubKey: signer.getPublicKey(), + kind: 1515, tags: [ - if (descriptor.type != null) ["file-type", descriptor.type!], - 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()], + ["p", recipientPubkey], ], - content: descriptor.url, + content: content!, ); - final giftwrap = await ndk.giftWrap.toGiftWrap( - rumor: rumor, - recipientPubkey: recipientPubkey, - customSigner: signer, - ); + final signedEvent = await signer.sign(event); - return giftwrap; + return signedEvent; } diff --git a/packages/file_transfer_sdk/lib/src/functions/fetch_file_metdata.dart b/packages/file_transfer_sdk/lib/src/functions/fetch_file_metdata.dart index 016de45..538efc9 100644 --- a/packages/file_transfer_sdk/lib/src/functions/fetch_file_metdata.dart +++ b/packages/file_transfer_sdk/lib/src/functions/fetch_file_metdata.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:file_transfer_sdk/file_transfer_sdk.dart'; import 'package:ndk/ndk.dart'; import 'package:ndk/shared/nips/nip01/bip340.dart'; @@ -12,14 +14,14 @@ Future fetchFileMetadata({ filter: Filter(ids: [decodedNevent.eventId]), ); - Nip01Event? giftWrap; - await for (var event in query.stream) { - if (event.id != decodedNevent.eventId) continue; - giftWrap = event; + Nip01Event? event; + await for (var e in query.stream) { + if (e.id != decodedNevent.eventId) continue; + event = e; break; } - if (giftWrap == null) throw Exception("Event not found"); + if (event == null) throw Exception("Event not found"); final privateKey = Nip19.decode(sharedFile.encodedPrivateKey); final publicKey = Bip340.getPublicKey(privateKey); @@ -28,10 +30,14 @@ Future fetchFileMetadata({ publicKey: publicKey, ); - final event = await ndk.giftWrap.fromGiftWrap( - giftWrap: giftWrap, - customSigner: signer, + final decryptedContent = await signer.decryptNip44( + ciphertext: event.content, + senderPubKey: event.pubKey, ); - return FileMetadata.fromEvent(event); + List> tags = (jsonDecode(decryptedContent!) as List) + .map((tag) => List.from(tag as List)) + .toList(); + + return FileMetadata.fromTags(tags); } diff --git a/packages/file_transfer_sdk/lib/src/models/file_metadata.dart b/packages/file_transfer_sdk/lib/src/models/file_metadata.dart index 438a867..cf6c11f 100644 --- a/packages/file_transfer_sdk/lib/src/models/file_metadata.dart +++ b/packages/file_transfer_sdk/lib/src/models/file_metadata.dart @@ -19,7 +19,9 @@ class FileMetadata { required this.size, }); - factory FileMetadata.fromEvent(Nip01Event event) { + factory FileMetadata.fromTags(List> tags) { + final event = Nip01Event(pubKey: "", kind: 1, tags: tags, content: ""); + return FileMetadata( fileType: event.getFirstTag('file-type'), filename: event.getFirstTag('filename'), diff --git a/packages/file_transfer_sdk/test/file_transfer_sdk_test.dart b/packages/file_transfer_sdk/test/file_transfer_sdk_test.dart index ab73b3a..4d9e77b 100644 --- a/packages/file_transfer_sdk/test/file_transfer_sdk_test.dart +++ b/packages/file_transfer_sdk/test/file_transfer_sdk_test.dart @@ -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); + }); +}