fix: only file share creator can delete it
This commit is contained in:
@@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user