diff options
| -rw-r--r-- | lang/qt/src/qgpgmerefreshsmimekeysjob.cpp | 28 | ||||
| -rw-r--r-- | lang/qt/src/qgpgmerefreshsmimekeysjob.h | 2 | ||||
| -rw-r--r-- | lang/qt/src/refreshkeysjob.h | 15 | 
3 files changed, 38 insertions, 7 deletions
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 <key.h>  #include <QByteArray> +#include <QMetaObject> +#include <QProcess>  #include <QStringList>  #include <gpg-error.h> @@ -81,6 +84,31 @@ GpgME::Error QGpgMERefreshSMIMEKeysJob::start(const QStringList &patterns)      return startAProcess();  } +GpgME::Error QGpgMERefreshSMIMEKeysJob::start(const std::vector<GpgME::Key> &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<GpgME::Key> &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<GpgME::Key> &keys) = 0; +  Q_SIGNALS:      void result(const GpgME::Error &error);  };  | 
