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"