fix: including signatures in both export and encrypted export
This commit is contained in:
parent
8d8c38e90b
commit
6716c3da63
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user