[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kube/develop] framework/src/domain/mime: Reply to signed messages.
From:       Christian Mollekopf <null () kde ! org>
Date:       2017-06-30 18:01:23
Message-ID: E1dR0EN-0000Z4-Q2 () code ! kde ! org
[Download RAW message or body]

Git commit 241a446b0661b668e24e297753d4dfc762fb1fd4 by Christian Mollekopf.
Committed on 30/06/2017 at 15:36.
Pushed by cmollekopf into branch 'develop'.

Reply to signed messages.

M  +1    -0    framework/src/domain/mime/mailtemplates.cpp
M  +62   -71   framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
M  +6    -14   framework/src/domain/mime/mimetreeparser/objecttreeparser.h
M  +2    -2    framework/src/domain/mime/tests/mailtemplatetest.cpp

https://commits.kde.org/kube/241a446b0661b668e24e297753d4dfc762fb1fd4

diff --git a/framework/src/domain/mime/mailtemplates.cpp \
b/framework/src/domain/mime/mailtemplates.cpp index c202af8..6d02124 100644
--- a/framework/src/domain/mime/mailtemplates.cpp
+++ b/framework/src/domain/mime/mailtemplates.cpp
@@ -842,6 +842,7 @@ void MailTemplates::reply(const KMime::Message::Ptr &origMsg, \
const std::functio  
     MimeTreeParser::ObjectTreeParser otp;
     otp.parseObjectTree(origMsg.data());
+    otp.decryptParts();
     const auto plainTextContent = otp.plainTextContent();
     const auto htmlContent = otp.htmlContent();
 
diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp \
b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp index \
                0c3f60a..7e2be0e 100644
--- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
+++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.cpp
@@ -60,6 +60,32 @@
 
 using namespace MimeTreeParser;
 
+/*
+ * Collect message parts bottom up.
+ * Filter to avoid evaluating a subtree.
+ * Select parts to include it in the result set. Selecting a part in a branch will \
keep any parent parts from being selected. + */
+static QVector<MessagePart::Ptr> collect(MessagePart::Ptr start, const \
std::function<bool(const MessagePartPtr &)> &evaluateSubtree, const \
std::function<bool(const MessagePartPtr &)> &select) +{
+    MessagePartPtr ptr = start.dynamicCast<MessagePart>();
+    Q_ASSERT(ptr);
+    QVector<MessagePart::Ptr> list;
+    if (evaluateSubtree(ptr)) {
+        for (const auto &p: ptr->subParts()) {
+            list << ::collect(p, evaluateSubtree, select);
+        }
+    }
+
+    //Don't consider this part if we already selected a subpart
+    if (list.isEmpty()) {
+        if (select(ptr)) {
+            list << start;
+        }
+    }
+    return list;
+}
+
+
 
 ObjectTreeParser::ObjectTreeParser()
     : mNodeHelper(nullptr),
@@ -96,14 +122,46 @@ ObjectTreeParser::~ObjectTreeParser()
     }
 }
 
-QString ObjectTreeParser::plainTextContent() const
+QString ObjectTreeParser::plainTextContent()
 {
-    return mPlainTextContent;
+    QString content;
+    if (mParsedPart) {
+        auto plainParts = ::collect(mParsedPart,
+            [] (const MessagePartPtr &part) {
+                return true;
+            },
+            [] (const MessagePartPtr &part) {
+                if (dynamic_cast<MimeTreeParser::TextMessagePart*>(part.data())) {
+                    return true;
+                }
+                return false;
+            });
+        for (const auto &part : plainParts) {
+            content += part->text();
+        }
+    }
+    return content;
 }
 
-QString ObjectTreeParser::htmlContent() const
+QString ObjectTreeParser::htmlContent()
 {
-    return mHtmlContent;
+    QString content;
+    if (mParsedPart) {
+        QVector<MessagePart::Ptr> contentParts = ::collect(mParsedPart,
+            [] (const MessagePartPtr &part) {
+                return true;
+            },
+            [] (const MessagePartPtr &part) {
+                if (dynamic_cast<MimeTreeParser::HtmlMessagePart*>(part.data())) {
+                    return true;
+                }
+                return false;
+            });
+        for (const auto &part : contentParts) {
+            content += part->text();
+        }
+    }
+    return content;
 }
 
 static void print(KMime::Content *node, const QString prefix = {})
