// SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2025 - 2026, Patrick Schurig / ETM PowerSync #include "optimizersecret.h" #include #include namespace OptimizerSecret { namespace { // La forme que QJsonDocument donne au token DANS une chaîne : ["…"] sans ses bornes. QByteArray formeEchappee(const QString &token) { const QByteArray tableau = QJsonDocument(QJsonArray{token}).toJson(QJsonDocument::Compact); return tableau.mid(2, tableau.size() - 4); } QJsonValue masquerValeur(const QJsonValue &v, const QString &token, int *masques) { switch (v.type()) { case QJsonValue::String: return masquerTexte(v.toString(), token, masques); case QJsonValue::Array: { QJsonArray out; for (const QJsonValue &x : v.toArray()) out.append(masquerValeur(x, token, masques)); return out; } case QJsonValue::Object: return masquerJson(v.toObject(), token, masques); default: return v; } } } // namespace QString masquerTexte(const QString &texte, const QString &token, int *masques) { if (token.isEmpty()) return texte; QString out = texte; // L'échappée d'abord : elle CONTIENT la brute quand le token n'a ni " ni \ (elles sont alors // égales), et sinon un optimiseur qui a recopié la forme sérialisée l'a fait sous celle-là. for (const QString &forme : {QString::fromUtf8(formeEchappee(token)), token}) { const int n = out.count(forme); if (n == 0) continue; out.replace(forme, QString::fromUtf8(Masque)); // UTF-8 : « masqué » if (masques) *masques += n; } return out; } QJsonObject masquerJson(const QJsonObject &message, const QString &token, int *masques) { if (token.isEmpty()) return message; QJsonObject out; for (auto it = message.constBegin(); it != message.constEnd(); ++it) out.insert(masquerTexte(it.key(), token, masques), masquerValeur(it.value(), token, masques)); return out; } QByteArray masquerLigneJson(const QByteArray &ligne, const QByteArray &token, int *masques) { if (token.isEmpty()) return ligne; const QByteArray echappe = formeEchappee(QString::fromUtf8(token)); if (echappe.isEmpty() || !ligne.contains(echappe)) return ligne; QByteArray out = ligne; const int n = out.count(echappe); out.replace(echappe, Masque); if (masques) *masques += n; return out; } }