From 39d57d47493d0daff36ed5423d678622a83d2103 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Wed, 16 Jul 2025 17:16:53 +0200 Subject: [PATCH] handle IMPORT/EXPORT_BACKUP messages --- src/router.ts | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/router.ts b/src/router.ts index 8720137..32c00d3 100755 --- a/src/router.ts +++ b/src/router.ts @@ -11,6 +11,7 @@ import ModalService from './services/modal.service'; import { MessageType } from './models/process.model'; import { splitPrivateData, isValid32ByteHex } from './utils/service.utils'; import { MerkleProofResult } from 'pkg/sdk_client'; +import { isValid } from './models/backup.model'; const routes: { [key: string]: string } = { home: '/src/pages/home/home.html', @@ -805,6 +806,65 @@ export async function registerAllListeners() { } } + const handleExportBackup = async (event: MessageEvent) => { + if (event.data.type !== MessageType.EXPORT_BACKUP) return; + + console.log('handleExportBackup', event.data); + + try { + const { accessToken, password } = event.data; + + if (!accessToken || !(await tokenService.validateToken(accessToken, event.origin))) { + throw new Error('Invalid or expired session token'); + } + + const backup = await services.exportUserDataBackup(password); + + window.parent.postMessage( + { + type: MessageType.BACKUP_RETRIEVED, + backupFile: JSON.stringify(backup), + messageId: event.data.messageId + }, + event.origin + ); + } catch (e) { + const errorMsg = `Failed to export backup: ${e}`; + errorResponse(errorMsg, event.origin, event.data.messageId); + } + } + + const handleImportBackup = async (event: MessageEvent) => { + if (event.data.type !== MessageType.IMPORT_BACKUP) return; + + console.log('handleImportBackup', event.data); + + try { + const { backupFile } = event.data; + + // We don't validate a token here + + const backup = JSON.parse(backupFile); + + if (!isValid(backup)) { + throw new Error('Invalid backup file'); + } + + await services.importUserDataBackup(backup); + + window.parent.postMessage( + { + type: MessageType.BACKUP_IMPORTED, + messageId: event.data.messageId + }, + event.origin + ); + } catch (e) { + const errorMsg = `Failed to import backup: ${e}`; + errorResponse(errorMsg, event.origin, event.data.messageId); + } + } + window.removeEventListener('message', handleMessage); window.addEventListener('message', handleMessage); @@ -856,6 +916,12 @@ export async function registerAllListeners() { case MessageType.VALIDATE_MERKLE_PROOF: await handleValidateMerkleProof(event); break; + case MessageType.EXPORT_BACKUP: + await handleExportBackup(event); + break; + case MessageType.IMPORT_BACKUP: + await handleImportBackup(event); + break; default: console.warn(`Unhandled message type: ${event.data.type}`); }