summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSandro Knauß <sknauss@kde.org>2016-11-15 15:53:26 +0100
committerSandro Knauß <sknauss@kde.org>2016-11-15 17:33:41 +0100
commitdf9e47668b510e9dc92e4c98d17764ae626809dc (patch)
treea76636d5e3b795860a11dc019695baf9fc6e4afb
parentfa653689133887a566a6855ac99abb755c4f41dd (diff)
downloadkube-df9e47668b510e9dc92e4c98d17764ae626809dc.tar.gz
kube-df9e47668b510e9dc92e4c98d17764ae626809dc.zip
Add mimetreeparsertest for different gpgme errors
-rw-r--r--framework/domain/mimetreeparser/interface.cpp26
-rw-r--r--framework/domain/mimetreeparser/tests/CMakeLists.txt11
-rw-r--r--framework/domain/mimetreeparser/tests/gpgerrortest.cpp202
-rw-r--r--framework/domain/mimetreeparser/tests/kdepim_add_gpg_crypto_test.cmake2
4 files changed, 240 insertions, 1 deletions
diff --git a/framework/domain/mimetreeparser/interface.cpp b/framework/domain/mimetreeparser/interface.cpp
index 6184ae82..15e28349 100644
--- a/framework/domain/mimetreeparser/interface.cpp
+++ b/framework/domain/mimetreeparser/interface.cpp
@@ -308,6 +308,7 @@ public:
308 void createMailMime(const MimeTreeParser::TextMessagePart::Ptr &part); 308 void createMailMime(const MimeTreeParser::TextMessagePart::Ptr &part);
309 void createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr &part); 309 void createMailMime(const MimeTreeParser::AlternativeMessagePart::Ptr &part);
310 void createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr &part); 310 void createMailMime(const MimeTreeParser::HtmlMessagePart::Ptr &part);
311 void createMailMime(const MimeTreeParser::EncryptedMessagePart::Ptr &part);
311 312
312 static Encryption::Ptr createEncryption(const MimeTreeParser::EncryptedMessagePart::Ptr& part); 313 static Encryption::Ptr createEncryption(const MimeTreeParser::EncryptedMessagePart::Ptr& part);
313 void appendEncryption(const MimeTreeParser::EncryptedMessagePart::Ptr &part); 314 void appendEncryption(const MimeTreeParser::EncryptedMessagePart::Ptr &part);
@@ -359,6 +360,12 @@ void PartPrivate::createMailMime(const MimeTreeParser::MimeMessagePart::Ptr& par
359 mMailMime->d->mNode = part->mNode; 360 mMailMime->d->mNode = part->mNode;
360} 361}
361 362
363void PartPrivate::createMailMime(const MimeTreeParser::EncryptedMessagePart::Ptr& part)
364{
365 mMailMime = MailMime::Ptr(new MailMime);
366 mMailMime->d->mNode = part->mNode;
367}
368
362void PartPrivate::appendSubPart(Part::Ptr subpart) 369void PartPrivate::appendSubPart(Part::Ptr subpart)
363{ 370{
364 subpart->d->mParent = q; 371 subpart->d->mParent = q;
@@ -763,6 +770,7 @@ public:
763 void fillFrom(MimeTreeParser::TextMessagePart::Ptr part); 770 void fillFrom(MimeTreeParser::TextMessagePart::Ptr part);
764 void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part); 771 void fillFrom(MimeTreeParser::HtmlMessagePart::Ptr part);
765 void fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part); 772 void fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part);
773 void createEncryptionFailBlock(const MimeTreeParser::EncryptedMessagePart::Ptr &part);
766 SinglePart *q; 774 SinglePart *q;
767 775
768 QVector<Content::Ptr> mContent; 776 QVector<Content::Ptr> mContent;
@@ -781,6 +789,9 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::TextMessagePart::Ptr part)
781 auto sig = mp.dynamicCast<MimeTreeParser::SignedMessagePart>(); 789 auto sig = mp.dynamicCast<MimeTreeParser::SignedMessagePart>();
782 if (enc) { 790 if (enc) {
783 d_ptr->appendEncryption(enc); 791 d_ptr->appendEncryption(enc);
792 if (!enc->isDecryptable()) {
793 d_ptr->mContent = QByteArray();
794 }
784 const auto s = enc->subParts(); 795 const auto s = enc->subParts();
785 if (s.size() == 1) { 796 if (s.size() == 1) {
786 sig = s[0].dynamicCast<MimeTreeParser::SignedMessagePart>(); 797 sig = s[0].dynamicCast<MimeTreeParser::SignedMessagePart>();
@@ -822,6 +833,14 @@ void SinglePartPrivate::fillFrom(MimeTreeParser::AttachmentMessagePart::Ptr part
822 } 833 }
823} 834}
824 835
836void SinglePartPrivate::createEncryptionFailBlock(const MimeTreeParser::EncryptedMessagePart::Ptr &part)
837{
838 mType = "plaintext";
839 mContent.clear();
840 mContent.append(std::make_shared<PlainTextContent>(QByteArray(), q));
841 q->reachParentD()->createMailMime(part);
842}
843
825SinglePart::SinglePart() 844SinglePart::SinglePart()
826 : d(std::unique_ptr<SinglePartPrivate>(new SinglePartPrivate)) 845 : d(std::unique_ptr<SinglePartPrivate>(new SinglePartPrivate))
827{ 846{
@@ -917,6 +936,13 @@ void ParserPrivate::createTree(const MimeTreeParser::MessagePart::Ptr &start, co
917 auto subTree = std::make_shared<Part>(); 936 auto subTree = std::make_shared<Part>();
918 if (enc) { 937 if (enc) {
919 subTree->d->appendEncryption(enc); 938 subTree->d->appendEncryption(enc);
939 if (!enc->isDecryptable()) {
940 auto part = std::make_shared<SinglePart>();
941 part->d->createEncryptionFailBlock(enc);
942 part->reachParentD()->setEncryptions(subTree->d->encryptions());
943 tree->d->appendSubPart(part);
944 return;
945 }
920 } 946 }
921 if (sig) { 947 if (sig) {
922 subTree->d->appendSignature(sig); 948 subTree->d->appendSignature(sig);
diff --git a/framework/domain/mimetreeparser/tests/CMakeLists.txt b/framework/domain/mimetreeparser/tests/CMakeLists.txt
index 7945c5a0..a23f639c 100644
--- a/framework/domain/mimetreeparser/tests/CMakeLists.txt
+++ b/framework/domain/mimetreeparser/tests/CMakeLists.txt
@@ -6,7 +6,18 @@ include_directories(
6 ${CMAKE_CURRENT_SOURCE_DIR}/.. 6 ${CMAKE_CURRENT_SOURCE_DIR}/..
7 ) 7 )
8 8
9include(ECMAddTests)
10
9add_executable(mimetreeparsertest interfacetest.cpp) 11add_executable(mimetreeparsertest interfacetest.cpp)
10add_gpg_crypto_test(mimetreeparsertest mimetreeparsertest) 12add_gpg_crypto_test(mimetreeparsertest mimetreeparsertest)
11qt5_use_modules(mimetreeparsertest Core Test) 13qt5_use_modules(mimetreeparsertest Core Test)
12target_link_libraries(mimetreeparsertest mimetreeparser) 14target_link_libraries(mimetreeparsertest mimetreeparser)
15
16find_package(Gpgmepp 1.7.1 CONFIG)
17find_package(QGpgME 1.7.1 CONFIG)
18
19ecm_add_test(gpgerrortest.cpp
20 TEST_NAME "gpgerrortest"
21 NAME_PREFIX "mimetreeparser-"
22 LINK_LIBRARIES Qt5::Core Qt5::Test mimetreeparser Gpgmepp QGpgme
23)
diff --git a/framework/domain/mimetreeparser/tests/gpgerrortest.cpp b/framework/domain/mimetreeparser/tests/gpgerrortest.cpp
new file mode 100644
index 00000000..aca12280
--- /dev/null
+++ b/framework/domain/mimetreeparser/tests/gpgerrortest.cpp
@@ -0,0 +1,202 @@
1/*
2 Copyright (c) 2016 Sandro Knauß <knauss@kolabsystems.com>
3
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
8
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 02110-1301, USA.
18*/
19
20#include "interface.h"
21#include "interface_p.h"
22
23#include <QGpgME/Protocol>
24#include <gpgme++/context.h>
25#include <gpgme++/engineinfo.h>
26#include <gpgme.h>
27
28#include <QDebug>
29#include <QDir>
30#include <QProcess>
31#include <QTest>
32
33QByteArray readMailFromFile(const QString &mailFile)
34{
35 QFile file(QLatin1String(MAIL_DATA_DIR) + QLatin1Char('/') + mailFile);
36 file.open(QIODevice::ReadOnly);
37 Q_ASSERT(file.isOpen());
38 return file.readAll();
39}
40
41void killAgent(const QString& dir)
42{
43 QProcess proc;
44 proc.setProgram(QStringLiteral("gpg-connect-agent"));
45 QStringList arguments;
46 arguments << "-S " << dir + "/S.gpg-agent";
47 proc.start();
48 proc.waitForStarted();
49 proc.write("KILLAGENT\n");
50 proc.write("BYE\n");
51 proc.closeWriteChannel();
52 proc.waitForFinished();
53}
54
55class GpgErrorTest : public QObject
56{
57 Q_OBJECT
58
59private slots:
60
61 void testGpgConfiguredCorrectly()
62 {
63 setEnv("GNUPGHOME", GNUPGHOME);
64
65 Parser parser(readMailFromFile("openpgp-inline-charset-encrypted.mbox"));
66
67 auto contentPartList = parser.collectContentParts();
68 QCOMPARE(contentPartList.size(), 1);
69 auto contentPart = contentPartList[0];
70 QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext");
71 auto contentList = contentPart->content("plaintext");
72 QVERIFY(contentList[0]->content().startsWith("asdasd"));
73 QCOMPARE(contentList[0]->encryptions().size(), 1);
74 QCOMPARE(contentList[0]->signatures().size(), 1);
75 }
76
77 void testNoGPGInstalled_data()
78 {
79 QTest::addColumn<QString>("mailFileName");
80
81 QTest::newRow("openpgp-inline-charset-encrypted") << "openpgp-inline-charset-encrypted.mbox";
82 QTest::newRow("openpgp-encrypted-attachment-and-non-encrypted-attachment") << "openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox";
83 QTest::newRow("smime-encrypted") << "smime-encrypted.mbox";
84 }
85
86 void testNoGPGInstalled()
87 {
88 QFETCH(QString, mailFileName);
89
90 setEnv("PATH", "/nonexististing");
91 setGpgMEfname("/nonexisting/gpg", "");
92
93 Parser parser(readMailFromFile(mailFileName));
94 auto contentPartList = parser.collectContentParts();
95
96 QCOMPARE(contentPartList.size(), 1);
97 auto contentPart = contentPartList[0];
98 QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext");
99 auto contentList = contentPart->content("plaintext");
100 QCOMPARE(contentList[0]->encryptions().size(), 1);
101 QCOMPARE(contentList[0]->signatures().size(), 0);
102 QVERIFY(contentList[0]->content().isEmpty());
103 }
104
105 void testGpgIncorrectGPGHOME_data()
106 {
107 QTest::addColumn<QString>("mailFileName");
108
109 QTest::newRow("openpgp-inline-charset-encrypted") << "openpgp-inline-charset-encrypted.mbox";
110 QTest::newRow("openpgp-encrypted-attachment-and-non-encrypted-attachment") << "openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox";
111 QTest::newRow("smime-encrypted") << "smime-encrypted.mbox";
112 }
113
114 void testGpgIncorrectGPGHOME()
115 {
116 QFETCH(QString, mailFileName);
117 setEnv("GNUPGHOME", QByteArray(GNUPGHOME) + QByteArray("noexist"));
118
119 Parser parser(readMailFromFile(mailFileName));
120
121 auto contentPartList = parser.collectContentParts();
122 QCOMPARE(contentPartList.size(), 1);
123 auto contentPart = contentPartList[0];
124 QCOMPARE(contentPart->availableContents(), QVector<QByteArray>() << "plaintext");
125 auto contentList = contentPart->content("plaintext");
126 QCOMPARE(contentList[0]->encryptions().size(), 1);
127 QCOMPARE(contentList[0]->signatures().size(), 0);
128 QVERIFY(contentList[0]->content().isEmpty());
129 }
130
131public Q_SLOTS:
132 void init()
133 {
134 mResetGpgmeEngine = false;
135 mModifiedEnv.clear();
136 {
137 QGpgME::openpgp(); // We need to intialize it, otherwise ctx will be a nullpointer
138 const GpgME::Context *ctx = GpgME::Context::createForProtocol(GpgME::Protocol::OpenPGP);
139 const auto engineinfo = ctx->engineInfo();
140 mGpgmeEngine_fname = engineinfo.fileName();
141 }
142 mEnv = QProcessEnvironment::systemEnvironment();
143 unsetEnv("GNUPGHOME");
144 }
145
146 void cleanup()
147 {
148 QCoreApplication::sendPostedEvents();
149
150 const QString &gnupghome = qgetenv("GNUPGHOME");
151 if (!gnupghome.isEmpty()) {
152 killAgent(gnupghome);
153 }
154
155 resetGpgMfname();
156 resetEnv();
157 }
158private:
159 void unsetEnv(const QByteArray &name)
160 {
161 mModifiedEnv << name;
162 unsetenv(name);
163 }
164
165 void setEnv(const QByteArray &name, const QByteArray &value)
166 {
167 mModifiedEnv << name;
168 setenv(name, value , 1);
169 }
170
171 void resetEnv()
172 {
173 foreach(const auto &i, mModifiedEnv) {
174 if (mEnv.contains(i)) {
175 setenv(i, mEnv.value(i).toUtf8(), 1);
176 } else {
177 unsetenv(i);
178 }
179 }
180 }
181
182 void resetGpgMfname()
183 {
184 if (mResetGpgmeEngine) {
185 gpgme_set_engine_info (GPGME_PROTOCOL_OpenPGP, mGpgmeEngine_fname, NULL);
186 }
187 }
188
189 void setGpgMEfname(const QByteArray &fname, const QByteArray &homedir)
190 {
191 mResetGpgmeEngine = true;
192 gpgme_set_engine_info (GPGME_PROTOCOL_OpenPGP, fname, homedir);
193 }
194
195 QSet<QByteArray> mModifiedEnv;
196 QProcessEnvironment mEnv;
197 bool mResetGpgmeEngine;
198 QByteArray mGpgmeEngine_fname;
199};
200
201QTEST_GUILESS_MAIN(GpgErrorTest)
202#include "gpgerrortest.moc"
diff --git a/framework/domain/mimetreeparser/tests/kdepim_add_gpg_crypto_test.cmake b/framework/domain/mimetreeparser/tests/kdepim_add_gpg_crypto_test.cmake
index 17078202..281752a7 100644
--- a/framework/domain/mimetreeparser/tests/kdepim_add_gpg_crypto_test.cmake
+++ b/framework/domain/mimetreeparser/tests/kdepim_add_gpg_crypto_test.cmake
@@ -4,7 +4,7 @@
4# For details see the accompanying COPYING-CMAKE-SCRIPTS file. 4# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
5 5
6set( GNUPGHOME ${CMAKE_BINARY_DIR}/framework/domain/mimetreeparser/tests/gnupg_home ) 6set( GNUPGHOME ${CMAKE_BINARY_DIR}/framework/domain/mimetreeparser/tests/gnupg_home )
7add_definitions( -DGNUPGHOME="\\"${GNUPGHOME}\\"" ) 7add_definitions( -DGNUPGHOME="${GNUPGHOME}" )
8 8
9macro (ADD_GPG_CRYPTO_TEST _target _testname) 9macro (ADD_GPG_CRYPTO_TEST _target _testname)
10 if (UNIX) 10 if (UNIX)