|
|
|
@ -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<string | null> => {
|
|
|
|
|
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<UserAppData | null> => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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<{
|
|
|
|
|