diff options
Diffstat (limited to 'src/mdn/MDNHelper.cpp')
| -rw-r--r-- | src/mdn/MDNHelper.cpp | 353 |
1 files changed, 0 insertions, 353 deletions
diff --git a/src/mdn/MDNHelper.cpp b/src/mdn/MDNHelper.cpp deleted file mode 100644 index 1205aef2..00000000 --- a/src/mdn/MDNHelper.cpp +++ /dev/null @@ -1,353 +0,0 @@ -// -// VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 3 of -// the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// Linking this library statically or dynamically with other modules is making -// a combined work based on this library. Thus, the terms and conditions of -// the GNU General Public License cover the whole combination. -// - -#include "vmime/mdn/MDNHelper.hpp" - -#include "vmime/exception.hpp" -#include "vmime/stringContentHandler.hpp" - -#include "vmime/contentTypeField.hpp" - -#include "vmime/path.hpp" -#include "vmime/dateTime.hpp" - -#include "vmime/utility/outputStreamAdapter.hpp" - - -namespace vmime { -namespace mdn { - - -void MDNHelper::attachMDNRequest(shared_ptr <message> msg, const mailboxList& mailboxes) -{ - shared_ptr <header> hdr = msg->getHeader(); - - hdr->DispositionNotificationTo()->setValue(mailboxes); -} - - -void MDNHelper::attachMDNRequest(shared_ptr <message> msg, const mailbox& mbox) -{ - mailboxList mboxList; - mboxList.appendMailbox(vmime::clone(mbox)); - - attachMDNRequest(msg, mboxList); -} - - -const std::vector <sendableMDNInfos> MDNHelper::getPossibleMDNs(const shared_ptr <const message> msg) -{ - std::vector <sendableMDNInfos> result; - - const shared_ptr <const header> hdr = msg->getHeader(); - - if (hdr->hasField(fields::DISPOSITION_NOTIFICATION_TO)) - { - const mailboxList& dnto = - *hdr->DispositionNotificationTo()->getValue <mailboxList>(); - - for (size_t i = 0 ; i < dnto.getMailboxCount() ; ++i) - result.push_back(sendableMDNInfos(msg, *dnto.getMailboxAt(i))); - } - - return (result); -} - - -bool MDNHelper::isMDN(const shared_ptr <const message> msg) -{ - const shared_ptr <const header> hdr = msg->getHeader(); - - // A MDN message implies the following: - // - a Content-Type field is present and its value is "multipart/report" - // - a "report-type" parameter is present in the Content-Type field, - // and its value is "disposition-notification" - if (hdr->hasField(fields::CONTENT_TYPE)) - { - const contentTypeField& ctf = *dynamicCast <const contentTypeField>(hdr->ContentType()); - - const mediaType type = *ctf.getValue <mediaType>(); - - if (type.getType() == vmime::mediaTypes::MULTIPART && - type.getSubType() == vmime::mediaTypes::MULTIPART_REPORT) - { - if (ctf.hasParameter("report-type") && - ctf.getReportType() == "disposition-notification") - { - return (true); - } - } - } - - return (false); -} - - -receivedMDNInfos MDNHelper::getReceivedMDN(const shared_ptr <const message> msg) -{ - if (!isMDN(msg)) - throw exceptions::invalid_argument(); - - return receivedMDNInfos(msg); -} - - -bool MDNHelper::needConfirmation(const shared_ptr <const message> msg) -{ - shared_ptr <const header> hdr = msg->getHeader(); - - // No "Return-Path" field - if (!hdr->hasField(fields::RETURN_PATH)) - return true; - - // More than one address in Disposition-Notification-To - if (hdr->hasField(fields::DISPOSITION_NOTIFICATION_TO)) - { - const mailboxList& dnto = *hdr->DispositionNotificationTo()->getValue <mailboxList>(); - - if (dnto.getMailboxCount() > 1) - return true; - else if (dnto.getMailboxCount() == 0) - return false; - - // Return-Path != Disposition-Notification-To - const mailbox& mbox = *dnto.getMailboxAt(0); - const path& rp = *hdr->ReturnPath()->getValue <path>(); - - if (mbox.getEmail() != rp.getLocalPart() + "@" + rp.getDomain()) - return true; - } - - // User confirmation not needed - return false; -} - - -shared_ptr <message> MDNHelper::buildMDN(const sendableMDNInfos& mdnInfos, - const string& text, - const charset& ch, - const mailbox& expeditor, - const disposition& dispo, - const string& reportingUA, - const std::vector <string>& reportingUAProducts, - const std::map <string, string>& fields) -{ - // Create a new message - shared_ptr <message> msg = make_shared <message>(); - - // Fill-in header fields - shared_ptr <header> hdr = msg->getHeader(); - - hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::MULTIPART, - vmime::mediaTypes::MULTIPART_REPORT)); - dynamicCast <contentTypeField>(hdr->ContentType())->setReportType("disposition-notification"); - - hdr->Disposition()->setValue(dispo); - - addressList to; - to.appendAddress(make_shared <mailbox>(mdnInfos.getRecipient())); - hdr->To()->setValue(to); - - hdr->From()->setValue(expeditor); - - hdr->Subject()->setValue(vmime::text(word("Disposition notification"))); - - hdr->Date()->setValue(datetime::now()); - hdr->MimeVersion()->setValue(string(SUPPORTED_MIME_VERSION)); - - msg->getBody()->appendPart(createFirstMDNPart(mdnInfos, text, ch)); - msg->getBody()->appendPart(createSecondMDNPart(mdnInfos, - dispo, reportingUA, reportingUAProducts, fields)); - msg->getBody()->appendPart(createThirdMDNPart(mdnInfos)); - - return (msg); -} - - -shared_ptr <bodyPart> MDNHelper::createFirstMDNPart(const sendableMDNInfos& /* mdnInfos */, - const string& text, const charset& ch) -{ - shared_ptr <bodyPart> part = make_shared <bodyPart>(); - - // Header - shared_ptr <header> hdr = part->getHeader(); - - hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::TEXT, - vmime::mediaTypes::TEXT_PLAIN)); - - dynamicCast <contentTypeField>(hdr->ContentType())->setCharset(ch); - - // Body - part->getBody()->setContents(make_shared <stringContentHandler>(text)); - - return (part); -} - - -shared_ptr <bodyPart> MDNHelper::createSecondMDNPart(const sendableMDNInfos& mdnInfos, - const disposition& dispo, - const string& reportingUA, - const std::vector <string>& reportingUAProducts, - const std::map <string, string>& additionalFields) -{ - shared_ptr <bodyPart> part = make_shared <bodyPart>(); - - // Header - shared_ptr <header> hdr = part->getHeader(); - - hdr->ContentDisposition()->setValue(vmime::contentDispositionTypes::INLINE); - hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::MESSAGE, - vmime::mediaTypes::MESSAGE_DISPOSITION_NOTIFICATION)); - - // Body - // - // The body of a message/disposition-notification consists of one or - // more "fields" formatted according to the ABNF of [RFC-MSGFMT] header - // "fields". The syntax of the message/disposition-notification content - // is as follows: - // - // disposition-notification-content = [ reporting-ua-field CRLF ] - // [ mdn-gateway-field CRLF ] - // [ original-recipient-field CRLF ] - // final-recipient-field CRLF - // [ original-message-id-field CRLF ] - // disposition-field CRLF - // *( failure-field CRLF ) - // *( error-field CRLF ) - // *( warning-field CRLF ) - // *( extension-field CRLF ) - // - header fields; - - // -- Reporting-UA (optional) - if (!reportingUA.empty()) - { - string ruaText; - ruaText = reportingUA; - - for (unsigned int i = 0 ; i < reportingUAProducts.size() ; ++i) - { - if (i == 0) - ruaText += "; "; - else - ruaText += ", "; - - ruaText += reportingUAProducts[i]; - } - - shared_ptr <headerField> rua = headerFieldFactory::getInstance()-> - create(vmime::fields::REPORTING_UA); - - rua->setValue(ruaText); - - fields.appendField(rua); - } - - // -- Final-Recipient - shared_ptr <headerField> fr = headerFieldFactory::getInstance()-> - create(vmime::fields::FINAL_RECIPIENT); - - fr->setValue("rfc822; " + mdnInfos.getRecipient().getEmail().generate()); - - fields.appendField(fr); - - // -- Original-Message-ID - if (mdnInfos.getMessage()->getHeader()->hasField(vmime::fields::MESSAGE_ID)) - { - fields.OriginalMessageId()->setValueConst - (mdnInfos.getMessage()->getHeader()->MessageId()->getValue()); - } - - // -- Disposition - fields.Disposition()->setValue(dispo); - - // -- Failure, Error and Warning fields - std::map <string, string>::const_iterator it; - - if (additionalFields.size() > 0) - { - it = additionalFields.find(vmime::fields::ERROR); - if (it != additionalFields.end()) - { - shared_ptr <headerField> error = headerFieldFactory::getInstance()-> - create(vmime::fields::ERROR); - error->setValue(it->second); - fields.appendField(error); - } - - it = additionalFields.find(vmime::fields::WARNING); - if (it != additionalFields.end()) - { - shared_ptr <headerField> warn = headerFieldFactory::getInstance()-> - create(vmime::fields::WARNING); - warn->setValue(it->second); - fields.appendField(warn); - } - - it = additionalFields.find(vmime::fields::FAILURE); - if (it != additionalFields.end()) - { - shared_ptr <headerField> fail = headerFieldFactory::getInstance()-> - create(vmime::fields::FAILURE); - fail->setValue(it->second); - fields.appendField(fail); - } - } - - - std::ostringstream oss; - utility::outputStreamAdapter vos(oss); - - fields.generate(vos); - - part->getBody()->setContents(make_shared <stringContentHandler>(oss.str())); - - return (part); -} - - -shared_ptr <bodyPart> MDNHelper::createThirdMDNPart(const sendableMDNInfos& mdnInfos) -{ - shared_ptr <bodyPart> part = make_shared <bodyPart>(); - - // Header - shared_ptr <header> hdr = part->getHeader(); - - hdr->ContentDisposition()->setValue(vmime::contentDispositionTypes::INLINE); - hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::TEXT, - vmime::mediaTypes::TEXT_RFC822_HEADERS)); - - // Body: original message headers - std::ostringstream oss; - utility::outputStreamAdapter vos(oss); - - mdnInfos.getMessage()->getHeader()->generate(vos); - - part->getBody()->setContents(make_shared <stringContentHandler>(oss.str())); - - return (part); -} - - -} // mdn -} // vmime |
