File indexing completed on 2024-06-23 05:14:08

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     gui/certificaterequester.cpp
0003 
0004     This file is part of KleopatraClient, the Kleopatra interface library
0005     SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB
0006 
0007     SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "certificaterequester.h"
0011 
0012 #include <libkleopatraclient/core/selectcertificatecommand.h>
0013 
0014 #include <KLocalizedString>
0015 #include <QHBoxLayout>
0016 #include <QLineEdit>
0017 #include <QMessageBox>
0018 #include <QPointer>
0019 #include <QPushButton>
0020 
0021 #include <memory>
0022 
0023 using namespace KleopatraClientCopy;
0024 using namespace KleopatraClientCopy::Gui;
0025 
0026 class CertificateRequester::Private
0027 {
0028     friend class ::KleopatraClientCopy::Gui::CertificateRequester;
0029     CertificateRequester *const q;
0030 
0031 public:
0032     explicit Private(CertificateRequester *qq)
0033         : q(qq)
0034         , selectedCertificates()
0035         , command()
0036         , multipleCertificatesAllowed(false)
0037         , onlySigningCertificatesAllowed(false)
0038         , onlyEncryptionCertificatesAllowed(false)
0039         , onlyOpenPGPCertificatesAllowed(false)
0040         , onlyX509CertificatesAllowed(false)
0041         , onlySecretKeysAllowed(false)
0042         , ui(q)
0043     {
0044     }
0045 
0046 private:
0047     void updateLineEdit()
0048     {
0049         ui.lineEdit.setText(selectedCertificates.join(QLatin1Char(' ')));
0050     }
0051     void createCommand()
0052     {
0053         std::unique_ptr<SelectCertificateCommand> cmd(new SelectCertificateCommand);
0054 
0055         cmd->setMultipleCertificatesAllowed(multipleCertificatesAllowed);
0056         cmd->setOnlySigningCertificatesAllowed(onlySigningCertificatesAllowed);
0057         cmd->setOnlyEncryptionCertificatesAllowed(onlyEncryptionCertificatesAllowed);
0058         cmd->setOnlyOpenPGPCertificatesAllowed(onlyOpenPGPCertificatesAllowed);
0059         cmd->setOnlyX509CertificatesAllowed(onlyX509CertificatesAllowed);
0060         cmd->setOnlySecretKeysAllowed(onlySecretKeysAllowed);
0061 
0062         cmd->setSelectedCertificates(selectedCertificates);
0063 
0064         if (const QWidget *const window = q->window()) {
0065             cmd->setParentWId(window->effectiveWinId());
0066         }
0067 
0068         connect(cmd.get(), SIGNAL(finished()), q, SLOT(slotCommandFinished()));
0069 
0070         command = cmd.release();
0071     }
0072 
0073     void slotButtonClicked();
0074     void slotCommandFinished();
0075 
0076 private:
0077     QStringList selectedCertificates;
0078 
0079     QPointer<SelectCertificateCommand> command;
0080 
0081     bool multipleCertificatesAllowed : 1;
0082     bool onlySigningCertificatesAllowed : 1;
0083     bool onlyEncryptionCertificatesAllowed : 1;
0084     bool onlyOpenPGPCertificatesAllowed : 1;
0085     bool onlyX509CertificatesAllowed : 1;
0086     bool onlySecretKeysAllowed : 1;
0087 
0088     struct Ui {
0089         QLineEdit lineEdit;
0090         QPushButton button;
0091         QHBoxLayout hlay;
0092 
0093         explicit Ui(CertificateRequester *qq)
0094             : lineEdit(qq)
0095             , button(i18n("Change..."), qq)
0096             , hlay(qq)
0097         {
0098             lineEdit.setObjectName(QLatin1StringView("lineEdit"));
0099             button.setObjectName(QLatin1StringView("button"));
0100             hlay.setObjectName(QLatin1StringView("hlay"));
0101 
0102             hlay.addWidget(&lineEdit, 1);
0103             hlay.addWidget(&button);
0104 
0105             lineEdit.setReadOnly(true);
0106 
0107             connect(&button, SIGNAL(clicked()), qq, SLOT(slotButtonClicked()));
0108         }
0109 
0110     } ui;
0111 };
0112 
0113 CertificateRequester::CertificateRequester(QWidget *p, Qt::WindowFlags f)
0114     : QWidget(p, f)
0115     , d(new Private(this))
0116 {
0117 }
0118 
0119 CertificateRequester::~CertificateRequester()
0120 {
0121     delete d;
0122     d = nullptr;
0123 }
0124 
0125 void CertificateRequester::setMultipleCertificatesAllowed(bool allow)
0126 {
0127     if (allow == d->multipleCertificatesAllowed) {
0128         return;
0129     }
0130     d->multipleCertificatesAllowed = allow;
0131 }
0132 
0133 bool CertificateRequester::multipleCertificatesAllowed() const
0134 {
0135     return d->multipleCertificatesAllowed;
0136 }
0137 
0138 void CertificateRequester::setOnlySigningCertificatesAllowed(bool allow)
0139 {
0140     if (allow == d->onlySigningCertificatesAllowed) {
0141         return;
0142     }
0143     d->onlySigningCertificatesAllowed = allow;
0144 }
0145 
0146 bool CertificateRequester::onlySigningCertificatesAllowed() const
0147 {
0148     return d->onlySigningCertificatesAllowed;
0149 }
0150 
0151 void CertificateRequester::setOnlyEncryptionCertificatesAllowed(bool allow)
0152 {
0153     if (allow == d->onlyEncryptionCertificatesAllowed) {
0154         return;
0155     }
0156     d->onlyEncryptionCertificatesAllowed = allow;
0157 }
0158 
0159 bool CertificateRequester::onlyEncryptionCertificatesAllowed() const
0160 {
0161     return d->onlyEncryptionCertificatesAllowed;
0162 }
0163 
0164 void CertificateRequester::setOnlyOpenPGPCertificatesAllowed(bool allow)
0165 {
0166     if (allow == d->onlyOpenPGPCertificatesAllowed) {
0167         return;
0168     }
0169     d->onlyOpenPGPCertificatesAllowed = allow;
0170 }
0171 
0172 bool CertificateRequester::onlyOpenPGPCertificatesAllowed() const
0173 {
0174     return d->onlyOpenPGPCertificatesAllowed;
0175 }
0176 
0177 void CertificateRequester::setOnlyX509CertificatesAllowed(bool allow)
0178 {
0179     if (allow == d->onlyX509CertificatesAllowed) {
0180         return;
0181     }
0182     d->onlyX509CertificatesAllowed = allow;
0183 }
0184 
0185 bool CertificateRequester::onlyX509CertificatesAllowed() const
0186 {
0187     return d->onlyX509CertificatesAllowed;
0188 }
0189 
0190 void CertificateRequester::setOnlySecretKeysAllowed(bool allow)
0191 {
0192     if (allow == d->onlySecretKeysAllowed) {
0193         return;
0194     }
0195     d->onlySecretKeysAllowed = allow;
0196 }
0197 
0198 bool CertificateRequester::onlySecretKeysAllowed() const
0199 {
0200     return d->onlySecretKeysAllowed;
0201 }
0202 
0203 void CertificateRequester::setSelectedCertificates(const QStringList &certs)
0204 {
0205     if (certs == d->selectedCertificates) {
0206         return;
0207     }
0208     d->selectedCertificates = certs;
0209     d->updateLineEdit();
0210     Q_EMIT selectedCertificatesChanged(certs);
0211 }
0212 
0213 QStringList CertificateRequester::selectedCertificates() const
0214 {
0215     return d->selectedCertificates;
0216 }
0217 
0218 void CertificateRequester::setSelectedCertificate(const QString &cert)
0219 {
0220     setSelectedCertificates(QStringList(cert));
0221 }
0222 
0223 QString CertificateRequester::selectedCertificate() const
0224 {
0225     return d->selectedCertificates.empty() ? QString() : d->selectedCertificates.front();
0226 }
0227 
0228 void CertificateRequester::Private::slotButtonClicked()
0229 {
0230     if (command) {
0231         return;
0232     }
0233     createCommand();
0234     command->start();
0235     ui.button.setEnabled(false);
0236 }
0237 
0238 void CertificateRequester::Private::slotCommandFinished()
0239 {
0240     if (command->wasCanceled()) {
0241         /* do nothing */;
0242     } else if (command->error()) {
0243         QMessageBox::information(q, i18n("Kleopatra Error"), i18n("There was an error while connecting to Kleopatra: %1", command->errorString()));
0244     } else {
0245         q->setSelectedCertificates(command->selectedCertificates());
0246     }
0247     ui.button.setEnabled(true);
0248     delete command;
0249 }
0250 
0251 #include "moc_certificaterequester.cpp"