diff options
Diffstat (limited to 'mail/src')
| -rw-r--r-- | mail/src/leap/mail/_version.py | 35 | ||||
| -rwxr-xr-x | mail/src/leap/mail/imap/tests/imapclient.py | 7 | ||||
| -rw-r--r-- | mail/src/leap/mail/imap/tests/test_imap.py | 45 | ||||
| -rw-r--r-- | mail/src/leap/mail/smtp/__init__.py | 6 | ||||
| -rw-r--r-- | mail/src/leap/mail/smtp/rfc3156.py | 2 | ||||
| -rw-r--r-- | mail/src/leap/mail/smtp/tests/test_gateway.py | 45 | 
6 files changed, 87 insertions, 53 deletions
| diff --git a/mail/src/leap/mail/_version.py b/mail/src/leap/mail/_version.py index 8a66c1f..d80ec47 100644 --- a/mail/src/leap/mail/_version.py +++ b/mail/src/leap/mail/_version.py @@ -17,6 +17,7 @@ git_full = "$Format:%H$"  import subprocess  import sys +  def run_command(args, cwd=None, verbose=False):      try:          # remember shell=False, so use git.cmd on windows, not just git @@ -41,6 +42,7 @@ import sys  import re  import os.path +  def get_expanded_variables(versionfile_source):      # the code embedded in _version.py can just fetch the value of these      # variables. When used from setup.py, we don't want to import @@ -48,7 +50,7 @@ def get_expanded_variables(versionfile_source):      # used from _version.py.      variables = {}      try: -        f = open(versionfile_source,"r") +        f = open(versionfile_source, "r")          for line in f.readlines():              if line.strip().startswith("git_refnames ="):                  mo = re.search(r'=\s*"(.*)"', line) @@ -63,12 +65,13 @@ def get_expanded_variables(versionfile_source):          pass      return variables +  def versions_from_expanded_variables(variables, tag_prefix, verbose=False):      refnames = variables["refnames"].strip()      if refnames.startswith("$Format"):          if verbose:              print("variables are unexpanded, not using") -        return {} # unexpanded, so not in an unpacked git-archive tarball +        return {}  # unexpanded, so not in an unpacked git-archive tarball      refs = set([r.strip() for r in refnames.strip("()").split(",")])      # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of      # just "foo-1.0". If we see a "tag: " prefix, prefer those. @@ -84,7 +87,7 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):          # "stabilization", as well as "HEAD" and "master".          tags = set([r for r in refs if re.search(r'\d', r)])          if verbose: -            print("discarding '%s', no digits" % ",".join(refs-tags)) +            print("discarding '%s', no digits" % ",".join(refs - tags))      if verbose:          print("likely tags: %s" % ",".join(sorted(tags)))      for ref in sorted(tags): @@ -93,13 +96,14 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):              r = ref[len(tag_prefix):]              if verbose:                  print("picking %s" % r) -            return { "version": r, -                     "full": variables["full"].strip() } +            return {"version": r, +                    "full": variables["full"].strip()}      # no suitable tags, so we use the full revision id      if verbose:          print("no suitable tags, using full revision id") -    return { "version": variables["full"].strip(), -             "full": variables["full"].strip() } +    return {"version": variables["full"].strip(), +            "full": variables["full"].strip()} +  def versions_from_vcs(tag_prefix, versionfile_source, verbose=False):      # this runs 'git' from the root of the source tree. That either means @@ -116,7 +120,7 @@ def versions_from_vcs(tag_prefix, versionfile_source, verbose=False):          here = os.path.abspath(__file__)      except NameError:          # some py2exe/bbfreeze/non-CPython implementations don't do __file__ -        return {} # not always correct +        return {}  # not always correct      # versionfile_source is the relative path from the top of the source tree      # (where the .git directory might live) to this file. Invert this to find @@ -141,7 +145,8 @@ def versions_from_vcs(tag_prefix, versionfile_source, verbose=False):          return {}      if not stdout.startswith(tag_prefix):          if verbose: -            print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) +            print("tag '%s' doesn't start with prefix '%s'" % +                  (stdout, tag_prefix))          return {}      tag = stdout[len(tag_prefix):]      stdout = run_command([GIT, "rev-parse", "HEAD"], cwd=root) @@ -153,7 +158,8 @@ def versions_from_vcs(tag_prefix, versionfile_source, verbose=False):      return {"version": tag, "full": full} -def versions_from_parentdir(parentdir_prefix, versionfile_source, verbose=False): +def versions_from_parentdir(parentdir_prefix, versionfile_source, +                            verbose=False):      if IN_LONG_VERSION_PY:          # We're running from _version.py. If it's from a source tree          # (execute-in-place), we can work upwards to find the root of the @@ -163,7 +169,7 @@ def versions_from_parentdir(parentdir_prefix, versionfile_source, verbose=False)              here = os.path.abspath(__file__)          except NameError:              # py2exe/bbfreeze/non-CPython don't have __file__ -            return {} # without __file__, we have no hope +            return {}  # without __file__, we have no hope          # versionfile_source is the relative path from the top of the source          # tree to _version.py. Invert this to find the root from __file__.          root = here @@ -180,7 +186,8 @@ def versions_from_parentdir(parentdir_prefix, versionfile_source, verbose=False)      dirname = os.path.basename(root)      if not dirname.startswith(parentdir_prefix):          if verbose: -            print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % +            print("guessing rootdir is '%s', but '%s' doesn't " +                  "start with prefix '%s'" %                    (root, dirname, parentdir_prefix))          return None      return {"version": dirname[len(parentdir_prefix):], "full": ""} @@ -189,8 +196,9 @@ tag_prefix = ""  parentdir_prefix = "leap-mail"  versionfile_source = "src/leap/mail/_version.py" +  def get_versions(default={"version": "unknown", "full": ""}, verbose=False): -    variables = { "refnames": git_refnames, "full": git_full } +    variables = {"refnames": git_refnames, "full": git_full}      ver = versions_from_expanded_variables(variables, tag_prefix, verbose)      if not ver:          ver = versions_from_vcs(tag_prefix, versionfile_source, verbose) @@ -200,4 +208,3 @@ def get_versions(default={"version": "unknown", "full": ""}, verbose=False):      if not ver:          ver = default      return ver - diff --git a/mail/src/leap/mail/imap/tests/imapclient.py b/mail/src/leap/mail/imap/tests/imapclient.py index 027396c..c353cee 100755 --- a/mail/src/leap/mail/imap/tests/imapclient.py +++ b/mail/src/leap/mail/imap/tests/imapclient.py @@ -21,7 +21,7 @@ from twisted.python import log  class TrivialPrompter(basic.LineReceiver): -    #from os import linesep as delimiter +    # from os import linesep as delimiter      promptDeferred = None @@ -42,6 +42,7 @@ class TrivialPrompter(basic.LineReceiver):  class SimpleIMAP4Client(imap4.IMAP4Client): +      """      Add callbacks when the client receives greeting messages from      an IMAP server. @@ -98,8 +99,8 @@ def cbServerGreeting(proto, username, password):      # Try to authenticate securely      return proto.authenticate(          password).addCallback( -            cbAuthentication, proto).addErrback( -                ebAuthentication, proto, username, password) +        cbAuthentication, proto).addErrback( +        ebAuthentication, proto, username, password)  def ebConnection(reason): diff --git a/mail/src/leap/mail/imap/tests/test_imap.py b/mail/src/leap/mail/imap/tests/test_imap.py index ca73a11..7d26862 100644 --- a/mail/src/leap/mail/imap/tests/test_imap.py +++ b/mail/src/leap/mail/imap/tests/test_imap.py @@ -54,7 +54,7 @@ import twisted.cred.credentials  import twisted.cred.portal -#import u1db +# import u1db  from leap.common.testing.basetest import BaseLeapTest  from leap.mail.imap.server import SoledadMailbox @@ -120,17 +120,19 @@ def initialize_soledad(email, gnupg_home, tempdir):      return _soledad -########################################## +#  # Simple LEAP IMAP4 Server for testing -########################################## +#  class SimpleLEAPServer(imap4.IMAP4Server): +      """      A Simple IMAP4 Server with mailboxes backed by Soledad.      This should be pretty close to the real LeapIMAP4Server that we      will be instantiating as a service, minus the authentication bits.      """ +      def __init__(self, *args, **kw):          soledad = kw.pop('soledad', None) @@ -153,7 +155,7 @@ class SimpleLEAPServer(imap4.IMAP4Server):      def lineReceived(self, line):          if self.timeoutTest: -            #Do not send a respones +            # Do not send a respones              return          imap4.IMAP4Server.lineReceived(self, line) @@ -168,6 +170,7 @@ class SimpleLEAPServer(imap4.IMAP4Server):  class TestRealm: +      """      A minimal auth realm for testing purposes only      """ @@ -177,12 +180,13 @@ class TestRealm:          return imap4.IAccount, self.theAccount, lambda: None -###################################### +#  # Simple IMAP4 Client for testing -###################################### +#  class SimpleClient(imap4.IMAP4Client): +      """      A Simple IMAP4 Client to test our      Soledad-LEAPServer @@ -210,6 +214,7 @@ class SimpleClient(imap4.IMAP4Client):  class IMAP4HelperMixin(BaseLeapTest): +      """      MixIn containing several utilities to be shared across      different TestCases @@ -245,13 +250,13 @@ class IMAP4HelperMixin(BaseLeapTest):          # Soledad: config info          cls.gnupg_home = "%s/gnupg" % cls.tempdir          cls.email = 'leap@leap.se' -        #cls.db1_file = "%s/db1.u1db" % cls.tempdir -        #cls.db2_file = "%s/db2.u1db" % cls.tempdir +        # cls.db1_file = "%s/db1.u1db" % cls.tempdir +        # cls.db2_file = "%s/db2.u1db" % cls.tempdir          # open test dbs -        #cls._db1 = u1db.open(cls.db1_file, create=True, -                              #document_factory=SoledadDocument) -        #cls._db2 = u1db.open(cls.db2_file, create=True, -                              #document_factory=SoledadDocument) +        # cls._db1 = u1db.open(cls.db1_file, create=True, +                              # document_factory=SoledadDocument) +        # cls._db2 = u1db.open(cls.db2_file, create=True, +                              # document_factory=SoledadDocument)          # initialize soledad by hand so we can control keys          cls._soledad = initialize_soledad( @@ -261,7 +266,7 @@ class IMAP4HelperMixin(BaseLeapTest):          # now we're passing the mailbox name, so we          # should get this into a partial or something. -        #cls.sm = SoledadMailbox("mailbox", soledad=cls._soledad) +        # cls.sm = SoledadMailbox("mailbox", soledad=cls._soledad)          # XXX REFACTOR --- self.server (in setUp) is initializing          # a SoledadBackedAccount @@ -273,8 +278,8 @@ class IMAP4HelperMixin(BaseLeapTest):          Restores the old path and home environment variables.          Removes the temporal dir created for tests.          """ -        #cls._db1.close() -        #cls._db2.close() +        # cls._db1.close() +        # cls._db2.close()          cls._soledad.close()          os.environ["PATH"] = cls.old_path @@ -328,8 +333,8 @@ class IMAP4HelperMixin(BaseLeapTest):              acct.delete(mb)          # FIXME add again -        #for subs in acct.subscriptions: -            #acct.unsubscribe(subs) +        # for subs in acct.subscriptions: +            # acct.unsubscribe(subs)          del self.server          del self.client @@ -375,9 +380,11 @@ class IMAP4HelperMixin(BaseLeapTest):  #  class MessageCollectionTestCase(IMAP4HelperMixin, unittest.TestCase): +      """      Tests for the MessageCollection class      """ +      def setUp(self):          """          setUp method for each test @@ -434,6 +441,7 @@ class MessageCollectionTestCase(IMAP4HelperMixin, unittest.TestCase):  class LeapIMAP4ServerTestCase(IMAP4HelperMixin, unittest.TestCase): +      """      Tests for the generic behavior of the LeapIMAP4Server      which, right now, it's just implemented in this test file as @@ -1149,7 +1157,7 @@ class LeapIMAP4ServerTestCase(IMAP4HelperMixin, unittest.TestCase):          mb = SimpleLEAPServer.theAccount.getMailbox('PARTIAL/SUBTHING')          self.assertEqual(1, len(mb.messages))          self.assertEqual( -            ['\\SEEN',], +            ['\\SEEN', ],              mb.messages[1].content['flags']          )          self.assertEqual( @@ -1262,6 +1270,7 @@ class LeapIMAP4ServerTestCase(IMAP4HelperMixin, unittest.TestCase):  class IMAP4ServerSearchTestCase(IMAP4HelperMixin, unittest.TestCase): +      """      Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.      """ diff --git a/mail/src/leap/mail/smtp/__init__.py b/mail/src/leap/mail/smtp/__init__.py index d3eb9e8..bbd4064 100644 --- a/mail/src/leap/mail/smtp/__init__.py +++ b/mail/src/leap/mail/smtp/__init__.py @@ -30,7 +30,7 @@ from leap.mail.smtp.gateway import SMTPFactory  def setup_smtp_gateway(port, userid, keymanager, smtp_host, smtp_port, -                     smtp_cert, smtp_key, encrypted_only): +                       smtp_cert, smtp_key, encrypted_only):      """      Setup SMTP gateway to run with Twisted. @@ -52,8 +52,8 @@ def setup_smtp_gateway(port, userid, keymanager, smtp_host, smtp_port,      :type smtp_cert: str      :param smtp_key: The client key for authentication.      :type smtp_key: str -    :param encrypted_only: Whether the SMTP gateway should send unencrypted mail -                           or not. +    :param encrypted_only: Whether the SMTP gateway should send unencrypted +                           mail or not.      :type encrypted_only: bool      :returns: tuple of SMTPFactory, twisted.internet.tcp.Port diff --git a/mail/src/leap/mail/smtp/rfc3156.py b/mail/src/leap/mail/smtp/rfc3156.py index dd48475..b0288b4 100644 --- a/mail/src/leap/mail/smtp/rfc3156.py +++ b/mail/src/leap/mail/smtp/rfc3156.py @@ -361,7 +361,7 @@ class PGPSignature(MIMEApplication):      """      def __init__(self, _data, name='signature.asc'):          MIMEApplication.__init__(self, _data, 'pgp-signature', -            _encoder=lambda x: x, name=name) +                                 encoder=lambda x: x, name=name)          self.add_header('Content-Description', 'OpenPGP Digital Signature') diff --git a/mail/src/leap/mail/smtp/tests/test_gateway.py b/mail/src/leap/mail/smtp/tests/test_gateway.py index 4c2f04f..5b15b5b 100644 --- a/mail/src/leap/mail/smtp/tests/test_gateway.py +++ b/mail/src/leap/mail/smtp/tests/test_gateway.py @@ -101,10 +101,16 @@ class TestSmtpGateway(TestCaseWithKeyManager):                          '250 Sender address accepted',                          '250 Recipient address accepted',                          '354 Continue'] -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], + +        # XXX this bit can be refactored away in a helper +        # method... +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              self._config['encrypted_only']).buildProtocol(('127.0.0.1', 0)) +        # snip...          transport = proto_helpers.StringTransport()          proto.makeConnection(transport)          for i, line in enumerate(self.EMAIL_DATA): @@ -118,8 +124,10 @@ class TestSmtpGateway(TestCaseWithKeyManager):          """          Test if message gets encrypted to destination email.          """ -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              self._config['encrypted_only']).buildProtocol(('127.0.0.1', 0))          fromAddr = Address(ADDRESS_2) @@ -158,8 +166,10 @@ class TestSmtpGateway(TestCaseWithKeyManager):          Test if message gets encrypted to destination email and signed with          sender key.          """ -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              self._config['encrypted_only']).buildProtocol(('127.0.0.1', 0))          user = User(ADDRESS, 'gateway.leap.se', proto, ADDRESS) @@ -202,11 +212,14 @@ class TestSmtpGateway(TestCaseWithKeyManager):          """          # mock the key fetching          self._km.fetch_keys_from_server = Mock(return_value=[]) -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              self._config['encrypted_only']).buildProtocol(('127.0.0.1', 0)) -        user = User('ihavenopubkey@nonleap.se', 'gateway.leap.se', proto, ADDRESS) +        user = User('ihavenopubkey@nonleap.se', +                    'gateway.leap.se', proto, ADDRESS)          fromAddr = Address(ADDRESS_2)          m = EncryptedMessage(              fromAddr, user, self._km, self._config['host'], @@ -226,7 +239,7 @@ class TestSmtpGateway(TestCaseWithKeyManager):          self.assertEqual('pgp-sha512', m._msg.get_param('micalg'))          # assert content of message          self.assertEqual( -            '\r\n'.join(self.EMAIL_DATA[9:13])+'\r\n--\r\n' + +            '\r\n'.join(self.EMAIL_DATA[9:13]) + '\r\n--\r\n' +              'I prefer encrypted email - https://leap.se/key/anotheruser.\r\n',              m._msg.get_payload(0).get_payload(decode=True))          # assert content of signature @@ -262,8 +275,10 @@ class TestSmtpGateway(TestCaseWithKeyManager):          # mock the key fetching          self._km.fetch_keys_from_server = Mock(return_value=[])          # prepare the SMTP factory -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              self._config['encrypted_only']).buildProtocol(('127.0.0.1', 0))          transport = proto_helpers.StringTransport() @@ -291,8 +306,10 @@ class TestSmtpGateway(TestCaseWithKeyManager):          # mock the key fetching          self._km.fetch_keys_from_server = Mock(return_value=[])          # prepare the SMTP factory with encrypted only equal to false -        proto = SMTPFactory(u'anotheruser@leap.se', -            self._km, self._config['host'], self._config['port'], +        proto = SMTPFactory( +            u'anotheruser@leap.se', +            self._km, self._config['host'], +            self._config['port'],              self._config['cert'], self._config['key'],              False).buildProtocol(('127.0.0.1', 0))          transport = proto_helpers.StringTransport() | 
