File indexing completed on 2024-06-23 05:13:44

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     commands/newcertificatesigningrequestcommand.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB
0006     SPDX-FileCopyrightText: 2022 g10 Code GmbH
0007     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #include <config-kleopatra.h>
0013 
0014 #include "newcertificatesigningrequestcommand.h"
0015 
0016 #include "command_p.h"
0017 
0018 #include "newcertificatewizard/newcertificatewizard.h"
0019 
0020 #include <settings.h>
0021 
0022 #include <kleopatra_debug.h>
0023 
0024 using namespace Kleo;
0025 using namespace Kleo::Commands;
0026 using namespace GpgME;
0027 
0028 class NewCertificateSigningRequestCommand::Private : public Command::Private
0029 {
0030     friend class ::Kleo::Commands::NewCertificateSigningRequestCommand;
0031     NewCertificateSigningRequestCommand *q_func() const
0032     {
0033         return static_cast<NewCertificateSigningRequestCommand *>(q);
0034     }
0035 
0036 public:
0037     explicit Private(NewCertificateSigningRequestCommand *qq, KeyListController *c)
0038         : Command::Private{qq, c}
0039     {
0040     }
0041 
0042     void createCSR();
0043 
0044 private:
0045     void slotDialogAccepted();
0046 
0047 private:
0048     QPointer<NewCertificateWizard> dialog;
0049 };
0050 
0051 NewCertificateSigningRequestCommand::Private *NewCertificateSigningRequestCommand::d_func()
0052 {
0053     return static_cast<Private *>(d.get());
0054 }
0055 const NewCertificateSigningRequestCommand::Private *NewCertificateSigningRequestCommand::d_func() const
0056 {
0057     return static_cast<const Private *>(d.get());
0058 }
0059 
0060 #define d d_func()
0061 #define q q_func()
0062 
0063 void NewCertificateSigningRequestCommand::Private::createCSR()
0064 {
0065     Q_ASSERT(!dialog);
0066 
0067     dialog = new NewCertificateWizard;
0068     applyWindowID(dialog);
0069     dialog->setAttribute(Qt::WA_DeleteOnClose);
0070 
0071     connect(dialog, &QDialog::accepted, q, [this]() {
0072         slotDialogAccepted();
0073     });
0074     connect(dialog, &QDialog::rejected, q, [this]() {
0075         canceled();
0076     });
0077 
0078     dialog->setProtocol(GpgME::CMS);
0079     dialog->show();
0080 }
0081 
0082 void NewCertificateSigningRequestCommand::Private::slotDialogAccepted()
0083 {
0084     finished();
0085 }
0086 
0087 NewCertificateSigningRequestCommand::NewCertificateSigningRequestCommand()
0088     : NewCertificateSigningRequestCommand(nullptr, nullptr)
0089 {
0090 }
0091 
0092 NewCertificateSigningRequestCommand::NewCertificateSigningRequestCommand(QAbstractItemView *v, KeyListController *c)
0093     : Command(v, new Private(this, c))
0094 {
0095 }
0096 
0097 NewCertificateSigningRequestCommand::~NewCertificateSigningRequestCommand() = default;
0098 
0099 void NewCertificateSigningRequestCommand::doStart()
0100 {
0101     const Kleo::Settings settings{};
0102     if (settings.cmsEnabled() && settings.cmsCertificateCreationAllowed()) {
0103         d->createCSR();
0104     } else {
0105         d->error(i18n("You are not allowed to create S/MIME certificate signing requests."));
0106         d->finished();
0107     }
0108 }
0109 
0110 void NewCertificateSigningRequestCommand::doCancel()
0111 {
0112     if (d->dialog) {
0113         d->dialog->close();
0114     }
0115 }
0116 
0117 #undef d
0118 #undef q
0119 
0120 #include "moc_newcertificatesigningrequestcommand.cpp"