aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2026-02-14 11:17:44 -0500
committerAdrien Hopkins <[email protected]>2026-02-14 11:24:21 -0500
commit5b81820f2d3d1d278e02c7858f17c8f69232d8ec (patch)
tree535f8b5da16db3f23771cb9266321a8dc07bfc9c /src/lib
parent45fcf3586e5e553a71fe5395da051e424069bd4c (diff)
downloadcoinos-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.ts35
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]);
}