diff --git a/src/resolver/CMakeLists.txt b/src/resolver/CMakeLists.txt index 6f43cc8..6c0358a 100644 --- a/src/resolver/CMakeLists.txt +++ b/src/resolver/CMakeLists.txt @@ -1,31 +1,33 @@ # Copyright (C) 2018 Intevation GmbH # # This file is Free Software under the GNU GPL (v>=2) # and comes with ABSOLUTELY NO WARRANTY! # See LICENSE.txt for details. set(EXECUTABLE_NAME "resolver") set(EXECUTABLE_SRC main.cpp resolver.cpp - overlay.cpp - img/icon.rc - ${CMAKE_SOURCE_DIR}/src//util/strhelp.c + ${CMAKE_SOURCE_DIR}/src/img/icon.rc + ${CMAKE_SOURCE_DIR}/src/util/overlay.cpp + ${CMAKE_SOURCE_DIR}/src/util/strhelp.c ) add_executable(${EXECUTABLE_NAME} ${_add_executable_params} ${EXECUTABLE_SRC} ) target_link_libraries(${EXECUTABLE_NAME} Qt5::Widgets KF5::Libkleo Gpgmepp QGpgme ) if (WIN32) set_target_properties(${EXECUTABLE_NAME} PROPERTIES LINK_FLAGS "-municode") endif(WIN32) + +install(TARGETS ${EXECUTABLE_NAME} DESTINATION bin) diff --git a/src/resolver/overlay.cpp b/src/resolver/overlay.cpp deleted file mode 100644 index 643f0bb..0000000 --- a/src/resolver/overlay.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (C) 2018 by Intevation GmbH - * - * This file is Free Software under the GNU GPL (v>=2) - * and comes with ABSOLUTELY NO WARRANTY! - * See LICENSE.txt for details. - */ - -#include "overlay.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#ifdef Q_OS_WIN - -#include - -class Overlay::Private -{ -public: - Private(Overlay *qq, WId id, const QString &text): - q(qq) - { - auto window = QWindow::fromWinId(id); - m_target = (HWND) id; - - auto parentHandle = q->windowHandle(); - if (parentHandle) { - parentHandle->setTransientParent(window); - } - - q->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::Tool | Qt::CustomizeWindowHint); - q->setAttribute(Qt::WA_TransparentForMouseEvents); - q->setAttribute(Qt::WA_TranslucentBackground); - - auto vLay = new QVBoxLayout(q); - auto bar = new QProgressBar; - auto label = new QLabel; - label->setText(QStringLiteral("

%1

