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"