diff options
| author | Adrien Hopkins <[email protected]> | 2026-02-14 11:17:44 -0500 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-02-14 17:50:53 -0800 |
| commit | 5323057a68c1e2607128a3b216a767802725c52c (patch) | |
| tree | b1b122478258023c56cc7f2cf3e02ea80da28860 /src/lib | |
| parent | 1baa0612d5fe9779a205db34564c2a10453ddc07 (diff) | |
| download | coinos-ui-5323057a68c1e2607128a3b216a767802725c52c.tar.gz coinos-ui-5323057a68c1e2607128a3b216a767802725c52c.zip | |
Create only one event when sending DM to self
Normally, the system creates two identical events: one encrypted to the
sender and one to the recipient. If those are the same (i.e. you send a
message to yourself), this creates two identical messages.
The gift-wraps already give the two different events different pubkeys,
created_at times, IDs and tags, so there should be no way to associate
them with each other. Therefore, this change should not allow attackers
to see that a message is sent to oneself by looking for a matching one.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/nip17.ts | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts index 850b2474..d0b32d78 100644 --- a/src/lib/nip17.ts +++ b/src/lib/nip17.ts @@ -351,37 +351,32 @@ const publishToPreferred = async ( } }; +const createAndPublishMessageEvent = async (sk: Uint8Array | null, message: string, userPK: string, recipientPK: string, eventFor: string, expiryDays?: number) => { + let event; + if (sk === null) { + event = await createNIP17MessageNIP07(message, userPK, recipientPK, eventFor, expiryDays); + } else { + event = createNIP17MessageSK(message, sk, recipientPK, eventFor, expiryDays); + } + return publishToPreferred(event, eventFor, expiryDays != null); +}; + // Sends a NIP-17 message from `user` to `recipient`. // If expiryDays is set, messages will expire after that many days. export const send = async (message: string, user: any, recipient: any, expiryDays?: number) => { - let event1, event2; const sk = await ensureSigner(user.pubkey); // Store sk for auth handler currentSk = sk; - if (sk === null) { - // Use NIP-07 extension - event1 = await createNIP17MessageNIP07( - message, - user.pubkey, - recipient.pubkey, - recipient.pubkey, - expiryDays, - ); - event2 = await createNIP17MessageNIP07( - message, - user.pubkey, - recipient.pubkey, - user.pubkey, - expiryDays, - ); + if (user.pubkey === recipient.pubkey) { + return createAndPublishMessageEvent( + sk, message, user.pubkey, recipient.pubkey, user.pubkey, expiryDays); } else { - event1 = createNIP17MessageSK(message, sk, recipient.pubkey, recipient.pubkey, expiryDays); - event2 = createNIP17MessageSK(message, sk, recipient.pubkey, user.pubkey, expiryDays); + const p1 = createAndPublishMessageEvent( + sk, message, user.pubkey, recipient.pubkey, recipient.pubkey, expiryDays); + const p2 = createAndPublishMessageEvent( + sk, message, user.pubkey, recipient.pubkey, user.pubkey, expiryDays); + return Promise.all([p1, p2]); } - - const p1 = publishToPreferred(event1, recipient.pubkey, expiryDays != null); - const p2 = publishToPreferred(event2, user.pubkey, expiryDays != null); - return Promise.all([p1, p2]); }; |
