From ae1c5a0a53d1fd351b6fd33e8a46ad1034874489 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 14 Jun 2017 12:39:29 +0200 Subject: Deal with both CRLF and LF mime messages. IMAP always requires CRLF, and so does the MIME standard, KMIME expects LF-only. We now just try to always use CRLF on disk, but convert LF-only messages should we have to (e.g. because copied over from maildir or so). --- examples/imapresource/imapresource.cpp | 15 ++++++++++++--- .../mailtransportresource/tests/mailtransporttest.cpp | 4 ++-- tests/interresourcemovetest.cpp | 2 +- tests/mailsynctest.cpp | 2 +- tests/mailtest.cpp | 18 +++++++++--------- tests/mailthreadtest.cpp | 6 +++--- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 945962f..25d9534 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -197,7 +197,7 @@ public: auto mail = Sink::ApplicationDomain::Mail::create(mResourceInstanceIdentifier); mail.setFolder(folderLocalId); - mail.setMimeMessage(message.msg->encodedContent()); + mail.setMimeMessage(message.msg->encodedContent(true)); mail.setExtractedFullPayloadAvailable(message.fullPayload); setFlags(mail, message.flags); @@ -608,6 +608,15 @@ public: } return KAsync::error("Nothing to do"); } + static QByteArray ensureCRLF(const QByteArray &data) { + auto index = data.indexOf('\n'); + if (index > 0 && data.at(index - 1) == '\r') { //First line is LF-only terminated + //Convert back and forth in case there's a mix. We don't want to expand CRLF into CRCRLF. + return KMime::LFtoCRLF(KMime::CRLFtoLF(data)); + } else { + return data; + } + } KAsync::Job replay(const ApplicationDomain::Mail &mail, Sink::Operation operation, const QByteArray &oldRemoteId, const QList &changedProperties) Q_DECL_OVERRIDE { @@ -616,7 +625,7 @@ public: KAsync::Job job = KAsync::null(); if (operation == Sink::Operation_Creation) { const QString mailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, mail.getFolder()); - const QByteArray content = mail.getMimeMessage(); + const auto content = ensureCRLF(mail.getMimeMessage()); const auto flags = getFlags(mail); const QDateTime internalDate = mail.getDate(); job = login.then(imap->append(mailbox, content, flags, internalDate)) @@ -651,7 +660,7 @@ public: if (messageChanged || messageMoved) { const auto folderId = folderIdFromMailRid(oldRemoteId); const QString oldMailbox = syncStore().resolveLocalId(ENTITY_TYPE_FOLDER, folderId); - const QByteArray content = mail.getMimeMessage(); + const auto content = ensureCRLF(mail.getMimeMessage()); const QDateTime internalDate = mail.getDate(); SinkTrace() << "Replacing message. Old mailbox: " << oldMailbox << "New mailbox: " << mailbox << "Flags: " << flags << "Content: " << content; KIMAP2::ImapSet set; diff --git a/examples/mailtransportresource/tests/mailtransporttest.cpp b/examples/mailtransportresource/tests/mailtransporttest.cpp index e4cc447..2a831ed 100644 --- a/examples/mailtransportresource/tests/mailtransporttest.cpp +++ b/examples/mailtransportresource/tests/mailtransporttest.cpp @@ -64,7 +64,7 @@ private slots: message->assemble(); auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); VERIFYEXEC(Store::create(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); @@ -92,7 +92,7 @@ private slots: message->assemble(); auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); VERIFYEXEC(Store::create(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); diff --git a/tests/interresourcemovetest.cpp b/tests/interresourcemovetest.cpp index 3ac6ad4..5438bc7 100644 --- a/tests/interresourcemovetest.cpp +++ b/tests/interresourcemovetest.cpp @@ -48,7 +48,7 @@ class InterResourceMoveTest : public QObject m.subject(true)->fromUnicodeString(subject, "utf8"); m.messageID(true)->setIdentifier(uid); m.assemble(); - return m.encodedContent(); + return m.encodedContent(true); } private slots: diff --git a/tests/mailsynctest.cpp b/tests/mailsynctest.cpp index 5d51fbc..27b29a5 100644 --- a/tests/mailsynctest.cpp +++ b/tests/mailsynctest.cpp @@ -275,7 +275,7 @@ void MailSyncTest::testListMails() QVERIFY(!data.isEmpty()); KMime::Message m; - m.setContent(data); + m.setContent(KMime::CRLFtoLF(data)); m.parse(); QCOMPARE(mail->getSubject(), m.subject(true)->asUnicodeString()); QVERIFY(!mail->getFolder().isEmpty()); diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp index e1361e4..cbb56d5 100644 --- a/tests/mailtest.cpp +++ b/tests/mailtest.cpp @@ -152,7 +152,7 @@ void MailTest::testCreateModifyDeleteMail() message->assemble(); auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); @@ -166,7 +166,7 @@ void MailTest::testCreateModifyDeleteMail() QCOMPARE(mail.getFolder(), folder.identifier()); QVERIFY(QFile(mail.getMimeMessagePath()).exists()); KMime::Message m; - m.setContent(mail.getMimeMessage()); + m.setContent(KMime::CRLFtoLF(mail.getMimeMessage())); m.parse(); QCOMPARE(m.subject(true)->asUnicodeString(), subject); }); @@ -182,7 +182,7 @@ void MailTest::testCreateModifyDeleteMail() auto message2 = KMime::Message::Ptr::create(); message2->subject(true)->fromUnicodeString(subject2, "utf8"); message2->assemble(); - mail.setMimeMessage(message2->encodedContent()); + mail.setMimeMessage(message2->encodedContent(true)); VERIFYEXEC(Store::modify(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); @@ -195,7 +195,7 @@ void MailTest::testCreateModifyDeleteMail() QCOMPARE(mail.getFolder(), folder.identifier()); QVERIFY(QFile(mail.getMimeMessagePath()).exists()); KMime::Message m; - m.setContent(mail.getMimeMessage()); + m.setContent(KMime::CRLFtoLF(mail.getMimeMessage())); m.parse(); QCOMPARE(m.subject(true)->asUnicodeString(), subject2); }); @@ -237,7 +237,7 @@ void MailTest::testMoveMail() message->assemble(); auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); @@ -289,7 +289,7 @@ void MailTest::testMarkMailAsRead() message->assemble(); auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setFolder(folder); mail.setUnread(true); VERIFYEXEC(Store::create(mail)); @@ -341,7 +341,7 @@ void MailTest::testCreateDraft() message->assemble(); auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setDraft(true); VERIFYEXEC(Store::create(mail)); @@ -391,7 +391,7 @@ void MailTest::testModifyMailToDraft() message->assemble(); auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setDraft(false); mail.setFolder(folder); @@ -438,7 +438,7 @@ void MailTest::testModifyMailToTrash() message->assemble(); auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message->encodedContent()); + mail.setMimeMessage(message->encodedContent(true)); mail.setTrash(false); mail.setFolder(folder); diff --git a/tests/mailthreadtest.cpp b/tests/mailthreadtest.cpp index 02b29f6..741eb78 100644 --- a/tests/mailthreadtest.cpp +++ b/tests/mailthreadtest.cpp @@ -117,7 +117,7 @@ void MailThreadTest::testIndexInMixedOrder() { auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message3->encodedContent()); + mail.setMimeMessage(message3->encodedContent(true)); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); } @@ -140,7 +140,7 @@ void MailThreadTest::testIndexInMixedOrder() { auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message2->encodedContent()); + mail.setMimeMessage(message2->encodedContent(true)); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); } @@ -156,7 +156,7 @@ void MailThreadTest::testIndexInMixedOrder() { auto mail = Mail::create(mResourceInstanceIdentifier); - mail.setMimeMessage(message1->encodedContent()); + mail.setMimeMessage(message1->encodedContent(true)); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); } -- cgit v1.2.3