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,
privkey: keyPair.privateKey!,
);
await ndkFlutter.saveAccountsState();
}
runApp(const MainApp());
@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:ndk/ndk.dart';
import 'package:ndk/shared/nips/nip01/bip340.dart';
Future<Nip01Event> createEvent({
required Ndk ndk,
@@ -9,32 +10,32 @@ Future<Nip01Event> 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;
}
@@ -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<FileMetadata> 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<FileMetadata> 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<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,
});
factory FileMetadata.fromEvent(Nip01Event event) {
factory FileMetadata.fromTags(List<List<String>> tags) {
final event = Nip01Event(pubKey: "", kind: 1, tags: tags, content: "");
return FileMetadata(
fileType: event.getFirstTag('file-type'),
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);
});
}