/** * Utilitaires pour vérifier les prérequis de l'application * Centralise la logique de vérification pour éviter la duplication */ import { SecureCredentialsService } from '../services/secure-credentials.service'; import { DeviceReaderService } from '../services/device-reader.service'; export type SecurityMode = 'none' | 'otp' | 'password' | 'os' | 'proton-pass'; const ALL_SECURITY_MODES: SecurityMode[] = ['none', 'otp', 'password', 'os', 'proton-pass']; /** * Vérifie si une clé PBKDF2 existe dans le store pbkdf2keys * @returns La clé PBKDF2 trouvée et le mode de sécurité associé, ou null si aucune clé n'est trouvée */ export async function checkPBKDF2Key(): Promise<{ key: string; mode: SecurityMode } | null> { const secureCredentialsService = SecureCredentialsService.getInstance(); for (const mode of ALL_SECURITY_MODES) { try { const hasKey = await secureCredentialsService.hasPBKDF2Key(mode); if (hasKey) { const key = await secureCredentialsService.retrievePBKDF2Key(mode); if (key) { console.log(`✅ PBKDF2 key found in pbkdf2keys store for security mode: ${mode}`); return { key, mode }; } } } catch (error) { // Continue to next mode console.log(`⚠️ No PBKDF2 key found in pbkdf2keys store for mode ${mode}`); } } return null; } /** * Vérifie si le wallet existe en base de données avec retries pour gérer la synchronisation * @param maxAttempts Nombre maximum de tentatives * @param delayMs Délai entre les tentatives en millisecondes * @returns Le wallet trouvé ou null si non trouvé après toutes les tentatives */ export async function checkWalletWithRetries( maxAttempts: number = 5, delayMs: number = 500 ): Promise { const deviceReader = DeviceReaderService.getInstance(); for (let attempt = 0; attempt < maxAttempts; attempt++) { const wallet = await deviceReader.getDeviceFromDatabase(); if (wallet) { if (attempt > 0) { console.log(`✅ Wallet found after ${attempt + 1} attempts`); } return wallet; } if (attempt < maxAttempts - 1) { console.log(`⚠️ Wallet not found, waiting for database synchronization (attempt ${attempt + 1}/${maxAttempts})...`); await new Promise(resolve => setTimeout(resolve, delayMs)); } } console.log(`⚠️ Wallet still not found after ${maxAttempts} attempts`); return null; } /** * Vérifie tous les prérequis nécessaires pour une page * @returns Objet avec les résultats des vérifications */ export async function checkAllPrerequisites(): Promise<{ pbkdf2Key: { key: string; mode: SecurityMode } | null; wallet: any | null; }> { const pbkdf2Key = await checkPBKDF2Key(); const wallet = pbkdf2Key ? await checkWalletWithRetries() : null; return { pbkdf2Key, wallet }; }