File indexing completed on 2024-05-12 05:04:25

0001 // SPDX-FileCopyrightText: 2019 Harald Sitter <sitter@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #include "messagefiltercontainer.h"
0005 
0006 // Extra filter rigging. We don't want to leak secrets via qdebug, so install
0007 // a message handler which does nothing more than replace secrets in debug
0008 // messages with placeholders.
0009 // This is used as a global static (since message handlers are meant to be
0010 // static) and is slightly synchronizing across threads WRT the filter hash.
0011 
0012 QMessageFilterContainer::QMessageFilterContainer()
0013 {
0014     qInstallMessageHandler(nullptr);
0015 
0016     handler = qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, const QString &msg) {
0017         s_messageFilter->handler(type, context, s_messageFilter->filter(msg));
0018     });
0019 }
0020 
0021 QMessageFilterContainer::~QMessageFilterContainer()
0022 {
0023     qInstallMessageHandler(handler);
0024 }
0025 
0026 void QMessageFilterContainer::insert(const QString &needle, const QString &replace)
0027 {
0028     if (needle.isEmpty()) {
0029         return;
0030     }
0031 
0032     QWriteLocker locker(&lock);
0033     filters[needle] = replace;
0034 }
0035 
0036 QString QMessageFilterContainer::filter(const QString &msg)
0037 {
0038     QReadLocker locker(&lock);
0039     QString filteredMsg = msg;
0040     for (auto it = filters.constBegin(); it != filters.constEnd(); ++it) {
0041         filteredMsg.replace(it.key(), it.value());
0042     }
0043     return filteredMsg;
0044 }
0045 
0046 void QMessageFilterContainer::clear()
0047 {
0048     QWriteLocker locker(&lock);
0049     filters.clear();
0050 }