diff --git a/src/components/device-management/device-management.ts b/src/components/device-management/device-management.ts index feb41a8..0b12934 100644 --- a/src/components/device-management/device-management.ts +++ b/src/components/device-management/device-management.ts @@ -356,6 +356,20 @@ export class DeviceManagementComponent extends HTMLElement { flex: 1.2; min-width: 150px; } + + .import-export .btn-critical { + flex: 1.3; + min-width: 180px; + background: #dc3545; + color: white; + border: 2px solid #dc3545; + font-weight: bold; + } + + .import-export .btn-critical:hover { + background: #c82333; + border-color: #c82333; + }
@@ -376,6 +390,7 @@ export class DeviceManagementComponent extends HTMLElement {
+
@@ -446,6 +461,11 @@ export class DeviceManagementComponent extends HTMLElement { this.exportAccount(); }); + // Critical export button + this.shadowRoot!.getElementById('criticalExportBtn')?.addEventListener('click', () => { + this.criticalExport(); + }); + // Delete account button this.shadowRoot!.getElementById('deleteAccountBtn')?.addEventListener('click', () => { this.deleteAccount(); @@ -643,6 +663,66 @@ export class DeviceManagementComponent extends HTMLElement { } } + async criticalExport() { + // Triple confirmation for critical export + const confirm1 = confirm('🚨 EXPORT CRITIQUE: Cette action va exposer votre CLÉ PRIVÉE.\n\nCette clé permet de signer des transactions sans interaction sur le 2ème device.\n\nÊtes-vous sûr de vouloir continuer ?'); + if (!confirm1) return; + + const confirm2 = confirm('⚠️ SÉCURITÉ: Votre clé privée sera visible en clair.\n\nAssurez-vous que personne ne peut voir votre écran.\n\nContinuer ?'); + if (!confirm2) return; + + const confirm3 = confirm('🔐 DERNIÈRE CONFIRMATION: Cette clé privée donne un accès TOTAL à votre compte.\n\nTapez "EXPORTER" pour confirmer:'); + if (confirm3 !== 'EXPORTER') { + alert('❌ Export critique annulé'); + return; + } + + try { + // Get the device's private key + const device = await this.service.getDeviceFromDatabase(); + if (!device || !device.sp_wallet) { + throw new Error('Device ou clé privée non trouvée'); + } + + // Create critical export data + const criticalData = { + type: 'CRITICAL_EXPORT', + timestamp: new Date().toISOString(), + device_address: device.sp_wallet.address, + private_key: device.sp_wallet.private_key, + pairing_commitment: device.pairing_process_commitment, + warning: 'ATTENTION: Cette clé privée donne un accès total au compte. Gardez-la SECRÈTE et SÉCURISÉE.', + instructions: [ + '1. Sauvegardez cette clé dans un endroit sûr', + '2. Ne la partagez JAMAIS avec qui que ce soit', + '3. Utilisez-la uniquement pour signer des transactions critiques', + '4. En cas de compromission, changez immédiatement votre compte' + ] + }; + + // Create and download the file + const blob = new Blob([JSON.stringify(criticalData, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `critical-export-${Date.now()}.json`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + + this.showStatus('🚨 Export critique généré - Clé privée exposée !', 'error'); + + // Show additional warning + setTimeout(() => { + alert('🚨 EXPORT CRITIQUE TERMINÉ\n\nVotre clé privée a été exportée.\n\n⚠️ GARDEZ CE FICHIER SÉCURISÉ !'); + }, 1000); + + } catch (error) { + this.showStatus(`❌ Erreur lors de l'export critique: ${error}`, 'error'); + } + } + async deleteAccount() { // First confirmation if (!confirm('⚠️ Êtes-vous sûr de vouloir supprimer complètement votre compte ?\n\nCette action est IRRÉVERSIBLE et supprimera :\n• Tous vos processus\n• Toutes vos données\n• Votre wallet\n• Votre historique\n\nTapez "SUPPRIMER" pour confirmer.')) { diff --git a/src/pages/process/process-list-component.ts b/src/pages/process/process-list-component.ts deleted file mode 100644 index 3033515..0000000 --- a/src/pages/process/process-list-component.ts +++ /dev/null @@ -1,49 +0,0 @@ -// import processHtml from './process.html?raw'; -// import processScript from './process.ts?raw'; -// import processCss from '../../4nk.css?raw'; -// import { init } from './process'; - -// export class ProcessListComponent extends HTMLElement { -// _callback: any; -// constructor() { -// super(); -// this.attachShadow({ mode: 'open' }); -// } - -// connectedCallback() { -// console.log('CALLBACK PROCESS LIST PAGE'); -// this.render(); -// setTimeout(() => { -// init(); -// }, 500); -// } - -// set callback(fn) { -// if (typeof fn === 'function') { -// this._callback = fn; -// } else { -// console.error('Callback is not a function'); -// } -// } - -// get callback() { -// return this._callback; -// } - -// render() { -// if (this.shadowRoot) -// this.shadowRoot.innerHTML = ` -// ${processHtml} -//