aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lang/qt/src/Makefile.am2
-rw-r--r--lang/qt/src/changeexpiryjob.cpp76
-rw-r--r--lang/qt/src/changeexpiryjob.h13
-rw-r--r--lang/qt/src/qgpgmechangeexpiryjob.cpp32
4 files changed, 113 insertions, 10 deletions
diff --git a/lang/qt/src/Makefile.am b/lang/qt/src/Makefile.am
index 683b44cd..a965cdea 100644
--- a/lang/qt/src/Makefile.am
+++ b/lang/qt/src/Makefile.am
@@ -40,7 +40,7 @@ qgpgme_sources = \
qgpgmekeyformailboxjob.cpp qgpgme_debug.cpp \
qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
- qgpgmegpgcardjob.cpp \
+ qgpgmegpgcardjob.cpp changeexpiryjob.cpp \
dn.cpp cryptoconfig.cpp
# If you add one here make sure that you also add one in camelcase
diff --git a/lang/qt/src/changeexpiryjob.cpp b/lang/qt/src/changeexpiryjob.cpp
new file mode 100644
index 00000000..49f68cc1
--- /dev/null
+++ b/lang/qt/src/changeexpiryjob.cpp
@@ -0,0 +1,76 @@
+/*
+ changeexpiryjob.cpp
+
+ This file is part of qgpgme, the Qt API binding for gpgme
+ Copyright (c) 2021 g10 Code GmbH
+ Software engineering by Ingo Klöcker <[email protected]>
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ QGpgME is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "changeexpiryjob.h"
+#include "job_p.h"
+
+#include <context.h>
+
+using namespace GpgME;
+using namespace QGpgME;
+
+namespace
+{
+struct ChangeExpiryJobPrivate : public JobPrivate
+{
+ ChangeExpiryJobPrivate()
+ {
+ }
+
+ ~ChangeExpiryJobPrivate() override = default;
+
+ ChangeExpiryJob::Options m_options = ChangeExpiryJob::Default;
+};
+}
+
+void ChangeExpiryJob::setOptions(ChangeExpiryJob::Options options)
+{
+ auto d = jobPrivate<ChangeExpiryJobPrivate>(this);
+ d->m_options = options;
+}
+
+ChangeExpiryJob::Options ChangeExpiryJob::options() const
+{
+ auto d = jobPrivate<ChangeExpiryJobPrivate>(this);
+ return d->m_options;
+}
+
+/* For ABI compat not pure virtual. */
+Error ChangeExpiryJob::start(const Key &, const QDateTime &, const std::vector<Subkey> &)
+{
+ return {};
+}
diff --git a/lang/qt/src/changeexpiryjob.h b/lang/qt/src/changeexpiryjob.h
index 39ed52ea..0c5e1b2b 100644
--- a/lang/qt/src/changeexpiryjob.h
+++ b/lang/qt/src/changeexpiryjob.h
@@ -71,11 +71,22 @@ namespace QGpgME
class QGPGME_EXPORT ChangeExpiryJob : public Job
{
Q_OBJECT
+public:
+ enum Option {
+ Default = 0x00,
+ UpdatePrimaryKey = 0x01,
+ UpdateAllSubkeys = 0x02,
+ };
+ Q_DECLARE_FLAGS(Options, Option)
+
protected:
explicit ChangeExpiryJob(QObject *parent);
public:
~ChangeExpiryJob();
+ void setOptions(Options options);
+ Options options() const;
+
/**
Starts the change-expiry operation. \a key is the key to change
the expiry of. \a expiry is the new expiry time. If \a expiry
@@ -97,6 +108,8 @@ Q_SIGNALS:
void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(ChangeExpiryJob::Options)
+
}
#endif // __KLEO_CHANGEEXPIRYJOB_H__
diff --git a/lang/qt/src/qgpgmechangeexpiryjob.cpp b/lang/qt/src/qgpgmechangeexpiryjob.cpp
index 68591b7e..5d4e8360 100644
--- a/lang/qt/src/qgpgmechangeexpiryjob.cpp
+++ b/lang/qt/src/qgpgmechangeexpiryjob.cpp
@@ -5,6 +5,8 @@
Copyright (c) 2008 Klarälvdalens Datakonsult AB
Copyright (c) 2016 by Bundesamt für Sicherheit in der Informationstechnik
Software engineering by Intevation GmbH
+ Copyright (c) 2021 g10 Code GmbH
+ Software engineering by Ingo Klöcker <[email protected]>
QGpgME is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@@ -55,14 +57,32 @@ QGpgMEChangeExpiryJob::QGpgMEChangeExpiryJob(Context *context)
QGpgMEChangeExpiryJob::~QGpgMEChangeExpiryJob() {}
static QGpgMEChangeExpiryJob::result_type change_expiry(Context *ctx, const Key &key, const QDateTime &expiry,
- const std::vector<Subkey> &subkeys)
+ const std::vector<Subkey> &subkeys, ChangeExpiryJob::Options options)
{
// convert expiry to "seconds from now"; use 1 second from now if expiry is before the current datetime
const unsigned long expires = expiry.isValid()
? std::max<qint64>(QDateTime::currentDateTime().secsTo(expiry), 1)
: 0;
- auto err = ctx->setExpire(key, expires, subkeys);
+ // updating the expiration date of the primary key and the subkeys needs to be done in two steps
+ // because --quick-set-expire does not support updating the expiration date of both at the same time
+
+ if (subkeys.empty() || (options & ChangeExpiryJob::UpdatePrimaryKey)) {
+ // update the expiration date of the primary key
+ auto err = ctx->setExpire(key, expires);
+ if (err) {
+ return std::make_tuple(err, QString(), Error());
+ }
+ }
+
+ GpgME::Error err;
+ if (!subkeys.empty()) {
+ // update the expiration date of the specified subkeys
+ err = ctx->setExpire(key, expires, subkeys);
+ } else if (options & ChangeExpiryJob::UpdateAllSubkeys) {
+ // update the expiration date of all subkeys
+ err = ctx->setExpire(key, expires, {}, Context::SetExpireAllSubkeys);
+ }
return std::make_tuple(err, QString(), Error());
}
@@ -73,13 +93,7 @@ Error QGpgMEChangeExpiryJob::start(const Key &key, const QDateTime &expiry)
Error QGpgMEChangeExpiryJob::start(const Key &key, const QDateTime &expiry, const std::vector<Subkey> &subkeys)
{
- run(std::bind(&change_expiry, std::placeholders::_1, key, expiry, subkeys));
- return Error();
-}
-
-/* For ABI compat not pure virtual. */
-Error ChangeExpiryJob::start(const Key &, const QDateTime &, const std::vector<Subkey> &)
-{
+ run(std::bind(&change_expiry, std::placeholders::_1, key, expiry, subkeys, options()));
return Error();
}