diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-10 21:36:17 -0600 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-08-10 21:38:37 -0600 |
commit | e07a23c486f67cc2014af3fd8a639a13dd100162 (patch) | |
tree | c2e5e739b590ece4941672f3a55508ef06d6d1ac | |
parent | e354603dcb42c54ab11c0c393d5a1607ed6343d7 (diff) | |
download | kube-e07a23c486f67cc2014af3fd8a639a13dd100162.tar.gz kube-e07a23c486f67cc2014af3fd8a639a13dd100162.zip |
splitAddress does not work if the name has a comma in it
With i.e. "Mollekopf, Christian <mollekopf@example.org>", we'l end up
with an address "Mollekopf" and one "Christian <mollekopf@example.org>".
-rw-r--r-- | framework/src/domain/composercontroller.cpp | 28 | ||||
-rw-r--r-- | framework/src/domain/mime/mailtemplates.cpp | 45 | ||||
-rw-r--r-- | framework/src/domain/mime/tests/mailtemplatetest.cpp | 3 |
3 files changed, 35 insertions, 41 deletions
diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index 311c79f3..e4bd6ae2 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp | |||
@@ -22,7 +22,6 @@ | |||
22 | #include "composercontroller.h" | 22 | #include "composercontroller.h" |
23 | #include <settings/settings.h> | 23 | #include <settings/settings.h> |
24 | #include <KMime/Message> | 24 | #include <KMime/Message> |
25 | #include <KCodecs/KEmailAddress> | ||
26 | #include <QVariant> | 25 | #include <QVariant> |
27 | #include <QSortFilterProxyModel> | 26 | #include <QSortFilterProxyModel> |
28 | #include <QList> | 27 | #include <QList> |
@@ -250,24 +249,25 @@ Selector *ComposerController::identitySelector() const | |||
250 | return mIdentitySelector.data(); | 249 | return mIdentitySelector.data(); |
251 | } | 250 | } |
252 | 251 | ||
253 | static void applyAddresses(const QStringList &list, std::function<void(const QByteArray &, const QByteArray &)> callback) | 252 | static void applyAddresses(const KMime::Types::Mailbox::List &list, std::function<void(const QByteArray &, const QByteArray &)> callback) |
254 | { | 253 | { |
255 | for (const auto &to : list) { | 254 | for (const auto &to : list) { |
256 | QByteArray displayName; | 255 | callback(to.address(), to.name().toUtf8()); |
257 | QByteArray addrSpec; | ||
258 | QByteArray comment; | ||
259 | KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment); | ||
260 | callback(addrSpec, displayName); | ||
261 | } | 256 | } |
262 | } | 257 | } |
263 | 258 | ||
264 | static void applyAddresses(const QString &list, std::function<void(const QByteArray &, const QByteArray &)> callback) | 259 | static void applyAddresses(const QStringList &list, std::function<void(const QByteArray &, const QByteArray &)> callback) |
265 | { | 260 | { |
266 | applyAddresses(KEmailAddress::splitAddressList(list), callback); | 261 | KMime::Types::Mailbox::List mailboxes; |
262 | for (const auto &s : list) { | ||
263 | KMime::Types::Mailbox mb; | ||
264 | mb.fromUnicodeString(s); | ||
265 | mailboxes << mb; | ||
266 | } | ||
267 | applyAddresses(mailboxes, callback); | ||
267 | } | 268 | } |
268 | 269 | ||
269 | 270 | static QStringList getStringListFromAddresses(const KMime::Types::Mailbox::List &s) | |
270 | static QStringList getStringListFromAddresses(const QString &s) | ||
271 | { | 271 | { |
272 | QStringList list; | 272 | QStringList list; |
273 | applyAddresses(s, [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 273 | applyAddresses(s, [&](const QByteArray &addrSpec, const QByteArray &displayName) { |
@@ -332,9 +332,9 @@ void ComposerController::addAttachmentPart(KMime::Content *partToAttach) | |||
332 | 332 | ||
333 | void ComposerController::setMessage(const KMime::Message::Ptr &msg) | 333 | void ComposerController::setMessage(const KMime::Message::Ptr &msg) |
334 | { | 334 | { |
335 | mToModel->setStringList(getStringListFromAddresses(msg->to(true)->asUnicodeString())); | 335 | mToModel->setStringList(getStringListFromAddresses(msg->to(true)->mailboxes())); |
336 | mCcModel->setStringList(getStringListFromAddresses(msg->cc(true)->asUnicodeString())); | 336 | mCcModel->setStringList(getStringListFromAddresses(msg->cc(true)->mailboxes())); |
337 | mBccModel->setStringList(getStringListFromAddresses(msg->bcc(true)->asUnicodeString())); | 337 | mBccModel->setStringList(getStringListFromAddresses(msg->bcc(true)->mailboxes())); |
338 | 338 | ||
339 | setSubject(msg->subject(true)->asUnicodeString()); | 339 | setSubject(msg->subject(true)->asUnicodeString()); |
340 | setBody(MailTemplates::plaintextContent(msg)); | 340 | setBody(MailTemplates::plaintextContent(msg)); |
diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index bafe12d4..7bfcf38e 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp | |||
@@ -36,7 +36,6 @@ | |||
36 | 36 | ||
37 | #include <KCodecs/KCharsets> | 37 | #include <KCodecs/KCharsets> |
38 | #include <KMime/Types> | 38 | #include <KMime/Types> |
39 | #include <KCodecs/KEmailAddress> | ||
40 | 39 | ||
41 | #include <mimetreeparser/objecttreeparser.h> | 40 | #include <mimetreeparser/objecttreeparser.h> |
42 | 41 | ||
@@ -851,12 +850,12 @@ void MailTemplates::reply(const KMime::Message::Ptr &origMsg, const std::functio | |||
851 | const auto htmlContent = otp.htmlContent(); | 850 | const auto htmlContent = otp.htmlContent(); |
852 | 851 | ||
853 | plainMessageText(plainTextContent, htmlContent, stripSignature, [=] (const QString &body) { | 852 | plainMessageText(plainTextContent, htmlContent, stripSignature, [=] (const QString &body) { |
854 | //Quoted body */ | 853 | //Quoted body |
855 | QString plainQuote = quotedPlainText(body, origMsg->from()->displayString()); | 854 | QString plainQuote = quotedPlainText(body, origMsg->from()->displayString()); |
856 | if (plainQuote.endsWith(QLatin1Char('\n'))) { | 855 | if (plainQuote.endsWith(QLatin1Char('\n'))) { |
857 | plainQuote.chop(1); | 856 | plainQuote.chop(1); |
858 | } | 857 | } |
859 | //The plain body is complete */ | 858 | //The plain body is complete |
860 | auto plainBodyResult = plainBody + plainQuote; | 859 | auto plainBodyResult = plainBody + plainQuote; |
861 | htmlMessageText(plainTextContent, htmlContent, stripSignature, [=] (const QString &body, const QString &headElement) { | 860 | htmlMessageText(plainTextContent, htmlContent, stripSignature, [=] (const QString &body, const QString &headElement) { |
862 | //The html body is complete | 861 | //The html body is complete |
@@ -916,22 +915,17 @@ static KMime::Content *createBodyPart(const QByteArray &body) { | |||
916 | return mainMessage; | 915 | return mainMessage; |
917 | } | 916 | } |
918 | 917 | ||
919 | static void applyAddresses(const QStringList &list, std::function<void(const QByteArray &, const QByteArray &)> callback) | 918 | static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list) |
920 | { | 919 | { |
921 | for (const auto &to : list) { | 920 | KMime::Types::Mailbox::List mailboxes; |
922 | QByteArray displayName; | 921 | for (const auto &s : list) { |
923 | QByteArray addrSpec; | 922 | KMime::Types::Mailbox mb; |
924 | QByteArray comment; | 923 | mb.fromUnicodeString(s); |
925 | KEmailAddress::splitAddress(to.toUtf8(), displayName, addrSpec, comment); | 924 | mailboxes << mb; |
926 | callback(addrSpec, displayName); | ||
927 | } | 925 | } |
926 | return mailboxes; | ||
928 | } | 927 | } |
929 | 928 | ||
930 | // static void applyAddresses(const QString &list, std::function<void(const QByteArray &, const QByteArray &)> callback) | ||
931 | // { | ||
932 | // applyAddresses(KEmailAddress::splitAddressList(list), callback); | ||
933 | // } | ||
934 | |||
935 | KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList<Attachment> &attachments, const std::vector<GpgME::Key> &signingKeys) | 929 | KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList<Attachment> &attachments, const std::vector<GpgME::Key> &signingKeys) |
936 | { | 930 | { |
937 | auto mail = existingMessage; | 931 | auto mail = existingMessage; |
@@ -940,20 +934,19 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes | |||
940 | } | 934 | } |
941 | 935 | ||
942 | mail->to(true)->clear(); | 936 | mail->to(true)->clear(); |
943 | applyAddresses(to, [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 937 | for (const auto &mb : stringListToMailboxes(to)) { |
944 | mail->to(true)->addAddress(addrSpec, displayName); | 938 | mail->to()->addAddress(mb); |
945 | }); | 939 | } |
946 | |||
947 | mail->cc(true)->clear(); | 940 | mail->cc(true)->clear(); |
948 | applyAddresses(cc, [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 941 | for (const auto &mb : stringListToMailboxes(cc)) { |
949 | mail->cc(true)->addAddress(addrSpec, displayName); | 942 | mail->cc()->addAddress(mb); |
950 | }); | 943 | } |
951 | |||
952 | mail->bcc(true)->clear(); | 944 | mail->bcc(true)->clear(); |
953 | applyAddresses(bcc, [&](const QByteArray &addrSpec, const QByteArray &displayName) { | 945 | for (const auto &mb : stringListToMailboxes(bcc)) { |
954 | mail->bcc(true)->addAddress(addrSpec, displayName); | 946 | mail->bcc()->addAddress(mb); |
955 | }); | 947 | } |
956 | 948 | ||
949 | mail->from(true)->clear(); | ||
957 | mail->from(true)->addAddress(from); | 950 | mail->from(true)->addAddress(from); |
958 | 951 | ||
959 | mail->subject(true)->fromUnicodeString(subject, "utf-8"); | 952 | mail->subject(true)->fromUnicodeString(subject, "utf-8"); |
diff --git a/framework/src/domain/mime/tests/mailtemplatetest.cpp b/framework/src/domain/mime/tests/mailtemplatetest.cpp index 0e8eb2c3..92dfba65 100644 --- a/framework/src/domain/mime/tests/mailtemplatetest.cpp +++ b/framework/src/domain/mime/tests/mailtemplatetest.cpp | |||
@@ -112,6 +112,7 @@ private slots: | |||
112 | }); | 112 | }); |
113 | QTRY_VERIFY(result); | 113 | QTRY_VERIFY(result); |
114 | QCOMPARE(normalize(removeFirstLine(result->body())), normalize(msg->body())); | 114 | QCOMPARE(normalize(removeFirstLine(result->body())), normalize(msg->body())); |
115 | QCOMPARE(result->to()->addresses(), {{"konqi@example.org"}}); | ||
115 | } | 116 | } |
116 | 117 | ||
117 | void testHtmlReply() | 118 | void testHtmlReply() |
@@ -167,7 +168,7 @@ private slots: | |||
167 | void testCreatePlainMail() | 168 | void testCreatePlainMail() |
168 | { | 169 | { |
169 | QStringList to = {{"to@example.org"}}; | 170 | QStringList to = {{"to@example.org"}}; |
170 | QStringList cc = {{"cc@example.org"}};; | 171 | QStringList cc = {{"cc@example.org"}}; |
171 | QStringList bcc = {{"bcc@example.org"}};; | 172 | QStringList bcc = {{"bcc@example.org"}};; |
172 | KMime::Types::Mailbox from; | 173 | KMime::Types::Mailbox from; |
173 | from.fromUnicodeString("from@example.org"); | 174 | from.fromUnicodeString("from@example.org"); |