diff --git a/src/services/service.ts b/src/services/service.ts index 129da43..9dd05ef 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -35,6 +35,7 @@ export default class Services { private currentBlockHeight: number = -1; private relayReadyResolver: (() => void) | null = null; private relayReadyPromise: Promise | null = null; + private secretsAreCompromised: boolean = false; // Private constructor to prevent direct instantiation from outside private constructor() {} @@ -407,6 +408,12 @@ export default class Services { const sp_addresses = member.sp_addresses; if (!sp_addresses || sp_addresses.length === 0) continue; + if (this.secretsAreCompromised) { + console.warn(`[findUnconnectedAddresses] 🚩 Flag 'secretsAreCompromised' détecté. Forçage de la reconnexion pour ${address}.`); + unconnected.add(address); + continue; // Important: passe au membre suivant + } + for (const address of sp_addresses) { if (address === myAddress) continue; // On s'ignore soi-même @@ -415,6 +422,11 @@ export default class Services { } } } + + if (this.secretsAreCompromised && unconnected.size > 0) { + console.log("[findUnconnectedAddresses] 🚩 Drapeau 'secretsAreCompromised' réinitialisé car une reconnexion va être tentée."); + this.secretsAreCompromised = false; + } return unconnected; } @@ -782,34 +794,26 @@ export default class Services { const membersList = this.getAllMembers(); const processes = await this.getProcesses(); try { - // console.debug('[Services:parseCipher] 🤫 Tentative de déchiffrement du message...'); + console.debug('[Services:parseCipher] 🤫 Tentative de déchiffrement du message...'); const apiReturn = this.sdkClient.parse_cipher(message, membersList, processes); - // console.debug('[Services:parseCipher] ✅ Message déchiffré, traitement...'); + console.debug('[Services:parseCipher] ✅ Message déchiffré, traitement...'); await this.handleApiReturn(apiReturn); + + // Si le déchiffrement réussit, c'est que nos secrets sont bons. + // On réinitialise le drapeau (au cas où il était levé). + if (this.secretsAreCompromised) { + console.log("[Services:parseCipher] ✅ Le déchiffrement a réussi. Réinitialisation du drapeau 'secretsAreCompromised'."); + this.secretsAreCompromised = false; + } } catch (e) { console.error(`[Services:parseCipher] 💥 Échec critique du déchiffrement: ${e}`); - console.warn(`[Services:parseCipher] Impossible de déchiffrer un message entrant.`); - console.warn(`[Services:parseCipher] Contrainte d'anonymat: L'expéditeur est inconnu, impossible d'invalider un seul secret.`); - console.warn(`[Services:parseCipher] ACTION: Réinitialisation de TOUS les secrets pour forcer une reconnexion...`); - - // Appel de la "bombe" pour casser la boucle de secrets périmés - await this.clearSecretsFromDB(); - - console.warn(`[Services:parseCipher] ACTION: Forçage d'une reconnexion à tous les processus connus...`); - try { - // On récupère tous les processus qu'on connaît - const allProcesses = await this.getProcesses(); - - for (const process of Object.values(allProcesses)) { - // On force la vérification des connexions. - // Comme les secrets sont vides, 'ensureConnections' va (via 'findUnconnectedAddresses') - // appeler 'connectAddresses' et recréer les secrets. - await this.ensureConnections(process); - } - console.log('[Services:parseCipher] ✅ Resynchronisation des secrets terminée.'); - } catch (reconnectError) { - console.error('[Services:parseCipher] 💥 Échec lors de la tentative de reconnexion post-nettoyage:', reconnectError); - } + console.warn(`[Services:parseCipher] Contrainte d'anonymat: L'expéditeur est inconnu.`); + + // --- 🚨 NOUVELLE LOGIQUE 🚨 --- + // On ne supprime rien. On lève juste un drapeau pour + // forcer 'ensureConnections' à se méfier de la BDD. + console.warn(`[Services:parseCipher] 🚩 ACTION: Levée du drapeau 'secretsAreCompromised'.`); + this.secretsAreCompromised = true; } } @@ -1659,19 +1663,6 @@ export default class Services { } } - // --- AMÉLIORATION: Ajout de logs clairs --- - public async clearSecretsFromDB() { - console.warn('[Services:clearSecretsFromDB] 💣 Réinitialisation de TOUS les secrets (partagés et non confirmés)...'); - const db = await Database.getInstance(); - try { - await db.clearStore('shared_secrets'); - await db.clearStore('unconfirmed_secrets'); - console.warn('[Services:clearSecretsFromDB] ✅ Magasins de secrets vidés.'); - } catch (e) { - console.error('[Services:clearSecretsFromDB] 💥 Échec de la suppression des secrets:', e); - } - } - public async restoreSecretsFromBackUp(secretsStore: SecretsStore) { console.log('[Services:restoreSecretsFromBackUp] 💾 Restauration des secrets depuis un backup...'); const db = await Database.getInstance();