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"