diff --git a/.gitea/workflows/release-staging.yaml b/.gitea/workflows/release-staging.yaml index 04f4fd7..3e68d43 100644 --- a/.gitea/workflows/release-staging.yaml +++ b/.gitea/workflows/release-staging.yaml @@ -18,7 +18,7 @@ jobs: node-version: 18 - name: Audit - run: npm audit + run: npm audit --omit=dev - name: Install Dependencies run: npm ci diff --git a/.gitea/workflows/staging-pull-request.yaml b/.gitea/workflows/staging-pull-request.yaml index 2bebcd4..cba8164 100644 --- a/.gitea/workflows/staging-pull-request.yaml +++ b/.gitea/workflows/staging-pull-request.yaml @@ -19,7 +19,7 @@ jobs: node-version: 18 - name: Audit - run: npm audit + run: npm audit --omit=dev - name: Install Dependencies run: npm ci diff --git a/src/utils/nostr.ts b/src/utils/nostr.ts index 9bade2f..eceb8d8 100644 --- a/src/utils/nostr.ts +++ b/src/utils/nostr.ts @@ -11,6 +11,7 @@ import { getEventHash, getPublicKey, kinds, + nip04, nip19, nip44, verifyEvent @@ -30,10 +31,26 @@ import { AuthState, Keys } from '../store/auth/types' import { RelaysState } from '../store/relays/types' import store from '../store/store' import { Meta, SignedEvent, UserAppData } from '../types' -import { getHash } from './hash' +import { getDefaultRelayMap } from './relays' import { parseJson, removeLeadingSlash } from './string' import { timeout } from './utils' -import { getDefaultRelayMap } from './relays' +import { getHash } from './hash' + +/** + * Generates a `d` tag for userAppData + */ +const getDTagForUserAppData = async (): Promise => { + const isLoggedIn = store.getState().auth?.loggedIn + const pubkey = store.getState().auth?.usersPubkey + + if (!isLoggedIn || !pubkey) { + throw new Error( + 'For generating d tag user must be logged in and a valid pubkey should exists in app Store' + ) + } + + return getHash(`938_${pubkey}`) +} /** * @param hexKey hex private or public key @@ -377,13 +394,13 @@ export const getUsersAppData = async (): Promise => { } // Generate an identifier for the user's nip78 - const hash = await getHash('938' + usersPubkey) - if (!hash) return null + const dTag = await getDTagForUserAppData() + if (!dTag) return null // Define a filter for fetching events const filter: Filter = { kinds: [kinds.Application], - '#d': [hash] + '#d': [dTag] } const encryptedContent = await relayController @@ -578,14 +595,14 @@ export const updateUsersAppData = async (meta: Meta) => { if (!encryptedContent) return null // generate the identifier for user's appData event - const hash = await getHash('938' + usersPubkey) - if (!hash) return null + const dTag = await getDTagForUserAppData() + if (!dTag) return null const updatedEvent: UnsignedEvent = { kind: kinds.Application, pubkey: usersPubkey!, created_at: unixNow(), - tags: [['d', hash]], + tags: [['d', dTag]], content: encryptedContent } @@ -693,9 +710,10 @@ const uploadUserAppDataToBlossom = async ( // Convert the private key from hex to bytes const secretKey = hexToBytes(privateKey) // Encrypt the JSON string using the secret key - const encrypted = nip44.v2.encrypt( - stringified, - nip44ConversationKey(secretKey, getPublicKey(secretKey)) + const encrypted = await nip04.encrypt( + secretKey, + getPublicKey(secretKey), + stringified ) // Create a blob from the encrypted data @@ -788,10 +806,7 @@ const getUserAppDataFromBlossom = async (url: string, privateKey: string) => { const pubkey = getPublicKey(secret) // Decrypt the encrypted data using the secret and public key - const decrypted = nip44.v2.decrypt( - encrypted, - nip44ConversationKey(secret, pubkey) - ) + const decrypted = await nip04.decrypt(secret, pubkey, encrypted) // Parse the decrypted JSON content const parsedContent = await parseJson<{ diff --git a/src/utils/relays.ts b/src/utils/relays.ts index c38767c..5b79f3d 100644 --- a/src/utils/relays.ts +++ b/src/utils/relays.ts @@ -30,7 +30,6 @@ const findRelayListAndUpdateCache = async ( authors: [hexKey] } - console.count('findRelayListAndUpdateCache') const event = await relayController.fetchEvent(eventFilter, lookUpRelays) if (event) { await localCache.addUserRelayListMetadata(event)