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 }