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