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"