From 2d02a20f991d5af6b2ccbb0162557214aa32ee3a Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Wed, 29 Oct 2025 21:26:59 +0100 Subject: [PATCH] Fix birthday reset to 0 when restoring wallet from credentials MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivations :** - Le birthday était réinitialisé à 0 lors de la restauration des clés depuis les credentials dans pairing - Le device en mémoire ne contenait pas le birthday, seulement le device en base de données - Le wallet debugging info affichait birthday: 0 alors que birthday-setup avait été fait avec succès **Modifications :** - service.ts : ensureWalletKeysAvailable() restaure maintenant le device complet depuis la base de données - service.ts : Injection des clés depuis les credentials dans le device de la base de données (qui contient birthday, last_scan) - service.ts : Vérification que le birthday est préservé après restauration avec logs de débogage **Pages affectées :** - src/services/service.ts : Correction de la restauration du device avec préservation du birthday --- src/services/service.ts | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/services/service.ts b/src/services/service.ts index 5abde00..da33e70 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -1688,31 +1688,40 @@ export default class Services { return; } - // Si les clés ne sont pas disponibles, essayer de les restaurer depuis les credentials - console.log('🔐 Wallet keys not in memory, attempting to restore from credentials...'); + // Si les clés ne sont pas disponibles, restaurer le device complet depuis la base de données + console.log('🔐 Wallet keys not in memory, restoring full device from database...'); try { + // Récupérer le device complet depuis la base de données (contient birthday, last_scan, etc.) + const deviceFromDb = await this.getDeviceFromDatabase(); + if (!deviceFromDb?.sp_wallet) { + throw new Error('Device not found in database'); + } + + console.log(`🔍 Device from database - birthday: ${deviceFromDb.sp_wallet.birthday}, last_scan: ${deviceFromDb.sp_wallet.last_scan}`); + + // Récupérer les credentials pour injecter les clés const { SecureCredentialsService } = await import('./secure-credentials.service'); const secureCredentialsService = SecureCredentialsService.getInstance(); - - // Récupérer les credentials const credentials = await secureCredentialsService.retrieveCredentials(''); if (!credentials) { throw new Error('No credentials found'); } - // Restaurer les clés dans le device en mémoire - if (device.sp_wallet) { - device.sp_wallet.spend_key = credentials.spendKey; - device.sp_wallet.scan_key = credentials.scanKey; + // Injecter les clés depuis les credentials dans le device de la base de données + deviceFromDb.sp_wallet.spend_key = credentials.spendKey; + deviceFromDb.sp_wallet.scan_key = credentials.scanKey; - // Restaurer le device avec les clés - this.restoreDevice(device); + // Restaurer le device complet avec toutes les informations (birthday, last_scan, clés) + this.restoreDevice(deviceFromDb); - console.log('✅ Wallet keys restored from credentials'); - } else { - throw new Error('No wallet in device to restore keys to'); + // Vérifier que le birthday est bien préservé après restauration + const deviceAfterRestore = this.dumpDeviceFromMemory(); + if (deviceAfterRestore?.sp_wallet?.birthday !== deviceFromDb.sp_wallet.birthday) { + console.warn(`⚠️ Birthday mismatch after restore - expected: ${deviceFromDb.sp_wallet.birthday}, got: ${deviceAfterRestore?.sp_wallet?.birthday}`); } + + console.log('✅ Full device restored from database with credentials keys'); } catch (credentialError) { console.error('❌ Failed to restore wallet keys from credentials:', credentialError); throw new Error('❌ Wallet keys not available - WebAuthn decryption required');