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

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     crypto/gui/signemailwizard.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB
0006     SPDX-FileCopyrightText: 2023 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 "signemailwizard.h"
0015 
0016 #include "signerresolvepage.h"
0017 
0018 #include <settings.h>
0019 
0020 #include <Libkleo/Formatting>
0021 
0022 #include <KLocalizedString>
0023 
0024 #include <gpgme++/key.h>
0025 
0026 using namespace Kleo;
0027 using namespace Kleo::Crypto::Gui;
0028 using namespace GpgME;
0029 
0030 namespace
0031 {
0032 
0033 class SignerResolveValidator : public SignerResolvePage::Validator
0034 {
0035 public:
0036     explicit SignerResolveValidator(SignerResolvePage *page);
0037     bool isComplete() const override;
0038     QString explanation() const override;
0039     void update() const;
0040     QString customWindowTitle() const override
0041     {
0042         return QString();
0043     }
0044 
0045 private:
0046     SignerResolvePage *m_page;
0047     mutable QString expl;
0048     mutable bool complete;
0049 };
0050 }
0051 
0052 SignerResolveValidator::SignerResolveValidator(SignerResolvePage *page)
0053     : SignerResolvePage::Validator()
0054     , m_page(page)
0055     , complete(true)
0056 {
0057     Q_ASSERT(m_page);
0058 }
0059 
0060 void SignerResolveValidator::update() const
0061 {
0062     const bool haveSelected = !m_page->selectedProtocols().empty();
0063     const std::set<Protocol> missing = m_page->selectedProtocolsWithoutSigningCertificate();
0064 
0065     complete = haveSelected && missing.empty();
0066     expl.clear();
0067     if (complete) {
0068         return;
0069     }
0070     if (!haveSelected) {
0071         expl = i18n("You need to select a signing certificate to proceed.");
0072         return;
0073     }
0074 
0075     Q_ASSERT(missing.size() <= 2);
0076     if (missing.size() == 1) {
0077         if (missing.find(OpenPGP) != missing.end()) {
0078             expl = i18n("You need to select an OpenPGP signing certificate to proceed.");
0079         } else {
0080             expl = i18n("You need to select an S/MIME signing certificate to proceed.");
0081         }
0082     } else {
0083         expl = i18n("You need to select an OpenPGP signing certificate and an S/MIME signing certificate to proceed.");
0084     }
0085 }
0086 
0087 QString SignerResolveValidator::explanation() const
0088 {
0089     update();
0090     return expl;
0091 }
0092 
0093 bool SignerResolveValidator::isComplete() const
0094 {
0095     update();
0096     return complete;
0097 }
0098 
0099 SignEMailWizard::SignEMailWizard(QWidget *parent, Qt::WindowFlags f)
0100     : SignEncryptWizard(parent, f)
0101 {
0102     setWindowTitle(i18nc("@title:window", "Sign Text"));
0103 
0104     std::vector<int> pageOrder;
0105     setSignerResolvePageValidator(std::shared_ptr<SignerResolveValidator>(new SignerResolveValidator(signerResolvePage())));
0106     pageOrder.push_back(Page::ResolveSigner);
0107     pageOrder.push_back(Page::Result);
0108     setPageOrder(pageOrder);
0109     setCommitPage(Page::ResolveSigner);
0110     setEncryptionSelected(false);
0111     setEncryptionUserMutable(false);
0112     setSigningSelected(true);
0113     setSigningUserMutable(false);
0114     signerResolvePage()->setProtocolSelectionUserMutable(false);
0115     setMultipleProtocolsAllowed(false);
0116 
0117     setKeepResultPageOpenWhenDone(Kleo::Settings{}.showResultsAfterSigningClipboard());
0118 }
0119 
0120 SignEMailWizard::~SignEMailWizard()
0121 {
0122     // always save the setting even if the dialog was canceled (the dialog's result
0123     // is always Rejected because the result page has no Finish button)
0124     Kleo::Settings settings;
0125     settings.setShowResultsAfterSigningClipboard(keepResultPageOpenWhenDone());
0126     settings.save();
0127 }
0128 
0129 #include "moc_signemailwizard.cpp"