diff options
author | Sandro Knauß <sknauss@kde.org> | 2016-11-15 15:53:26 +0100 |
---|---|---|
committer | Sandro Knauß <sknauss@kde.org> | 2016-11-15 17:33:41 +0100 |
commit | df9e47668b510e9dc92e4c98d17764ae626809dc (patch) | |
tree | a76636d5e3b795860a11dc019695baf9fc6e4afb | |
parent | fa653689133887a566a6855ac99abb755c4f41dd (diff) | |
download | kube-df9e47668b510e9dc92e4c98d17764ae626809dc.tar.gz kube-df9e47668b510e9dc92e4c98d17764ae626809dc.zip |
Add mimetreeparsertest for different gpgme errors
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 | ||
363 | void PartPrivate::createMailMime(const MimeTreeParser::EncryptedMessagePart::Ptr& part) | ||
364 | { | ||
365 | mMailMime = MailMime::Ptr(new MailMime); | ||
366 | mMailMime->d->mNode = part->mNode; | ||
367 | } | ||
368 | |||
362 | void PartPrivate::appendSubPart(Part::Ptr subpart) | 369 | void 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 | ||
836 | void 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 | |||
825 | SinglePart::SinglePart() | 844 | SinglePart::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 | ||
9 | include(ECMAddTests) | ||
10 | |||
9 | add_executable(mimetreeparsertest interfacetest.cpp) | 11 | add_executable(mimetreeparsertest interfacetest.cpp) |
10 | add_gpg_crypto_test(mimetreeparsertest mimetreeparsertest) | 12 | add_gpg_crypto_test(mimetreeparsertest mimetreeparsertest) |
11 | qt5_use_modules(mimetreeparsertest Core Test) | 13 | qt5_use_modules(mimetreeparsertest Core Test) |
12 | target_link_libraries(mimetreeparsertest mimetreeparser) | 14 | target_link_libraries(mimetreeparsertest mimetreeparser) |
15 | |||
16 | find_package(Gpgmepp 1.7.1 CONFIG) | ||
17 | find_package(QGpgME 1.7.1 CONFIG) | ||
18 | |||
19 | ecm_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 | |||
33 | QByteArray 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 | |||
41 | void 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 | |||
55 | class GpgErrorTest : public QObject | ||
56 | { | ||
57 | Q_OBJECT | ||
58 | |||
59 | private 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 | |||
131 | public 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 | } | ||
158 | private: | ||
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 | |||
201 | QTEST_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 | ||
6 | set( GNUPGHOME ${CMAKE_BINARY_DIR}/framework/domain/mimetreeparser/tests/gnupg_home ) | 6 | set( GNUPGHOME ${CMAKE_BINARY_DIR}/framework/domain/mimetreeparser/tests/gnupg_home ) |
7 | add_definitions( -DGNUPGHOME="\\"${GNUPGHOME}\\"" ) | 7 | add_definitions( -DGNUPGHOME="${GNUPGHOME}" ) |
8 | 8 | ||
9 | macro (ADD_GPG_CRYPTO_TEST _target _testname) | 9 | macro (ADD_GPG_CRYPTO_TEST _target _testname) |
10 | if (UNIX) | 10 | if (UNIX) |