Fix birthday reset to 0 when restoring wallet from credentials

**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
This commit is contained in:
NicolasCantu 2025-10-29 21:26:59 +01:00
parent c78d1a5909
commit 2d02a20f99

View File

@ -1688,31 +1688,40 @@ export default class Services {
return; return;
} }
// Si les clés ne sont pas disponibles, essayer de les restaurer depuis les 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, attempting to restore from credentials...'); console.log('🔐 Wallet keys not in memory, restoring full device from database...');
try { 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 } = await import('./secure-credentials.service');
const secureCredentialsService = SecureCredentialsService.getInstance(); const secureCredentialsService = SecureCredentialsService.getInstance();
// Récupérer les credentials
const credentials = await secureCredentialsService.retrieveCredentials(''); const credentials = await secureCredentialsService.retrieveCredentials('');
if (!credentials) { if (!credentials) {
throw new Error('No credentials found'); throw new Error('No credentials found');
} }
// Restaurer les clés dans le device en mémoire // Injecter les clés depuis les credentials dans le device de la base de données
if (device.sp_wallet) { deviceFromDb.sp_wallet.spend_key = credentials.spendKey;
device.sp_wallet.spend_key = credentials.spendKey; deviceFromDb.sp_wallet.scan_key = credentials.scanKey;
device.sp_wallet.scan_key = credentials.scanKey;
// Restaurer le device avec les clés // Restaurer le device complet avec toutes les informations (birthday, last_scan, clés)
this.restoreDevice(device); this.restoreDevice(deviceFromDb);
console.log('✅ Wallet keys restored from credentials'); // Vérifier que le birthday est bien préservé après restauration
} else { const deviceAfterRestore = this.dumpDeviceFromMemory();
throw new Error('No wallet in device to restore keys to'); 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) { } catch (credentialError) {
console.error('❌ Failed to restore wallet keys from credentials:', credentialError); console.error('❌ Failed to restore wallet keys from credentials:', credentialError);
throw new Error('❌ Wallet keys not available - WebAuthn decryption required'); throw new Error('❌ Wallet keys not available - WebAuthn decryption required');