").arg(text)); - bar->setRange(0, 0); - vLay->addStretch(1); - - auto subLay1 = new QVBoxLayout; - auto subLay3 = new QHBoxLayout; - subLay3->addStretch(0.5); - subLay3->addWidget(label); - subLay3->addStretch(1); - subLay1->addLayout(subLay3); - subLay1->addWidget(bar); - - auto subLay2 = new QHBoxLayout; - subLay2->addStretch(0.1); - subLay2->addLayout(subLay1); - subLay2->addStretch(0.1); - - vLay->addLayout(subLay2); - - vLay->addStretch(1); - - auto refreshTimer = new QTimer(q); - connect(refreshTimer, &QTimer::timeout, q, [this] () { - RECT rect; - if (GetWindowRect(m_target, &rect)) { - q->setGeometry(rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top); - } else { - //maybe window was closed - std::cerr << "GetWindowRect failed"; - } - }); - refreshTimer->start(50); // update interval in milliseconds - q->show(); - } - HWND m_target; - - Overlay *q; -}; - -Overlay::Overlay (WId id, const QString &text): - d(new Private(this, id, text)) -{ -} - -void Overlay::paintEvent(QPaintEvent *e) { - QPainter painter(this); - - int width = size().width(); - int height = size().height(); - - QLinearGradient gradient(0, 0, 0, height); - gradient.setColorAt(0, Qt::transparent); - gradient.setColorAt(0.5, Qt::white); - gradient.setColorAt(1, Qt::transparent); - - QBrush brush(gradient); - - painter.fillRect(0, 0, width, height, gradient); - QWidget::paintEvent(e); -} - -#else -Overlay::Overlay (WId id, const QString &text) -{ -} -#endif diff --git a/src/resolver/overlay.h b/src/resolver/overlay.h deleted file mode 100644 index 6fb1cae..0000000 --- a/src/resolver/overlay.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef OVERLAY_H -#define OVERLAY_H -/* Copyright (C) 2018 by Intevation GmbH - * - * This file is Free Software under the GNU GPL (v>=2) - * and comes with ABSOLUTELY NO WARRANTY! - * See LICENSE.txt for details. - */ - -#include -#include -class QPaintEvent; - -class Overlay: public QWidget -{ - Q_OBJECT -public: - Overlay (WId id, const QString &text); - -protected: - virtual void paintEvent (QPaintEvent *event) override; - -private: - class Private; - std::shared_ptr d; -}; -#endif diff --git a/src/resolver/resolver.cpp b/src/resolver/resolver.cpp index cea1db2..eb9d200 100644 --- a/src/resolver/resolver.cpp +++ b/src/resolver/resolver.cpp @@ -1,114 +1,124 @@ /* Copyright (C) 2018 by Intevation GmbH * * This file is Free Software under the GNU GPL (v>=2) * and comes with ABSOLUTELY NO WARRANTY! * See LICENSE.txt for details. */ #include "resolver.h" -#include "overlay.h" +#include "util/overlay.h" #include #include #include #include #include #include class Resolver::Private { public: Private(Resolver *qq): q(qq) { } void printResolvedKeys(const Kleo::KeyResolver *kr) { - qDebug() << "Printing resolved keys."; const auto sigMap = kr->signingKeys(); for (const auto fmt: sigMap.keys()) { for (const auto key: sigMap[fmt]) { - std::cout << "sig:" << Kleo::cryptoMessageFormatToString(fmt) << ":" + std::string fmtStr; + if (fmt & Kleo::AnySMIME) { + fmtStr = "smime"; + } else { + fmtStr = "openpgp"; + } + std::cout << "sig:" << fmtStr << ":" << key.primaryFingerprint() << std::endl; } } const auto encMap = kr->encryptionKeys(); for (const auto fmt: encMap.keys()) { for (const auto mbox: encMap[fmt].keys()) { for (const auto key: encMap[fmt][mbox]) { - std::cout << "enc:" << Kleo::cryptoMessageFormatToString(fmt) << ":" + std::string fmtStr; + if (fmt & Kleo::AnySMIME) { + fmtStr = "smime"; + } else { + fmtStr = "openpgp"; + } + std::cout << "enc:" << fmtStr << ":" << key.primaryFingerprint() << std::endl; } } } } void newOverlay(WId wid, const QString &text) { m_overlay = std::shared_ptr(new Overlay(wid, text)); - m_overlay->show(); } void newResolver(const QCommandLineParser &parser) { const auto proto = parser.value(QStringLiteral("protocol")).toLower(); Kleo::CryptoMessageFormat format; if (proto == QStringLiteral("cms")) { format = Kleo::AnySMIME; } else if (proto == QStringLiteral("pgp")) { format = Kleo::AnyOpenPGP; } else { format = Kleo::AutoFormat; } const auto recps = parser.positionalArguments(); auto *kr = new Kleo::KeyResolver (!recps.isEmpty() || parser.isSet(QStringLiteral("encrypt")) /* encrypt */, parser.isSet(QStringLiteral("sign")) /*sign*/, format /* CryptoMesssageFormat */, false /* AllowMixed */); kr->setRecipients(recps); kr->setSender(parser.value("sender")); kr->enableNagging(true); connect (kr, &Kleo::KeyResolver::keysResolved, q, [this, kr] (bool success, bool sendUnencrypted) { if (!success) { std::cout << "cancel" << std::endl; } else if (sendUnencrypted) { std::cout << "unencrypted" << std::endl; } else { printResolvedKeys(kr); } delete kr; qApp->quit(); }); - kr->start(parser.isSet(QStringLiteral("alwaysShow"))); + kr->start(parser.isSet(QStringLiteral("alwaysShow")), m_overlay.get()); } Resolver *q; std::shared_ptr m_overlay; }; Resolver::Resolver(int &argc, char *argv[]) : QApplication(argc, argv), d(new Private(this)) { } QString Resolver::newInstance(const QCommandLineParser &parser, const QString &workingDirectry) { const auto hwnd = parser.value(QStringLiteral("hwnd")); if (!hwnd.isEmpty()) { bool ok; WId id = (WId) hwnd.toInt(&ok); if (!ok) { std::cerr << "invalid hwnd value" << std::endl; qApp->exit(EXIT_FAILURE); } d->newOverlay(id, parser.value(QStringLiteral("overlayText"))); } d->newResolver(parser); return QString(); }