Download backup file

This commit is contained in:
Sosthene00 2024-12-30 15:14:37 +01:00
parent 5fe5493548
commit bb70f092d5
4 changed files with 77 additions and 2 deletions

View File

@ -24,7 +24,7 @@
<div class="menu-content" id="menu"> <div class="menu-content" id="menu">
<!-- <a onclick="unpair()">Revoke</a> --> <!-- <a onclick="unpair()">Revoke</a> -->
<a onclick="importJSON()">Import</a> <a onclick="importJSON()">Import</a>
<a onclick="importJSON()">Export</a> <a onclick="createBackUp()">Export</a>
<a onclick="navigate('account')">Account</a> <a onclick="navigate('account')">Account</a>
<a onclick="navigate('chat')">Chat</a> <a onclick="navigate('chat')">Chat</a>
<a onclick="navigate('signature')">Signatures</a> <a onclick="navigate('signature')">Signatures</a>

View File

@ -151,3 +151,31 @@ async function importJSON() {
} }
(window as any).importJSON = importJSON; (window as any).importJSON = importJSON;
async function createBackUp() {
const service = await Services.getInstance();
const backUp = await service.createBackUp();
if (!backUp) {
console.error("No device to backup");
return;
}
try {
const backUpJson = JSON.stringify(backUp, null, 2)
const blob = new Blob([backUpJson], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '4nk-backup.json';
a.click();
URL.revokeObjectURL(url);
console.log('Backup successfully prepared for download');
} catch (e) {
console.error(e);
}
}
(window as any).createBackUp = createBackUp;

View File

@ -0,0 +1,7 @@
import { Device, Process, SecretsStore } from "pkg/sdk_client";
export interface BackUp {
device: Device,
secrets: SecretsStore,
processes: Record<string, Process>,
}

View File

@ -3,10 +3,11 @@ import { INotification } from '~/models/notification.model';
import { IProcess } from '~/models/process.model'; import { IProcess } from '~/models/process.model';
// import Database from './database'; // import Database from './database';
import { initWebsocket, sendMessage } from '../websockets'; import { initWebsocket, sendMessage } from '../websockets';
import { ApiReturn, Member, Process, RoleDefinition, UserDiff } from '../../pkg/sdk_client'; import { ApiReturn, Device, Member, Process, RoleDefinition, SecretsStore, UserDiff } from '../../pkg/sdk_client';
import ModalService from './modal.service'; import ModalService from './modal.service';
import Database from './database.service'; import Database from './database.service';
import { storeData, retrieveData } from './storage.service'; import { storeData, retrieveData } from './storage.service';
import { BackUp } from '~/models/backup.model';
export const U32_MAX = 4294967295; export const U32_MAX = 4294967295;
@ -146,6 +147,19 @@ export default class Services {
return await db.getObject('shared_secrets', address); return await db.getObject('shared_secrets', address);
} }
public async getAllSecrets(): Promise<SecretsStore> {
const db = await Database.getInstance();
const sharedSecrets = await db.dumpStore('shared_secrets');
const unconfirmedSecrets = await db.dumpStore('unconfirmed_secrets'); // keys are numeric values
const secretsStore = {
shared_secrets: sharedSecrets,
unconfirmed_secrets: Object.values(unconfirmedSecrets),
};
return secretsStore;
}
public async connectMember(members: Member[]): Promise<ApiReturn> { public async connectMember(members: Member[]): Promise<ApiReturn> {
if (members.length === 0) { if (members.length === 0) {
throw new Error('Trying to connect to empty members list'); throw new Error('Trying to connect to empty members list');
@ -675,6 +689,32 @@ export default class Services {
return Promise.resolve(); return Promise.resolve();
} }
public async createBackUp(): Promise<BackUp | null> {
// Get the device from indexedDB
const deviceStr = await this.getDeviceFromDatabase();
if (!deviceStr) {
console.error('No device loaded');
return null;
}
const device: Device = JSON.parse(deviceStr);
// Get the processes
const processes = await this.getProcesses();
// Get the shared secrets
const secrets = await this.getAllSecrets();
// Create a backup object
const backUp = {
device: device,
secrets: secrets,
processes: processes,
};
return backUp;
}
// Device 1 wait Device 2 // Device 1 wait Device 2
public device1: boolean = false; public device1: boolean = false;
public device2Ready: boolean = false; public device2Ready: boolean = false;