@@ -165,31 +223,6 @@ KMime::Content *ObjectTreeParser::find(const \
std::function<bool(KMime::Content *  return ::find(mTopLevelContent, select);
 }
 
-/*
- * Collect message parts bottom up.
- * Filter to avoid evaluating a subtree.
- * Select parts to include it in the result set. Selecting a part in a branch will \
                keep any parent parts from being selected.
- */
-static QVector<MessagePart::Ptr> collect(MessagePart::Ptr start, const \
std::function<bool(const MessagePartPtr &)> &evaluateSubtree, const \
                std::function<bool(const MessagePartPtr &)> &select)
-{
-    MessagePartPtr ptr = start.dynamicCast<MessagePart>();
-    Q_ASSERT(ptr);
-    QVector<MessagePart::Ptr> list;
-    if (evaluateSubtree(ptr)) {
-        for (const auto &p: ptr->subParts()) {
-            list << ::collect(p, evaluateSubtree, select);
-        }
-    }
-
-    //Don't consider this part if we already selected a subpart
-    if (list.isEmpty()) {
-        if (select(ptr)) {
-            list << start;
-        }
-    }
-    return list;
-}
-
 QVector<MessagePartPtr> ObjectTreeParser::collectContentParts()
 {
     return collectContentParts(mParsedPart);
@@ -341,38 +374,6 @@ void ObjectTreeParser::parseObjectTree(KMime::Content *node)
 {
     mTopLevelContent = node;
     mParsedPart = parseObjectTreeInternal(node, showOnlyOneMimePart());
-
-    //Gather plaintext and html content
-    if (mParsedPart) {
-        //Find relevant plaintext parts and set plaintext
-        if (auto mp = toplevelTextNode(mParsedPart)) {
-            if (auto _mp = mp.dynamicCast<TextMessagePart>()) {
-                mPlainTextContent += _mp->mNode->decodedText();
-                mPlainTextContentCharset += NodeHelper::charset(_mp->mNode);
-            } else if (auto _mp = mp.dynamicCast<AlternativeMessagePart>()) {
-                if (_mp->mChildNodes.contains(Util::MultipartPlain)) {
-                    mPlainTextContent += \
                _mp->mChildNodes[Util::MultipartPlain]->decodedText();
-                    mPlainTextContentCharset += \
                NodeHelper::charset(_mp->mChildNodes[Util::MultipartPlain]);
-                }
-            }
-        }
-
-        //Find html parts and copy content
-        QVector<MessagePart::Ptr> contentParts = ::collect(mParsedPart,
-            [] (const MessagePartPtr &part) {
-                return true;
-            },
-            [] (const MessagePartPtr &part) {
-                if (dynamic_cast<MimeTreeParser::HtmlMessagePart*>(part.data())) {
-                    return true;
-                }
-                return false;
-            });
-        for (const auto &part : contentParts) {
-            mHtmlContent += part->text();
-            mHtmlContentCharset = part->charset();
-        }
-    }
 }
 
 MessagePartPtr ObjectTreeParser::parsedPart() const
@@ -487,16 +488,6 @@ const QTextCodec *ObjectTreeParser::codecFor(KMime::Content \
*node) const  return mNodeHelper->codec(node);
 }
 
-QByteArray ObjectTreeParser::plainTextContentCharset() const
-{
-    return mPlainTextContentCharset;
-}
-
-QByteArray ObjectTreeParser::htmlContentCharset() const
-{
-    return mHtmlContentCharset;
-}
-
 bool ObjectTreeParser::showOnlyOneMimePart() const
 {
     return mShowOnlyOneMimePart;
diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.h \
b/framework/src/domain/mime/mimetreeparser/objecttreeparser.h index 9a3f5a5..d2076be \
                100644
--- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.h
+++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.h
@@ -250,24 +250,12 @@ public:
     * composer's text editor if this was edited or replied to.
     * This is usually the content of the first text/plain MIME part.
     */
-    QString plainTextContent() const;
+    QString plainTextContent();
 
     /**
     * Similar to plainTextContent(), but returns the HTML source of the first \
                text/html MIME part.
-    *
-    * Not to be consfused with the HTML code that the message viewer widget \
                displays, that HTML
-    * is written out by htmlWriter() and a totally different pair of shoes.
     */
-    QString htmlContent() const;
-
-    /**
-    * The original charset of MIME part the plain text was extracted from.
-    *
-    * If there were more than one text/plain MIME parts in the mail, the this is the \
                charset
-    * of the last MIME part processed.
-    */
-    QByteArray plainTextContentCharset() const;
-    QByteArray htmlContentCharset() const;
+    QString htmlContent();
 
     bool showOnlyOneMimePart() const;
     void setShowOnlyOneMimePart(bool show);
@@ -283,7 +271,11 @@ public:
     QVector<MessagePartPtr> collectContentParts();
     QVector<MessagePartPtr> collectContentParts(MessagePart::Ptr start);
     QVector<MessagePartPtr> collectAttachmentParts();
+
+    /** Decrypt parts and verify signatures */
     void decryptParts();
+
+    /** Import any certificates found in the message */
     void importCertificates();
 
     /** Embedd content referenced by cid by inlining */
diff --git a/framework/src/domain/mime/tests/mailtemplatetest.cpp \
b/framework/src/domain/mime/tests/mailtemplatetest.cpp index 18f315f..4dc8e2b 100644
--- a/framework/src/domain/mime/tests/mailtemplatetest.cpp
+++ b/framework/src/domain/mime/tests/mailtemplatetest.cpp
@@ -36,6 +36,7 @@ static QString normalize(const QString &s)
     auto text = s;
     text.replace(">", "");
     text.replace("\n", "");
+    text.replace("=", "");
     text.replace(" ", "");
     return text;
 }
@@ -87,9 +88,8 @@ private slots:
             result = r;
         });
         QTRY_VERIFY(result);
-        auto content = normalize(removeFirstLine(result->body()));
+        auto content = removeFirstLine(result->body());
         QVERIFY(!content.isEmpty());
-        QEXPECT_FAIL("", "Not implemented yet.", Continue);
         QVERIFY(content.contains("i noticed a new branch"));
     }
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic