Adding secretsAreCompromised flag

This commit is contained in:
NicolasCantu 2025-11-05 01:59:23 +01:00
parent af3503db86
commit 8cc016c2a5

View File

@ -35,6 +35,7 @@ export default class Services {
private currentBlockHeight: number = -1;
private relayReadyResolver: (() => void) | null = null;
private relayReadyPromise: Promise<void> | 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();