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 + + 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 + +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(this); + d->m_options = options; +} + +ChangeExpiryJob::Options ChangeExpiryJob::options() const +{ + auto d = jobPrivate(this); + return d->m_options; +} + +/* For ABI compat not pure virtual. */ +Error ChangeExpiryJob::start(const Key &, const QDateTime &, const std::vector &) +{ + 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 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 &subkeys) + const std::vector &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(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 &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 &) -{ + run(std::bind(&change_expiry, std::placeholders::_1, key, expiry, subkeys, options())); return Error(); }