aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <[email protected]>2025-09-05 19:43:20 -0500
committerAdrien Hopkins <[email protected]>2025-09-05 19:43:20 -0500
commitfd098a90952269db708f4d2d21de085c968e835e (patch)
treebb355ee885762e27161a77c55ae17a46b93f8323 /src
parent4a2af45b77bb36a81b7f29908b3b320ddb76a769 (diff)
downloadcoinos-ui-fd098a90952269db708f4d2d21de085c968e835e.tar.gz
coinos-ui-fd098a90952269db708f4d2d21de085c968e835e.zip
Remove need for explicit key entry
If window.nostr is available, I don't need the sender's SK, I can do everything with its functions. Otherwise, I'll ask for the SK using getPrivateKey(). The override public key was only for testing, but I still don't need it because I can get the users' private keys from the settings tab.
Diffstat (limited to 'src')
-rw-r--r--src/lib/nip17.ts30
-rw-r--r--src/routes/(app)/dm/[recipient]/+page.svelte40
2 files changed, 29 insertions, 41 deletions
diff --git a/src/lib/nip17.ts b/src/lib/nip17.ts
index e0046d47..6a9888b6 100644
--- a/src/lib/nip17.ts
+++ b/src/lib/nip17.ts
@@ -6,31 +6,33 @@ const TWO_DAYS = 2 * 24 * 60 * 60;
const randomTimestamp = () => Math.floor(
Date.now() / 1000 - Math.random() * TWO_DAYS);
-export const createNIP17Message = async (text: string, senderSK: Uint8Array, receiverPK: string) => {
- const rumour = createRumour(text, senderSK, receiverPK);
- let sealed;
- if (window.nostr) {
- sealed = await sealRumourNip07(rumour, receiverPK);
- } else {
- sealed = sealRumour(rumour, senderSK, receiverPK);
- }
- const wrapped = giftWrap(sealed, receiverPK);
- return wrapped;
+// Create a NIP-17 message using a provided sender secret key.
+export const createNIP17MessageSK = (text: string, senderSK: Uint8Array, receiverPK: string) => {
+ const rumour = createRumour(text, getPublicKey(senderSK), receiverPK);
+ const sealed = sealRumourSK(rumour, senderSK, receiverPK);
+ return giftWrap(sealed, receiverPK);
+}
+
+// Create a NIP-17 message using NIP-07, requiring no sender secret key.
+export const createNIP17MessageNIP07 = async (text: string, senderPK: string, receiverPK: string) => {
+ const rumour = createRumour(text, senderPK, receiverPK);
+ const sealed = await sealRumourNip07(rumour, receiverPK);
+ return giftWrap(sealed, receiverPK);
}
-const createRumour = (text: string, senderSK: Uint8Array, receiverPK: string) => {
+const createRumour = (text: string, senderPK: string, receiverPK: string) => {
const rumour = {
kind: 14, // rumour
created_at: Math.floor(Date.now() / 1000),
tags: [["p", receiverPK]],
- pubkey: getPublicKey(senderSK),
+ pubkey: senderPK,
content: text
};
- rumour.id = getEventHash(rumour);
+ rumour.id = getEventHash(rumour); // do NOT sign rumours!
return rumour;
}
-const sealRumour = (rumour: object, senderSK: Uint8Array, receiverPK: string) => {
+const sealRumourSK = (rumour: object, senderSK: Uint8Array, receiverPK: string) => {
const senderSKString = bytesToHex(senderSK);
const conversationKey = u.getConversationKey(senderSKString, receiverPK);
const encryptedRumour = encrypt(JSON.stringify(rumour), conversationKey);
diff --git a/src/routes/(app)/dm/[recipient]/+page.svelte b/src/routes/(app)/dm/[recipient]/+page.svelte
index 33edfcc6..446a1068 100644
--- a/src/routes/(app)/dm/[recipient]/+page.svelte
+++ b/src/routes/(app)/dm/[recipient]/+page.svelte
@@ -2,33 +2,26 @@
import Icon from "$comp/Icon.svelte";
import { hexToBytes, bytesToHex } from '@noble/hashes/utils';
import * as nip17 from 'nostr-tools/nip17';
- import { createNIP17Message } from '$lib/nip17';
+ import { createNIP17MessageSK, createNIP17MessageNIP07 } from '$lib/nip17';
import { sign, getPrivateKey } from '$lib/nostr';
let { data } = $props();
const { user, recipient } = data;
- let senderSK = $state("");
- let overridePK = $state("");
let text = $state("");
- getPrivateKey(user)
- .then(key => senderSK = bytesToHex(key))
- .catch(console.log);
-
- const btnCreateMessage = () => {
- try {
- const recipientPK = overridePK || recipient.pubkey;
- const skBytes = hexToBytes(senderSK);
- const event = createNIP17Message(text, skBytes, recipientPK);
- event.then(displayEvent);
- } catch (error) {
- console.log(error);
+ const btnCreateMessage = async () => {
+ let event;
+ if (window.nostr) {
+ event = await createNIP17MessageNIP07(
+ text, user.pubkey, recipient.pubkey);
+ } else {
+ const sk = await getPrivateKey(user);
+ event = createNIP17MessageSK(text, sk, recipient.pubkey);
}
- }
- const displayEvent = (event: object) => {
- console.log(JSON.stringify(event));
+ // TODO send event to relays instead of displaying it
+ text = JSON.stringify(event);
}
</script>
@@ -45,17 +38,10 @@
<h1
class="text-5xl font-medium text-left w-full mx-auto lg:mx-0 md:w-[500px]"
>Direct Messages</h1>
- <p><em>Testing Message:</em> You are sending nostr messages to {recipient.username}. Their pubkey is <code>{recipient.pubkey}</code>.</p>
-
- <label for="senderSKInput">(Temp) Sender Secret Key:</label>
- <input id="senderSKInput" bind:value={senderSK}>
-
- <label for="overridePKInput">(Temp) Override Receiver Public Key:</label>
- <input id="overridePKInput" bind:value={overridePK}>
+ <p>You are sending nostr messages to {recipient.username}.</p>
- <label for="message-contents">Message Contents:</label>
<textarea id="message-contents" bind:value={text}></textarea>
- <input type="button" class="btn" value="Send Message" on:click={btnCreateMessage}>
+ <input type="button" class="btn" value="Generate Message" on:click={btnCreateMessage}>
</div>
</div>