File indexing completed on 2024-06-02 05:28:45

0001 /*
0002   SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "mdnwarningjob.h"
0008 #include "kernel/mailkernel.h"
0009 #include "mailcommon_debug.h"
0010 #include "util/mailutil.h"
0011 #include <Akonadi/ItemModifyJob>
0012 #include <Akonadi/MDNStateAttribute>
0013 #include <MessageComposer/MessageSender>
0014 #include <MessageComposer/Util>
0015 #include <MessageViewer/MessageViewerSettings>
0016 using namespace MailCommon;
0017 MDNWarningJob::MDNWarningJob(IKernel *kernel, QObject *parent)
0018     : QObject{parent}
0019     , mKernel(kernel)
0020 {
0021 }
0022 
0023 MDNWarningJob::~MDNWarningJob()
0024 {
0025 }
0026 
0027 void MDNWarningJob::start()
0028 {
0029     if (!canStart()) {
0030         qCWarning(MAILCOMMON_LOG) << " Impossible to start MDNWarningJob";
0031         deleteLater();
0032         return;
0033     }
0034     const Akonadi::Collection collection = mItem.parentCollection();
0035     if (collection.isValid()
0036         && (CommonKernel->folderIsSentMailFolder(collection) || CommonKernel->folderIsTrash(collection) || CommonKernel->folderIsDraftOrOutbox(collection)
0037             || CommonKernel->folderIsTemplates(collection))) {
0038         qCWarning(MAILCOMMON_LOG) << " It's not a valid collection";
0039         deleteLater();
0040         return;
0041     }
0042 
0043     const KMime::Message::Ptr message = MessageComposer::Util::message(mItem);
0044     if (!message) {
0045         qCWarning(MAILCOMMON_LOG) << " It's not a valid message";
0046         deleteLater();
0047         return;
0048     }
0049 
0050     const QPair<bool, KMime::MDN::SendingMode> mdnSend = modifyItem(message);
0051     qCDebug(MAILCOMMON_LOG) << " Send " << mdnSend.first << " mdnSend.sendmode " << mdnSend.second;
0052 
0053     if (mdnSend.first) {
0054         const int quote = MessageViewer::MessageViewerSettings::self()->quoteMessage();
0055 
0056         MessageComposer::MessageFactoryNG factory(message, Akonadi::Item().id());
0057         factory.setIdentityManager(mKernel->identityManager());
0058         factory.setFolderIdentity(MailCommon::Util::folderIdentity(mItem));
0059 
0060         const KMime::Message::Ptr mdn = factory.createMDN(KMime::MDN::ManualAction, KMime::MDN::Displayed, mdnSend.second, quote);
0061         if (mdn) {
0062             if (!mKernel->msgSender()->send(mdn)) {
0063                 qCDebug(MAILCOMMON_LOG) << "Sending failed.";
0064             }
0065         }
0066     }
0067     Q_EMIT finished();
0068     deleteLater();
0069 }
0070 
0071 const Akonadi::Item &MDNWarningJob::item() const
0072 {
0073     return mItem;
0074 }
0075 
0076 void MDNWarningJob::setItem(const Akonadi::Item &newItem)
0077 {
0078     mItem = newItem;
0079 }
0080 
0081 bool MDNWarningJob::canStart() const
0082 {
0083     return mItem.isValid() && (mResponse != Unknown);
0084 }
0085 
0086 QPair<bool, KMime::MDN::SendingMode> MDNWarningJob::modifyItem(const KMime::Message::Ptr &msg)
0087 {
0088     QPair<bool, KMime::MDN::SendingMode> result;
0089     auto mdnStateAttr = new Akonadi::MDNStateAttribute(Akonadi::MDNStateAttribute::MDNStateUnknown);
0090     // create a minimal version of item with just the attribute we want to change
0091     bool doSend = false;
0092     // RFC 2298: An MDN MUST NOT be generated in response to an MDN.
0093     if (MessageComposer::Util::findTypeInMessage(msg.data(), "message", "disposition-notification")) {
0094         mdnStateAttr->setMDNState(Akonadi::MDNStateAttribute::MDNIgnore);
0095     } else if (mResponse == MDNIgnore) { // ignore
0096         doSend = false;
0097         mdnStateAttr->setMDNState(Akonadi::MDNStateAttribute::MDNIgnore);
0098     } else if (mResponse == Denied) { // denied
0099         doSend = true;
0100         mdnStateAttr->setMDNState(Akonadi::MDNStateAttribute::MDNDenied);
0101     } else if (mResponse == Send) { // the user wants to send. let's make sure we can, according to the RFC.
0102         doSend = true;
0103         mdnStateAttr->setMDNState(MessageComposer::MDNAdviceHelper::dispositionToSentState(KMime::MDN::Displayed));
0104     }
0105     result.first = doSend;
0106     result.second = mSendingMode;
0107     Akonadi::Item i(mItem.id());
0108     i.setRevision(mItem.revision());
0109     i.setMimeType(mItem.mimeType());
0110     i.addAttribute(mdnStateAttr);
0111     auto modify = new Akonadi::ItemModifyJob(i);
0112     modify->setIgnorePayload(true);
0113     modify->disableRevisionCheck();
0114     return result;
0115 }
0116 
0117 KMime::MDN::SendingMode MDNWarningJob::sendingMode() const
0118 {
0119     return mSendingMode;
0120 }
0121 
0122 void MDNWarningJob::setSendingMode(KMime::MDN::SendingMode newSendingMode)
0123 {
0124     mSendingMode = newSendingMode;
0125 }
0126 
0127 MDNWarningJob::ResponseMDN MDNWarningJob::response() const
0128 {
0129     return mResponse;
0130 }
0131 
0132 void MDNWarningJob::setResponse(ResponseMDN newResponse)
0133 {
0134     mResponse = newResponse;
0135 }
0136 
0137 #include "moc_mdnwarningjob.cpp"