From 9c245554b7cb7fa35c81d14d7ce8992ebb29ffaf Mon Sep 17 00:00:00 2001
From: drebs <drebs@leap.se>
Date: Thu, 24 Oct 2013 16:25:51 -0200
Subject: Fix tests according to rfc 3156.

Also fix test suite loading.
---
 mail/setup.py                                   |  2 +-
 mail/src/leap/mail/__init__.py                  |  9 +---
 mail/src/leap/mail/load_tests.py                | 32 ++++++++++++++
 mail/src/leap/mail/smtp/tests/test_smtprelay.py | 59 +++++++++++++++++++------
 4 files changed, 79 insertions(+), 23 deletions(-)
 create mode 100644 mail/src/leap/mail/load_tests.py

(limited to 'mail')

diff --git a/mail/setup.py b/mail/setup.py
index f423f7b..57a4164 100644
--- a/mail/setup.py
+++ b/mail/setup.py
@@ -64,7 +64,7 @@ setup(
     namespace_packages=["leap"],
     package_dir={'': 'src'},
     packages=find_packages('src'),
-    test_suite='leap.mail.load_tests',
+    test_suite='leap.mail.load_tests.load_tests',
     install_requires=utils.parse_requirements(),
     tests_require=utils.parse_requirements(
         reqfiles=['pkg/requirements-testing.pip']),
diff --git a/mail/src/leap/mail/__init__.py b/mail/src/leap/mail/__init__.py
index 5b5ba9b..4b25fe6 100644
--- a/mail/src/leap/mail/__init__.py
+++ b/mail/src/leap/mail/__init__.py
@@ -17,17 +17,10 @@
 
 
 """
-Provide function for loading tests.
+Client mail bits.
 """
 
 
-# Do not force the unittest dependency
-# import unittest
-
-
-# def load_tests():
-#     return unittest.defaultTestLoader.discover('./src/leap/mail')
-
 from ._version import get_versions
 __version__ = get_versions()['version']
 del get_versions
diff --git a/mail/src/leap/mail/load_tests.py b/mail/src/leap/mail/load_tests.py
new file mode 100644
index 0000000..ee89fcc
--- /dev/null
+++ b/mail/src/leap/mail/load_tests.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# tests.py
+# Copyright (C) 2013 LEAP
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+Provide a function for loading tests.
+"""
+
+import unittest
+
+
+def load_tests():
+    suite = unittest.TestSuite()
+    for test in unittest.defaultTestLoader.discover(
+            './src/leap/mail/',
+            top_level_dir='./src/'):
+        suite.addTest(test)
+    return suite
diff --git a/mail/src/leap/mail/smtp/tests/test_smtprelay.py b/mail/src/leap/mail/smtp/tests/test_smtprelay.py
index a529c93..7fefe77 100644
--- a/mail/src/leap/mail/smtp/tests/test_smtprelay.py
+++ b/mail/src/leap/mail/smtp/tests/test_smtprelay.py
@@ -23,8 +23,8 @@ SMTP relay tests.
 
 import re
 
-
 from datetime import datetime
+from gnupg._util import _make_binary_stream
 from twisted.test import proto_helpers
 from twisted.mail.smtp import (
     User,
@@ -33,7 +33,6 @@ from twisted.mail.smtp import (
 )
 from mock import Mock
 
-
 from leap.mail.smtp.smtprelay import (
     SMTPFactory,
     EncryptedMessage,
@@ -45,7 +44,6 @@ from leap.mail.smtp.tests import (
 )
 from leap.keymanager import openpgp
 
-
 # some regexps
 IP_REGEX = "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}" + \
     "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
@@ -127,11 +125,22 @@ class TestSmtpRelay(TestCaseWithKeyManager):
         for line in self.EMAIL_DATA[4:12]:
             m.lineReceived(line)
         m.eomReceived()
+        # assert structure of encrypted message
+        self.assertTrue('Content-Type' in m._msg)
+        self.assertEqual('multipart/encrypted', m._msg.get_content_type())
+        self.assertEqual('application/pgp-encrypted',
+                         m._msg.get_param('protocol'))
+        self.assertEqual(2, len(m._msg.get_payload()))
+        self.assertEqual('application/pgp-encrypted',
+                         m._msg.get_payload(0).get_content_type())
+        self.assertEqual('application/octet-stream',
+                         m._msg.get_payload(1).get_content_type())
         privkey = self._km.get_key(
             ADDRESS, openpgp.OpenPGPKey, private=True)
-        decrypted = self._km.decrypt(m._message.get_payload(), privkey)
+        decrypted = self._km.decrypt(
+            m._msg.get_payload(1).get_payload(), privkey)
         self.assertEqual(
-            '\r\n'.join(self.EMAIL_DATA[9:12]) + '\r\n',
+            '\n' + '\r\n'.join(self.EMAIL_DATA[9:12]) + '\r\n',
             decrypted,
             'Decrypted text differs from plaintext.')
 
@@ -149,14 +158,24 @@ class TestSmtpRelay(TestCaseWithKeyManager):
             m.lineReceived(line)
         # trigger encryption and signing
         m.eomReceived()
+        # assert structure of encrypted message
+        self.assertTrue('Content-Type' in m._msg)
+        self.assertEqual('multipart/encrypted', m._msg.get_content_type())
+        self.assertEqual('application/pgp-encrypted',
+                         m._msg.get_param('protocol'))
+        self.assertEqual(2, len(m._msg.get_payload()))
+        self.assertEqual('application/pgp-encrypted',
+                         m._msg.get_payload(0).get_content_type())
+        self.assertEqual('application/octet-stream',
+                         m._msg.get_payload(1).get_content_type())
         # decrypt and verify
         privkey = self._km.get_key(
             ADDRESS, openpgp.OpenPGPKey, private=True)
         pubkey = self._km.get_key(ADDRESS_2, openpgp.OpenPGPKey)
         decrypted = self._km.decrypt(
-            m._message.get_payload(), privkey, verify=pubkey)
+            m._msg.get_payload(1).get_payload(), privkey, verify=pubkey)
         self.assertEqual(
-            '\r\n'.join(self.EMAIL_DATA[9:12]) + '\r\n',
+            '\n' + '\r\n'.join(self.EMAIL_DATA[9:12]) + '\r\n',
             decrypted,
             'Decrypted text differs from plaintext.')
 
@@ -175,22 +194,34 @@ class TestSmtpRelay(TestCaseWithKeyManager):
             m.lineReceived(line)
         # trigger signing
         m.eomReceived()
+        # assert structure of signed message
+        self.assertTrue('Content-Type' in m._msg)
+        self.assertEqual('multipart/signed', m._msg.get_content_type())
+        self.assertEqual('application/pgp-signature',
+                         m._msg.get_param('protocol'))
+        self.assertEqual('pgp-sha512', m._msg.get_param('micalg'))
         # assert content of message
+        self.assertEqual(
+            m._msg.get_payload(0).get_payload(decode=True),
+            '\r\n'.join(self.EMAIL_DATA[9:13]))
+        # assert content of signature
         self.assertTrue(
-            m._message.get_payload().startswith(
-                '-----BEGIN PGP SIGNED MESSAGE-----\n' +
-                'Hash: SHA1\n\n' + 
-                ('\r\n'.join(self.EMAIL_DATA[9:12]) + '\r\n' +
-                '-----BEGIN PGP SIGNATURE-----\n')),
+            m._msg.get_payload(1).get_payload().startswith(
+                '-----BEGIN PGP SIGNATURE-----\n'),
             'Message does not start with signature header.')
         self.assertTrue(
-            m._message.get_payload().endswith(
+            m._msg.get_payload(1).get_payload().endswith(
                 '-----END PGP SIGNATURE-----\n'),
             'Message does not end with signature footer.')
         # assert signature is valid
         pubkey = self._km.get_key(ADDRESS_2, openpgp.OpenPGPKey)
+        # replace EOL before verifying (according to rfc3156)
+        signed_text = re.sub('\r?\n', '\r\n',
+                             m._msg.get_payload(0).as_string())
         self.assertTrue(
-            self._km.verify(m._message.get_payload(), pubkey),
+            self._km.verify(signed_text,
+                            pubkey,
+                            detached_sig=m._msg.get_payload(1).get_payload()),
             'Signature could not be verified.')
 
     def test_missing_key_rejects_address(self):
-- 
cgit v1.2.3