File indexing completed on 2024-11-10 04:50:03

0001 /*
0002  * SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  *
0006  */
0007 
0008 #include "filteractiondecrypt.h"
0009 #include "mailcommon_debug.h"
0010 #include "util/cryptoutils.h"
0011 
0012 #include <KColorScheme>
0013 #include <KLocalizedString>
0014 
0015 #include <KMime/Message>
0016 
0017 #include <gpgme++/decryptionresult.h>
0018 
0019 #include <Akonadi/MessageFlags>
0020 
0021 #include <QLabel>
0022 #include <QVBoxLayout>
0023 
0024 using namespace MailCommon;
0025 
0026 FilterActionDecrypt::FilterActionDecrypt(QObject *parent)
0027     : FilterActionWithCrypto(QStringLiteral("decrypt"), i18n("Decrypt"), parent)
0028 {
0029 }
0030 
0031 FilterActionDecrypt::~FilterActionDecrypt() = default;
0032 
0033 FilterAction *FilterActionDecrypt::newAction()
0034 {
0035     return new FilterActionDecrypt();
0036 }
0037 
0038 QString FilterActionDecrypt::displayString() const
0039 {
0040     return i18n("Decrypt");
0041 }
0042 
0043 QString FilterActionDecrypt::argsAsString() const
0044 {
0045     return {};
0046 }
0047 
0048 void FilterActionDecrypt::argsFromString(const QString &)
0049 {
0050 }
0051 
0052 SearchRule::RequiredPart FilterActionDecrypt::requiredPart() const
0053 {
0054     return SearchRule::CompleteMessage;
0055 }
0056 
0057 FilterAction::ReturnCode FilterActionDecrypt::process(ItemContext &context, bool) const
0058 {
0059     auto &item = context.item();
0060     if (!item.hasPayload<KMime::Message::Ptr>()) {
0061         return ErrorNeedComplete;
0062     }
0063 
0064     auto msg = item.payload<KMime::Message::Ptr>();
0065     if (!isEncrypted(msg.data())) {
0066         qCDebug(MAILCOMMON_LOG) << "Message not encrypted";
0067         return GoOn;
0068     }
0069 
0070     bool wasEncrypted;
0071     auto nec = CryptoUtils::decryptMessage(msg, wasEncrypted);
0072     if (!nec) {
0073         return wasEncrypted ? ErrorButGoOn : GoOn;
0074     }
0075 
0076     context.item().setPayload(nec);
0077     context.item().clearFlag(Akonadi::MessageFlags::Encrypted);
0078     context.setNeedsPayloadStore();
0079     context.setNeedsFlagStore();
0080     return GoOn;
0081 }
0082 
0083 QWidget *FilterActionDecrypt::createParamWidget(QWidget *parent) const
0084 {
0085     auto w = new QWidget(parent);
0086     auto l = new QVBoxLayout(w);
0087 
0088     auto lbl = new QLabel(w);
0089 
0090     QPalette palette = lbl->palette();
0091     palette.setColor(lbl->foregroundRole(), KColorScheme(QPalette::Normal).foreground(KColorScheme::NegativeText).color());
0092     lbl->setPalette(palette);
0093     lbl->setWordWrap(true);
0094 
0095     lbl->setText(i18n("<b>Warning:</b> Decrypted emails may be uploaded to a server!"));
0096     lbl->setToolTip(
0097         i18n("<p>If the email folder that you are filtering into is connected to a remote "
0098              "account (like an IMAP-Server) the decrypted content will go there.</p>"));
0099     l->addWidget(lbl);
0100 
0101     return w;
0102 }
0103 
0104 #include "moc_filteractiondecrypt.cpp"