fix: including signatures in both export and encrypted export

This commit is contained in:
Stixx 2024-12-10 14:42:12 +01:00
parent 8d8c38e90b
commit 6716c3da63
2 changed files with 151 additions and 197 deletions

View File

@ -32,7 +32,8 @@ import {
updateUsersAppData, updateUsersAppData,
findOtherUserMarks, findOtherUserMarks,
timeout, timeout,
processMarks processMarks,
ARRAY_BUFFER
} from '../../utils' } from '../../utils'
import { CurrentUserMark, Mark } from '../../types/mark.ts' import { CurrentUserMark, Mark } from '../../types/mark.ts'
import { import {
@ -46,9 +47,10 @@ import {
getZipWithFiles, getZipWithFiles,
SigitFile SigitFile
} from '../../utils/file.ts' } from '../../utils/file.ts'
import { ARRAY_BUFFER, DEFLATE } from '../../utils' import { DEFLATE } from '../../utils'
import { generateTimestamp } from '../../utils/opentimestamps.ts' import { generateTimestamp } from '../../utils/opentimestamps.ts'
import { MARK_TYPE_CONFIG } from '../../components/MarkTypeStrategy/MarkStrategy.tsx' import { MARK_TYPE_CONFIG } from '../../components/MarkTypeStrategy/MarkStrategy.tsx'
import { getLastSignersSig } from '../../utils/sign.ts'
export const SignPage = () => { export const SignPage = () => {
const navigate = useNavigate() const navigate = useNavigate()
@ -696,124 +698,19 @@ export const SignPage = () => {
} }
const handleExport = async () => { const handleExport = async () => {
if (Object.entries(files).length === 0 || !meta || !usersPubkey) return const arrayBuffer = await prepareZipExport()
setLoadingSpinnerDesc('Generating file')
try {
const zip = await getZipWithFiles(meta, files)
const arrayBuffer = await zip.generateAsync({
type: ARRAY_BUFFER,
compression: DEFLATE,
compressionOptions: {
level: 6
}
})
if (!arrayBuffer) return if (!arrayBuffer) return
const blob = new Blob([arrayBuffer]) const blob = new Blob([arrayBuffer])
saveAs(blob, `exported-${unixNow()}.sigit.zip`) saveAs(blob, `exported-${unixNow()}.sigit.zip`)
} catch (error) {
console.log('error in zip:>> ', error)
if (error instanceof Error) {
toast.error(error.message || 'Error occurred in generating zip file')
}
}
}
/** setIsLoading(false)
* @deprecated
* It's the same as {@link handleExport} but the code is not the same navigate(appPublicRoutes.verify)
* leaving it for the reference }
*/
// const handleExport = async () => {
// if (Object.entries(files).length === 0 || !meta || !usersPubkey) return
//
// const usersNpub = hexToNpub(usersPubkey)
// if (
// !signers.includes(usersNpub) &&
// !viewers.includes(usersNpub) &&
// submittedBy !== usersNpub
// )
// return
//
// setIsLoading(true)
// setLoadingSpinnerDesc('Signing nostr event')
//
// if (!meta) return
//
// const prevSig = getLastSignersSig(meta, signers)
// if (!prevSig) return
//
// const signedEvent = await signEventForMetaFile(
// JSON.stringify({
// prevSig
// }),
// nostrController,
// setIsLoading
// )
//
// if (!signedEvent) return
//
// const exportSignature = JSON.stringify(signedEvent, null, 2)
//
// const stringifiedMeta = JSON.stringify(
// {
// ...meta,
// exportSignature
// },
// null,
// 2
// )
//
// const zip = await getZipWithFiles(meta, files)
// zip.file('meta.json', stringifiedMeta)
//
// const arrayBuffer = await zip
// .generateAsync({
// type: 'arraybuffer',
// compression: 'DEFLATE',
// compressionOptions: {
// level: 6
// }
// })
// .catch((err) => {
// console.log('err in zip:>> ', err)
// setIsLoading(false)
// toast.error(err.message || 'Error occurred in generating zip file')
// return null
// })
//
// if (!arrayBuffer) return
//
// const blob = new Blob([arrayBuffer])
// saveAs(blob, `exported-${unixNow()}.sigit.zip`)
//
// setIsLoading(false)
//
// navigate(appPublicRoutes.verify)
// }
const handleEncryptedExport = async () => { const handleEncryptedExport = async () => {
if (Object.entries(files).length === 0 || !meta) return const arrayBuffer = await prepareZipExport()
const stringifiedMeta = JSON.stringify(meta, null, 2)
const zip = await getZipWithFiles(meta, files)
zip.file('meta.json', stringifiedMeta)
const arrayBuffer = await zip
.generateAsync({
type: 'arraybuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 6
}
})
.catch((err) => {
console.log('err in zip:>> ', err)
setIsLoading(false)
toast.error(err.message || 'Error occurred in generating zip file')
return null
})
if (!arrayBuffer) return if (!arrayBuffer) return
const key = await generateEncryptionKey() const key = await generateEncryptionKey()
@ -825,6 +722,72 @@ export const SignPage = () => {
if (!finalZipFile) return if (!finalZipFile) return
saveAs(finalZipFile, `exported-${unixNow()}.sigit.zip`) saveAs(finalZipFile, `exported-${unixNow()}.sigit.zip`)
setIsLoading(false)
}
const prepareZipExport = async (): Promise<ArrayBuffer | null> => {
if (Object.entries(files).length === 0 || !meta || !usersPubkey)
return Promise.resolve(null)
const usersNpub = hexToNpub(usersPubkey)
if (
!signers.includes(usersNpub) &&
!viewers.includes(usersNpub) &&
submittedBy !== usersNpub
)
return Promise.resolve(null)
setIsLoading(true)
setLoadingSpinnerDesc('Signing nostr event')
if (!meta) return Promise.resolve(null)
const prevSig = getLastSignersSig(meta, signers)
if (!prevSig) return Promise.resolve(null)
const signedEvent = await signEventForMetaFile(
JSON.stringify({
prevSig
}),
nostrController,
setIsLoading
)
if (!signedEvent) return Promise.resolve(null)
const exportSignature = JSON.stringify(signedEvent, null, 2)
const stringifiedMeta = JSON.stringify(
{
...meta,
exportSignature
},
null,
2
)
const zip = await getZipWithFiles(meta, files)
zip.file('meta.json', stringifiedMeta)
const arrayBuffer = await zip
.generateAsync({
type: ARRAY_BUFFER,
compression: DEFLATE,
compressionOptions: {
level: 6
}
})
.catch((err) => {
console.log('err in zip:>> ', err)
setIsLoading(false)
toast.error(err.message || 'Error occurred in generating zip file')
return null
})
if (!arrayBuffer) return Promise.resolve(null)
return Promise.resolve(arrayBuffer)
} }
/** /**

View File

@ -26,7 +26,9 @@ import {
sendNotification, sendNotification,
generateEncryptionKey, generateEncryptionKey,
encryptArrayBuffer, encryptArrayBuffer,
generateKeysFile generateKeysFile,
ARRAY_BUFFER,
DEFLATE
} from '../../utils' } from '../../utils'
import styles from './style.module.scss' import styles from './style.module.scss'
import { useLocation, useParams } from 'react-router-dom' import { useLocation, useParams } from 'react-router-dom'
@ -544,62 +546,6 @@ export const VerifyPage = () => {
setIsLoading(false) setIsLoading(false)
} }
const handleMarkedExport = async () => {
if (Object.entries(files).length === 0 || !meta || !usersPubkey) return
const usersNpub = hexToNpub(usersPubkey)
if (
!signers.includes(usersNpub) &&
!viewers.includes(usersNpub) &&
submittedBy !== usersNpub
) {
return
}
setIsLoading(true)
setLoadingSpinnerDesc('Signing nostr event')
const prevSig = getLastSignersSig(meta, signers)
if (!prevSig) return
const signedEvent = await signEventForMetaFile(
JSON.stringify({ prevSig }),
nostrController,
setIsLoading
)
if (!signedEvent) return
const exportSignature = JSON.stringify(signedEvent, null, 2)
const updatedMeta = { ...meta, exportSignature }
const stringifiedMeta = JSON.stringify(updatedMeta, null, 2)
const zip = await getZipWithFiles(updatedMeta, files)
zip.file('meta.json', stringifiedMeta)
const arrayBuffer = await zip
.generateAsync({
type: 'arraybuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 6
}
})
.catch((err) => {
console.log('err in zip:>> ', err)
setIsLoading(false)
toast.error(err.message || 'Error occurred in generating zip file')
return null
})
if (!arrayBuffer) return
const blob = new Blob([arrayBuffer])
saveAs(blob, `exported-${unixNow()}.sigit.zip`)
setIsLoading(false)
}
// Handle errors during zip file generation // Handle errors during zip file generation
const handleZipError = (err: unknown) => { const handleZipError = (err: unknown) => {
console.log('Error in zip:>> ', err) console.log('Error in zip:>> ', err)
@ -678,29 +624,18 @@ export const VerifyPage = () => {
}) })
} }
const handleEncryptedExport = async () => { const handleExport = async () => {
if (Object.entries(files).length === 0 || !meta) return const arrayBuffer = await prepareZipExport()
if (!arrayBuffer) return
const stringifiedMeta = JSON.stringify(meta, null, 2) const blob = new Blob([arrayBuffer])
const zip = await getZipWithFiles(meta, files) saveAs(blob, `exported-${unixNow()}.sigit.zip`)
zip.file('meta.json', stringifiedMeta)
const arrayBuffer = await zip
.generateAsync({
type: 'arraybuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 6
}
})
.catch((err) => {
console.log('err in zip:>> ', err)
setIsLoading(false) setIsLoading(false)
toast.error(err.message || 'Error occurred in generating zip file') }
return null
})
const handleEncryptedExport = async () => {
const arrayBuffer = await prepareZipExport()
if (!arrayBuffer) return if (!arrayBuffer) return
const key = await generateEncryptionKey() const key = await generateEncryptionKey()
@ -712,6 +647,62 @@ export const VerifyPage = () => {
if (!finalZipFile) return if (!finalZipFile) return
saveAs(finalZipFile, `exported-${unixNow()}.sigit.zip`) saveAs(finalZipFile, `exported-${unixNow()}.sigit.zip`)
setIsLoading(false)
}
const prepareZipExport = async (): Promise<ArrayBuffer | null> => {
if (Object.entries(files).length === 0 || !meta || !usersPubkey)
return Promise.resolve(null)
const usersNpub = hexToNpub(usersPubkey)
if (
!signers.includes(usersNpub) &&
!viewers.includes(usersNpub) &&
submittedBy !== usersNpub
) {
return Promise.resolve(null)
}
setIsLoading(true)
setLoadingSpinnerDesc('Signing nostr event')
const prevSig = getLastSignersSig(meta, signers)
if (!prevSig) return Promise.resolve(null)
const signedEvent = await signEventForMetaFile(
JSON.stringify({ prevSig }),
nostrController,
setIsLoading
)
if (!signedEvent) return Promise.resolve(null)
const exportSignature = JSON.stringify(signedEvent, null, 2)
const updatedMeta = { ...meta, exportSignature }
const stringifiedMeta = JSON.stringify(updatedMeta, null, 2)
const zip = await getZipWithFiles(updatedMeta, files)
zip.file('meta.json', stringifiedMeta)
const arrayBuffer = await zip
.generateAsync({
type: ARRAY_BUFFER,
compression: DEFLATE,
compressionOptions: {
level: 6
}
})
.catch((err) => {
console.log('err in zip:>> ', err)
setIsLoading(false)
toast.error(err.message || 'Error occurred in generating zip file')
return null
})
if (!arrayBuffer) return Promise.resolve(null)
return Promise.resolve(arrayBuffer)
} }
return ( return (
@ -757,7 +748,7 @@ export const VerifyPage = () => {
)} )}
currentFile={currentFile} currentFile={currentFile}
setCurrentFile={setCurrentFile} setCurrentFile={setCurrentFile}
handleExport={handleMarkedExport} handleExport={handleExport}
handleEncryptedExport={handleEncryptedExport} handleEncryptedExport={handleEncryptedExport}
/> />
) )