diff --git a/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp b/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp index 1cb7abe3..81257d55 100644 --- a/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp +++ b/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp @@ -44,8 +44,11 @@ #include "qgpgme_debug.h" #include "context.h" +#include #include +#include +#include #include #include @@ -81,6 +84,31 @@ GpgME::Error QGpgMERefreshSMIMEKeysJob::start(const QStringList &patterns) return startAProcess(); } +GpgME::Error QGpgMERefreshSMIMEKeysJob::start(const std::vector &keys) +{ + if (keys.empty()) { + QMetaObject::invokeMethod(this, [this]() { + Q_EMIT slotProcessExited(0, QProcess::NormalExit); + }, Qt::QueuedConnection); + return {}; + } + + const bool gotWrongKeys = std::any_of(std::begin(keys), std::end(keys), [](const auto &k) { + return k.protocol() != GpgME::CMS; + }); + if (gotWrongKeys) { + qCDebug(QGPGME_LOG) << "Error: At least one of the keys is not an S/MIME key"; + return GpgME::Error::fromCode(GPG_ERR_INV_VALUE); + } + + QStringList fprs; + fprs.reserve(keys.size()); + std::transform(std::begin(keys), std::end(keys), std::back_inserter(fprs), [](const auto &k) { + return QString::fromLatin1(k.primaryFingerprint()); + }); + return start(fprs); +} + #if MAX_CMD_LENGTH < 65 + 128 #error MAX_CMD_LENGTH is too low #endif diff --git a/lang/qt/src/qgpgmerefreshsmimekeysjob.h b/lang/qt/src/qgpgmerefreshsmimekeysjob.h index 8ed0b379..aa2d5b73 100644 --- a/lang/qt/src/qgpgmerefreshsmimekeysjob.h +++ b/lang/qt/src/qgpgmerefreshsmimekeysjob.h @@ -58,6 +58,8 @@ public: /* from RefreshKeysJob */ GpgME::Error start(const QStringList &patterns) Q_DECL_OVERRIDE; + GpgME::Error start(const std::vector &keys) override; + private Q_SLOTS: /* from Job */ void slotCancel() Q_DECL_OVERRIDE; diff --git a/lang/qt/src/refreshkeysjob.h b/lang/qt/src/refreshkeysjob.h index c4ba74a0..b6978060 100644 --- a/lang/qt/src/refreshkeysjob.h +++ b/lang/qt/src/refreshkeysjob.h @@ -73,19 +73,20 @@ public: ~RefreshKeysJob(); /** - Starts the keylist operation. \a pattern is a list of patterns + Starts the refresh operation. \a pattern is a list of patterns used to restrict the list of keys returned. Empty patterns are ignored. If \a pattern is empty or contains only empty strings, - all keys are returned (however, the backend is free to truncate - the result and should do so; when this happens, it will be - reported by the reult object). + all keys are refreshed. - If \a secretOnly is true, only keys for which the secret key is - also available are returned. Use this if you need to select a - key for signing. + Only implemented for S/MIME. */ virtual GpgME::Error start(const QStringList &patterns) = 0; + /** + Starts a refresh of the \a keys. + */ + virtual GpgME::Error start(const std::vector &keys) = 0; + Q_SIGNALS: void result(const GpgME::Error &error); };