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;
}
// 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');