From bd0e3b9114e1261f2beed4f793f8b7d51b409f3f Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Fri, 7 Nov 2025 19:54:49 +0100 Subject: [PATCH] Grouped the logs for decryptAttribute func --- src/services/service.ts | 184 ++++++++++++++++++++++------------------ 1 file changed, 101 insertions(+), 83 deletions(-) diff --git a/src/services/service.ts b/src/services/service.ts index 9dd05ef..6e1f0ac 100755 --- a/src/services/service.ts +++ b/src/services/service.ts @@ -425,7 +425,7 @@ 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; + this.secretsAreCompromised = false; } return unconnected; } @@ -808,8 +808,7 @@ export default class Services { } catch (e) { console.error(`[Services:parseCipher] 💥 Échec critique du déchiffrement: ${e}`); 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'.`); @@ -817,7 +816,6 @@ export default class Services { } } - // --- AMÉLIORATION: Refactorisé en sous-fonctions --- async parseNewTx(newTxMsg: string) { console.log('[Services:parseNewTx] 📄 Nouveau message NewTx reçu.'); const parsedMsg: NewTxMessage = JSON.parse(newTxMsg); @@ -1714,99 +1712,119 @@ export default class Services { } async decryptAttribute(processId: string, state: ProcessState, attribute: string): Promise { - console.log(`[Services:decryptAttribute] 🔑 Tentative de déchiffrement de l'attribut '${attribute}' pour le processus ${processId}`); - let hash = state.pcd_commitment[attribute]; - if (!hash) { - console.warn(`[Services:decryptAttribute] ⚠️ L'attribut '${attribute}' n'existe pas (pas de hash).`); - return null; - } - let key = state.keys[attribute]; - const pairingProcessId = this.getPairingProcessId(); + // Le groupe principal est "collapsed" pour ne pas polluer la console par défaut + console.groupCollapsed(`[Services:decryptAttribute] 🔑 Déchiffrement de '${attribute}' (Process: ${processId})`); - // If key is missing, request an update and then retry - if (!key) { - console.warn(`[Services:decryptAttribute] ⚠️ Clé manquante pour '${attribute}'. Vérification de l'accès et demande aux pairs...`); - const roles = state.roles; - let hasAccess = false; - // If we're not supposed to have access to this attribute, ignore - for (const role of Object.values(roles)) { - for (const rule of Object.values(role.validation_rules)) { - if (rule.fields.includes(attribute)) { - if (role.members.includes(pairingProcessId)) { - // We have access to this attribute - hasAccess = true; - break; + try { + let hash = state.pcd_commitment[attribute]; + if (!hash) { + console.warn(`⚠️ L'attribut n'existe pas (pas de hash).`); + return null; // Le 'finally' s'exécutera + } + let key = state.keys[attribute]; + const pairingProcessId = this.getPairingProcessId(); + + // If key is missing, request an update and then retry + if (!key) { + // On crée un sous-groupe pour la logique de récupération de la clé + console.group(`🔐 Gestion de la clé manquante pour '${attribute}'`); + + console.warn(`Vérification de l'accès et demande aux pairs...`); + const roles = state.roles; + let hasAccess = false; + // If we're not supposed to have access to this attribute, ignore + for (const role of Object.values(roles)) { + for (const rule of Object.values(role.validation_rules)) { + if (rule.fields.includes(attribute)) { + if (role.members.includes(pairingProcessId)) { + // We have access to this attribute + hasAccess = true; + break; + } } } } - } - if (!hasAccess) { - console.log(`[Services:decryptAttribute] ⛔ Accès non autorisé à '${attribute}'. Abandon.`); - return null; - } - - const process = await this.getProcess(processId); - if (!process) { - console.error(`[Services:decryptAttribute] 💥 Impossible de trouver le processus ${processId} pour ensureConnections.`); - return null; - } - - await this.ensureConnections(process); - // We should have the key, so we're going to ask other members for it - console.log(`[Services:decryptAttribute] 🗣️ Demande de données aux pairs pour '${attribute}'...`); - await this.requestDataFromPeers(processId, [state.state_id], [state.roles]); - - const maxRetries = 5; - const retryDelay = 500; // delay in milliseconds - let retries = 0; - - while ((!hash || !key) && retries < maxRetries) { - console.log(`[Services:decryptAttribute] ⏳ Attente de la clé... (Tentative ${retries + 1}/${maxRetries})`); - await new Promise((resolve) => setTimeout(resolve, retryDelay)); - // Re-read hash and key after waiting - // AMÉLIORATION: On doit relire l'état complet depuis la BDD/cache, car 'state' est un instantané - const updatedProcess = await this.getProcess(processId); - const updatedState = this.getStateFromId(updatedProcess, state.state_id); - if (updatedState) { - hash = updatedState.pcd_commitment[attribute]; - key = updatedState.keys[attribute]; + if (!hasAccess) { + console.log(`⛔ Accès non autorisé. Abandon.`); + console.groupEnd(); // Ferme le sous-groupe "Gestion de la clé manquante" + return null; // Le 'finally' principal s'exécutera } - retries++; - } - } - if (hash && key) { - console.log(`[Services:decryptAttribute] ℹ️ Clé et hash trouvés pour '${attribute}'. Tentative de déchiffrement...`); - const blob = await this.getBlobFromDb(hash); - if (blob) { - // Decrypt the data - const buf = await blob.arrayBuffer(); - const cipher = new Uint8Array(buf); + const process = await this.getProcess(processId); + if (!process) { + console.error(`💥 Impossible de trouver le processus ${processId} pour ensureConnections.`); + console.groupEnd(); // Ferme le sous-groupe "Gestion de la clé manquante" + return null; + } - const keyUIntArray = this.hexToUInt8Array(key); + await this.ensureConnections(process); + // We should have the key, so we're going to ask other members for it + console.log(`🗣️ Demande de données aux pairs...`); + await this.requestDataFromPeers(processId, [state.state_id], [state.roles]); - try { - const clear = this.sdkClient.decrypt_data(keyUIntArray, cipher); - if (clear) { - // deserialize the result to get the actual data - const decoded = this.sdkClient.decode_value(clear); - console.log(`[Services:decryptAttribute] ✅ Attribut '${attribute}' déchiffré avec succès.`); - return decoded; - } else { - throw new Error('decrypt_data returned null'); + const maxRetries = 5; + const retryDelay = 500; // delay in milliseconds + let retries = 0; + + // On crée un sous-groupe replié pour la boucle de réessai (potentiellement verbeuse) + console.groupCollapsed(`⏳ Boucle d'attente de la clé (max ${maxRetries} tentatives)`); + while ((!hash || !key) && retries < maxRetries) { + console.log(`(Tentative ${retries + 1}/${maxRetries})...`); + await new Promise((resolve) => setTimeout(resolve, retryDelay)); + // Re-read hash and key after waiting + const updatedProcess = await this.getProcess(processId); + const updatedState = this.getStateFromId(updatedProcess, state.state_id); + if (updatedState) { + hash = updatedState.pcd_commitment[attribute]; + key = updatedState.keys[attribute]; } - } catch (e) { - console.error(`[Services:decryptAttribute] 💥 Échec du déchiffrement (decrypt_data): ${e}`); + retries++; + } + console.groupEnd(); // Ferme le sous-groupe "Boucle d'attente" + + console.groupEnd(); // Ferme le sous-groupe "Gestion de la clé manquante" + } // Fin de if (!key) + + if (hash && key) { + console.log(`ℹ️ Clé et hash trouvés. Tentative de déchiffrement...`); + const blob = await this.getBlobFromDb(hash); + if (blob) { + // Decrypt the data + const buf = await blob.arrayBuffer(); + const cipher = new Uint8Array(buf); + + const keyUIntArray = this.hexToUInt8Array(key); + + try { + const clear = this.sdkClient.decrypt_data(keyUIntArray, cipher); + if (clear) { + // deserialize the result to get the actual data + const decoded = this.sdkClient.decode_value(clear); + console.log(`✅ Attribut '${attribute}' déchiffré avec succès.`); + return decoded; // Le 'finally' s'exécutera + } else { + throw new Error('decrypt_data returned null'); + } + } catch (e) { + console.error(`💥 Échec du déchiffrement (decrypt_data): ${e}`); + } + } else { + console.error(`💥 Échec: Blob non trouvé en BDD pour le hash ${hash}`); } } else { - console.error(`[Services:decryptAttribute] 💥 Échec: Blob non trouvé en BDD pour le hash ${hash}`); + console.error(`💥 Échec: Clé ou hash manquant après ${maxRetries} tentatives pour '${attribute}'.`); } - } else { - console.error(`[Services:decryptAttribute] 💥 Échec: Clé ou hash manquant après ${maxRetries} tentatives pour '${attribute}'.`); - } - return null; + return null; // Le 'finally' s'exécutera + } catch (error) { + // Intercepte les erreurs inattendues non gérées + console.error(`💥 Erreur inattendue dans decryptAttribute:`, error); + return null; + } finally { + // Ce bloc est TOUJOURS exécuté, assurant que le groupe est fermé. + console.groupEnd(); + } } getNotifications(): any[] | null {