diff options
| author | Adrien Hopkins <[email protected]> | 2026-02-14 11:17:44 -0500 |
|---|---|---|
| committer | Adrien Hopkins <[email protected]> | 2026-02-14 11:24:21 -0500 |
| commit | 5b81820f2d3d1d278e02c7858f17c8f69232d8ec (patch) | |
| tree | 535f8b5da16db3f23771cb9266321a8dc07bfc9c /src/lib | |
| parent | 45fcf3586e5e553a71fe5395da051e424069bd4c (diff) | |
| download | coinos-ui-5b81820f2d3d1d278e02c7858f17c8f69232d8ec.tar.gz coinos-ui-5b81820f2d3d1d278e02c7858f17c8f69232d8ec.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 | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts index 9a6d01f6..b8352d1e 100644 --- a/src/lib/nip17.ts +++ b/src/lib/nip17.ts @@ -313,6 +313,19 @@ const publishToPreferred = async (event: object, pubkey: string, expiryEnabled: } } +const createAndPublishMessageEvent = async (sk: Uint8Array, message: string, userPK: string, recipientPK: string, eventFor: string, expiryDays?: number) => { + let event; + if (sk === null) { // Use NIP-07 extension + event = await createNIP17MessageNIP07( + message, userPK, recipientPK, eventFor, expiryDays); + } else { + event1 = 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: object, recipient: object, expiryDays?: number) => { @@ -322,20 +335,14 @@ export const send = async (message: string, user: object, recipient: object, exp // 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]); } |
