File indexing completed on 2024-06-23 05:13:53
0001 /* -*- mode: c++; c-basic-offset:4 -*- 0002 crypto/gui/signencryptwizard.cpp 0003 0004 This file is part of Kleopatra, the KDE keymanager 0005 SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include <config-kleopatra.h> 0011 0012 #include "signencryptwizard.h" 0013 0014 #include "objectspage.h" 0015 #include "resolverecipientspage.h" 0016 #include "resultpage.h" 0017 #include "signerresolvepage.h" 0018 0019 #include <crypto/certificateresolver.h> 0020 #include <crypto/task.h> 0021 #include <crypto/taskcollection.h> 0022 0023 #include <utils/kleo_assert.h> 0024 0025 #include <Libkleo/Stl_Util> 0026 0027 #include <gpgme++/key.h> 0028 0029 #include <KConfig> 0030 0031 #include <QFileInfo> 0032 #include <QTimer> 0033 0034 #include <KSharedConfig> 0035 0036 using namespace Kleo; 0037 using namespace Kleo::Crypto; 0038 using namespace Kleo::Crypto::Gui; 0039 using namespace GpgME; 0040 using namespace KMime::Types; 0041 0042 class SignEncryptWizard::Private 0043 { 0044 friend class ::Kleo::Crypto::Gui::SignEncryptWizard; 0045 SignEncryptWizard *const q; 0046 0047 public: 0048 explicit Private(SignEncryptWizard *qq); 0049 ~Private(); 0050 0051 void setCommitPage(Page::Id page); 0052 0053 ResolveRecipientsPage *const recipientResolvePage; 0054 SignerResolvePage *const signerResolvePage; 0055 ObjectsPage *const objectsPage; 0056 ResultPage *const resultPage; 0057 }; 0058 0059 SignEncryptWizard::Private::Private(SignEncryptWizard *qq) 0060 : q(qq) 0061 , recipientResolvePage(new ResolveRecipientsPage) 0062 , signerResolvePage(new SignerResolvePage) 0063 , objectsPage(new ObjectsPage) 0064 , resultPage(new ResultPage) 0065 { 0066 q->setPage(Page::ResolveSigner, signerResolvePage); 0067 q->setPage(Page::Objects, objectsPage); 0068 q->setPage(Page::ResolveRecipients, recipientResolvePage); 0069 q->setPage(Page::Result, resultPage); 0070 // TODO: move the RecipientPreferences creation out of here, don't create a new instance for each wizard 0071 recipientResolvePage->setRecipientPreferences(std::shared_ptr<RecipientPreferences>(new KConfigBasedRecipientPreferences(KSharedConfig::openConfig()))); 0072 signerResolvePage->setSigningPreferences(std::shared_ptr<SigningPreferences>(new KConfigBasedSigningPreferences(KSharedConfig::openConfig()))); 0073 q->resize(QSize(640, 480).expandedTo(q->sizeHint())); 0074 } 0075 0076 void SignEncryptWizard::onNext(int currentId) 0077 { 0078 if (currentId == Page::ResolveRecipients) { 0079 QTimer::singleShot(0, this, &SignEncryptWizard::recipientsResolved); 0080 } 0081 if (currentId == Page::ResolveSigner) { 0082 // FIXME: Sign&Encrypt is only supported by OpenPGP. Remove this when we support this for CMS, too 0083 if (encryptionSelected() && signingSelected()) { 0084 setPresetProtocol(OpenPGP); 0085 } 0086 QTimer::singleShot(0, this, &SignEncryptWizard::signersResolved); 0087 } 0088 if (currentId == Page::Objects) { 0089 QTimer::singleShot(0, this, &SignEncryptWizard::objectsResolved); 0090 } 0091 } 0092 0093 SignEncryptWizard::Private::~Private() 0094 { 0095 } 0096 0097 SignEncryptWizard::SignEncryptWizard(QWidget *p, Qt::WindowFlags f) 0098 : Wizard(p, f) 0099 , d(new Private(this)) 0100 { 0101 } 0102 0103 SignEncryptWizard::~SignEncryptWizard() 0104 { 0105 } 0106 0107 void SignEncryptWizard::setCommitPage(Page::Id page) 0108 { 0109 d->setCommitPage(page); 0110 } 0111 0112 void SignEncryptWizard::Private::setCommitPage(Page::Id page) 0113 { 0114 q->page(Page::ResolveSigner)->setCommitPage(false); 0115 q->page(Page::ResolveRecipients)->setCommitPage(false); 0116 q->page(Page::Objects)->setCommitPage(false); 0117 q->page(Page::Result)->setCommitPage(false); 0118 q->page(page)->setCommitPage(true); 0119 } 0120 0121 void SignEncryptWizard::setPresetProtocol(Protocol proto) 0122 { 0123 d->signerResolvePage->setPresetProtocol(proto); 0124 d->signerResolvePage->setProtocolSelectionUserMutable(proto == UnknownProtocol); 0125 d->recipientResolvePage->setPresetProtocol(proto); 0126 } 0127 0128 GpgME::Protocol SignEncryptWizard::selectedProtocol() const 0129 { 0130 return d->recipientResolvePage->selectedProtocol(); 0131 } 0132 0133 GpgME::Protocol SignEncryptWizard::presetProtocol() const 0134 { 0135 return d->recipientResolvePage->presetProtocol(); 0136 } 0137 0138 void SignEncryptWizard::setEncryptionSelected(bool selected) 0139 { 0140 d->signerResolvePage->setEncryptionSelected(selected); 0141 } 0142 0143 void SignEncryptWizard::setSigningSelected(bool selected) 0144 { 0145 d->signerResolvePage->setSigningSelected(selected); 0146 } 0147 0148 bool SignEncryptWizard::isSigningUserMutable() const 0149 { 0150 return d->signerResolvePage->isSigningUserMutable(); 0151 } 0152 0153 void SignEncryptWizard::setSigningUserMutable(bool isMutable) 0154 { 0155 d->signerResolvePage->setSigningUserMutable(isMutable); 0156 } 0157 0158 bool SignEncryptWizard::isEncryptionUserMutable() const 0159 { 0160 return d->signerResolvePage->isEncryptionUserMutable(); 0161 } 0162 0163 bool SignEncryptWizard::isMultipleProtocolsAllowed() const 0164 { 0165 return d->recipientResolvePage->multipleProtocolsAllowed(); 0166 } 0167 0168 void SignEncryptWizard::setMultipleProtocolsAllowed(bool allowed) 0169 { 0170 d->signerResolvePage->setMultipleProtocolsAllowed(allowed); 0171 d->recipientResolvePage->setMultipleProtocolsAllowed(allowed); 0172 } 0173 0174 void SignEncryptWizard::setEncryptionUserMutable(bool isMutable) 0175 { 0176 d->signerResolvePage->setEncryptionUserMutable(isMutable); 0177 } 0178 0179 void SignEncryptWizard::setFiles(const QStringList &files) 0180 { 0181 d->objectsPage->setFiles(files); 0182 } 0183 0184 QFileInfoList SignEncryptWizard::resolvedFiles() const 0185 { 0186 const QStringList files = d->objectsPage->files(); 0187 QFileInfoList fileInfos; 0188 for (const QString &i : files) { 0189 fileInfos.push_back(QFileInfo(i)); 0190 } 0191 return fileInfos; 0192 } 0193 0194 bool SignEncryptWizard::signingSelected() const 0195 { 0196 return d->signerResolvePage->signingSelected(); 0197 } 0198 0199 bool SignEncryptWizard::encryptionSelected() const 0200 { 0201 return d->signerResolvePage->encryptionSelected(); 0202 } 0203 0204 void SignEncryptWizard::setSignersAndCandidates(const std::vector<Mailbox> &signers, const std::vector<std::vector<Key>> &keys) 0205 { 0206 d->signerResolvePage->setSignersAndCandidates(signers, keys); 0207 } 0208 0209 void SignEncryptWizard::setTaskCollection(const std::shared_ptr<TaskCollection> &coll) 0210 { 0211 kleo_assert(coll); 0212 d->resultPage->setTaskCollection(coll); 0213 } 0214 0215 std::vector<Key> SignEncryptWizard::resolvedCertificates() const 0216 { 0217 return d->recipientResolvePage->resolvedCertificates(); 0218 } 0219 0220 std::vector<Key> SignEncryptWizard::resolvedSigners() const 0221 { 0222 return d->signerResolvePage->resolvedSigners(); 0223 } 0224 0225 bool SignEncryptWizard::isAsciiArmorEnabled() const 0226 { 0227 return d->signerResolvePage->isAsciiArmorEnabled(); 0228 } 0229 0230 void SignEncryptWizard::setAsciiArmorEnabled(bool enabled) 0231 { 0232 d->signerResolvePage->setAsciiArmorEnabled(enabled); 0233 } 0234 0235 bool SignEncryptWizard::recipientsUserMutable() const 0236 { 0237 return d->recipientResolvePage->recipientsUserMutable(); 0238 } 0239 0240 void SignEncryptWizard::setRecipientsUserMutable(bool isMutable) 0241 { 0242 d->recipientResolvePage->setRecipientsUserMutable(isMutable); 0243 } 0244 0245 void SignEncryptWizard::setSignerResolvePageValidator(const std::shared_ptr<SignerResolvePage::Validator> &validator) 0246 { 0247 d->signerResolvePage->setValidator(validator); 0248 } 0249 0250 Gui::SignerResolvePage *SignEncryptWizard::signerResolvePage() 0251 { 0252 return d->signerResolvePage; 0253 } 0254 0255 const Gui::SignerResolvePage *SignEncryptWizard::signerResolvePage() const 0256 { 0257 return d->signerResolvePage; 0258 } 0259 0260 Gui::ResolveRecipientsPage *SignEncryptWizard::resolveRecipientsPage() 0261 { 0262 return d->recipientResolvePage; 0263 } 0264 0265 Gui::ObjectsPage *SignEncryptWizard::objectsPage() 0266 { 0267 return d->objectsPage; 0268 } 0269 0270 Gui::ResultPage *SignEncryptWizard::resultPage() 0271 { 0272 return d->resultPage; 0273 } 0274 0275 bool SignEncryptWizard::keepResultPageOpenWhenDone() const 0276 { 0277 return d->resultPage->keepOpenWhenDone(); 0278 } 0279 0280 void SignEncryptWizard::setKeepResultPageOpenWhenDone(bool keep) 0281 { 0282 d->resultPage->setKeepOpenWhenDone(keep); 0283 } 0284 0285 #include "moc_signencryptwizard.cpp"