Messagelib

dkimmanagerkey.cpp
1/*
2 SPDX-FileCopyrightText: 2018-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "dkimmanagerkey.h"
8#include "dkimutil.h"
9#include <KConfig>
10#include <KConfigGroup>
11#include <QRegularExpression>
12
13using namespace MessageViewer;
14DKIMManagerKey::DKIMManagerKey(QObject *parent)
15 : QObject(parent)
16{
17 loadKeys();
18}
19
20DKIMManagerKey::~DKIMManagerKey()
21{
22 saveKeys();
23}
24
25DKIMManagerKey *DKIMManagerKey::self()
26{
27 static DKIMManagerKey s_self;
28 return &s_self;
29}
30
31QString DKIMManagerKey::keyValue(const QString &selector, const QString &domain)
32{
33 for (const KeyInfo &keyInfo : std::as_const(mKeys)) {
34 if (keyInfo.selector == selector && keyInfo.domain == domain) {
35 return keyInfo.keyValue;
36 }
37 }
38 return {};
39}
40
41void DKIMManagerKey::updateLastUsed(const QString &selector, const QString &domain)
42{
43 for (const KeyInfo &keyInfo : std::as_const(mKeys)) {
44 if (keyInfo.selector == selector && keyInfo.domain == domain) {
45 KeyInfo newKey = keyInfo;
46 newKey.lastUsedDateTime = QDateTime::currentDateTime();
47 addKey(newKey);
48 return;
49 }
50 }
51}
52
53void DKIMManagerKey::addKey(const KeyInfo &key)
54{
55 const QList<KeyInfo> keys = mKeys;
56 for (const KeyInfo &keyInfo : keys) {
57 if (keyInfo.selector == key.selector && keyInfo.domain == key.domain) {
58 mKeys.removeAll(keyInfo);
59 }
60 }
61 mKeys.append(key);
62}
63
64void DKIMManagerKey::removeKey(const QString &key)
65{
66 for (const KeyInfo &keyInfo : std::as_const(mKeys)) {
67 if (keyInfo.keyValue == key) {
68 mKeys.removeAll(keyInfo);
69 break;
70 }
71 }
72}
73
74QList<KeyInfo> DKIMManagerKey::keys() const
75{
76 return mKeys;
77}
78
79QStringList DKIMManagerKey::keyRecorderList(KSharedConfig::Ptr &config) const
80{
81 config = KSharedConfig::openConfig(MessageViewer::DKIMUtil::defaultConfigFileName(), KConfig::NoGlobals);
82 const QStringList keyGroups = config->groupList().filter(QRegularExpression(QStringLiteral("DKIM Key Record #\\d+")));
83 return keyGroups;
84}
85
86void DKIMManagerKey::loadKeys()
87{
88 KSharedConfig::Ptr config;
89 const QStringList keyGroups = keyRecorderList(config);
90
91 mKeys.clear();
92 for (const QString &groupName : keyGroups) {
93 KConfigGroup group = config->group(groupName);
94 const QString selector = group.readEntry(QStringLiteral("Selector"), QString());
95 const QString domain = group.readEntry(QStringLiteral("Domain"), QString());
96 const QString key = group.readEntry(QStringLiteral("Key"), QString());
97 const QDateTime storedAt = QDateTime::fromString(group.readEntry(QStringLiteral("StoredAt"), QString()), Qt::ISODate);
98 QDateTime lastUsed = QDateTime::fromString(group.readEntry(QStringLiteral("LastUsed"), QString()), Qt::ISODate);
99 if (!lastUsed.isValid()) {
100 lastUsed = storedAt;
101 }
102 mKeys.append(KeyInfo{key, selector, domain, storedAt, lastUsed});
103 }
104}
105
106void DKIMManagerKey::saveKeys()
107{
108 KSharedConfig::Ptr config;
109 const QStringList filterGroups = keyRecorderList(config);
110
111 for (const QString &group : filterGroups) {
112 config->deleteGroup(group);
113 }
114 for (int i = 0, total = mKeys.count(); i < total; ++i) {
115 const QString groupName = QStringLiteral("DKIM Key Record #%1").arg(i);
116 KConfigGroup group = config->group(groupName);
117 const KeyInfo &info = mKeys.at(i);
118 group.writeEntry(QStringLiteral("Selector"), info.selector);
119 group.writeEntry(QStringLiteral("Domain"), info.domain);
120 group.writeEntry(QStringLiteral("Key"), info.keyValue);
121 group.writeEntry(QStringLiteral("StoredAt"), info.storedAtDateTime.toString(Qt::ISODate));
122 group.writeEntry(QStringLiteral("LastUsed"), info.lastUsedDateTime.toString(Qt::ISODate));
123 }
124}
125
126void DKIMManagerKey::saveKeys(const QList<MessageViewer::KeyInfo> &lst)
127{
128 if (mKeys != lst) {
129 mKeys = lst;
130 saveKeys();
131 }
132}
133
134bool KeyInfo::operator==(const KeyInfo &other) const
135{
136 return keyValue == other.keyValue && selector == other.selector && domain == other.domain;
137}
138
139bool KeyInfo::operator!=(const KeyInfo &other) const
140{
141 return !(operator==(other));
142}
143
144QDebug operator<<(QDebug d, const KeyInfo &t)
145{
146 d << " keyvalue " << t.keyValue;
147 d << " selector " << t.selector;
148 d << " domain " << t.domain;
149 d << " storedAtDateTime " << t.storedAtDateTime;
150 d << " lastUsedDateTime " << t.lastUsedDateTime;
151 return d;
152}
153
154#include "moc_dkimmanagerkey.cpp"
KConfigGroup group(const QString &group)
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
The DKIMManagerKey class.
KTEXTEDITOR_EXPORT QDebug operator<<(QDebug s, const MovingCursor &cursor)
QDateTime currentDateTime()
QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
bool isValid() const const
QString toString(QStringView format, QCalendar cal) const const
The KeyInfo struct.
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 11:50:07 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.