File indexing completed on 2024-05-12 05:22:53
0001 /* 0002 test_keyresolver.cpp 0003 0004 This file is part of libkleopatra's test suite. 0005 SPDX-FileCopyrightText: 2018 Intevation GmbH 0006 0007 SPDX-License-Identifier: GPL-2.0-only 0008 */ 0009 0010 #include <libkleo/formatting.h> 0011 #include <libkleo/keycache.h> 0012 #include <libkleo/keygroupconfig.h> 0013 #include <libkleo/keyresolver.h> 0014 0015 #include <QApplication> 0016 #include <QCommandLineParser> 0017 #include <QDebug> 0018 #include <QTimer> 0019 0020 #include <chrono> 0021 #include <gpgme++/key.h> 0022 using namespace std::chrono_literals; 0023 using namespace Kleo; 0024 using namespace GpgME; 0025 0026 void dumpKeys(const QMap<QString, std::vector<Key>> &keysMap) 0027 { 0028 for (auto it = std::begin(keysMap); it != std::end(keysMap); ++it) { 0029 const auto &address = it.key(); 0030 const auto &keys = it.value(); 0031 qDebug() << "Address:" << address; 0032 qDebug() << "Keys:"; 0033 for (const auto &key : keys) { 0034 qDebug() << key.primaryFingerprint(); 0035 } 0036 } 0037 } 0038 0039 void dumpSigKeys(const std::vector<Key> &keys) 0040 { 0041 for (const auto &key : keys) { 0042 qDebug() << key.primaryFingerprint(); 0043 } 0044 } 0045 0046 class SignalRecipient : public QObject 0047 { 0048 Q_OBJECT 0049 public: 0050 SignalRecipient(KeyResolver *res) 0051 : resolver(res) 0052 { 0053 } 0054 0055 void keysResolved(bool success, bool sendUnencrypted) 0056 { 0057 if (!success) { 0058 qDebug() << "Canceled"; 0059 exit(1); 0060 } 0061 const auto result = resolver->result(); 0062 qDebug() << "Resolved Signing keys:"; 0063 dumpSigKeys(result.signingKeys); 0064 qDebug() << "Resolved Encryption keys:"; 0065 dumpKeys(result.encryptionKeys); 0066 qDebug() << "Send Unencrypted:" << sendUnencrypted; 0067 exit(0); 0068 } 0069 0070 private: 0071 KeyResolver *resolver; 0072 }; 0073 0074 int main(int argc, char **argv) 0075 { 0076 QApplication app(argc, argv); 0077 QCommandLineParser parser; 0078 parser.setApplicationDescription(QStringLiteral("Test KeyResolver class")); 0079 parser.addHelpOption(); 0080 parser.addPositionalArgument(QStringLiteral("recipients"), QStringLiteral("Recipients to resolve"), QStringLiteral("[mailboxes]")); 0081 parser.addOption(QCommandLineOption({QStringLiteral("overrides"), QStringLiteral("o")}, 0082 QStringLiteral("Override where format can be:\n" 0083 "OpenPGP\n" 0084 "SMIME\n" 0085 "Auto"), 0086 QStringLiteral("mailbox:fpr,fpr,...[:format]"))); 0087 parser.addOption(QCommandLineOption({QStringLiteral("sender"), QStringLiteral("s")}, QStringLiteral("Mailbox of the sender"), QStringLiteral("mailbox"))); 0088 parser.addOption( 0089 QCommandLineOption({QStringLiteral("sigkeys"), QStringLiteral("k")}, QStringLiteral("Explicit signing keys"), QStringLiteral("signing key"))); 0090 parser.addOption(QCommandLineOption({QStringLiteral("encrypt"), QStringLiteral("e")}, QStringLiteral("Only select encryption keys"))); 0091 parser.addOption(QCommandLineOption({QStringLiteral("approval"), QStringLiteral("a")}, QStringLiteral("Always show approval dlg"))); 0092 parser.addOption(QCommandLineOption({QStringLiteral("group-config")}, QStringLiteral("Path of group config"), QStringLiteral("groupsrc"))); 0093 0094 parser.process(app); 0095 0096 const QStringList recps = parser.positionalArguments(); 0097 0098 auto cache = Kleo::KeyCache::mutableInstance(); 0099 if (parser.isSet(QStringLiteral("group-config"))) { 0100 cache->setGroupConfig(std::make_shared<Kleo::KeyGroupConfig>(parser.value(QStringLiteral("group-config")))); 0101 cache->setGroupsEnabled(true); 0102 } 0103 0104 KeyResolver resolver(!recps.empty(), !parser.isSet(QStringLiteral("encrypt"))); 0105 resolver.setRecipients(recps); 0106 resolver.setSender(parser.value(QStringLiteral("sender"))); 0107 0108 QMap<Protocol, QMap<QString, QStringList>> overrides; 0109 0110 for (const QString &oride : parser.values(QStringLiteral("overrides"))) { 0111 const QStringList split = oride.split(QLatin1Char(':')); 0112 Protocol fmt = UnknownProtocol; 0113 if (split.size() < 2 || split.size() > 3) { 0114 parser.showHelp(1); 0115 } 0116 0117 if (split.size() == 3) { 0118 const QString fmtStr = split[2].toLower(); 0119 if (fmtStr == QLatin1StringView("openpgp")) { 0120 fmt = OpenPGP; 0121 } else if (fmtStr == QLatin1StringView("smime")) { 0122 fmt = CMS; 0123 } else if (fmtStr == QLatin1StringView("auto")) { 0124 fmt = UnknownProtocol; 0125 } else { 0126 parser.showHelp(1); 0127 } 0128 } 0129 const QStringList fingerprints = split[1].split(QLatin1Char(',')); 0130 0131 auto map = overrides.value(fmt); 0132 map.insert(split[0], fingerprints); 0133 overrides.insert(fmt, map); 0134 } 0135 resolver.setOverrideKeys(overrides); 0136 0137 auto recp = new SignalRecipient(&resolver); 0138 QObject::connect(&resolver, &KeyResolver::keysResolved, recp, &SignalRecipient::keysResolved); 0139 0140 QTimer::singleShot(1s, [&parser, &resolver]() { 0141 resolver.start(parser.isSet(QStringLiteral("approval"))); 0142 }); 0143 0144 app.exec(); 0145 return 0; 0146 } 0147 0148 #include "test_keyresolver.moc"