├── test ├── __init__.py ├── test_multi_mixed_msdoc.py ├── test_single_plain_03.py ├── test_single_html_03.py ├── test_single_plain_06.py ├── test_single_plain_01.py ├── test_single_plain_02.py ├── test_single_html_01.py ├── test_multi_mixed_html_application_octet-stream_01.py ├── test_single_plain_05.py ├── test_single_html_02_sanitized_urls.py ├── test_multi_alternative_plain_html_02.py ├── test_single_html_05.py ├── test_single_html_02.py ├── test_multi_alternative_plain_html_01.py ├── test_multi_mixed_alternative_plain_html_01.py ├── test_single_html_04.py ├── test_multi_alternative_plain_text_01.py ├── test_multi_mixed_plain_rfc822_plain_01.py ├── test_multi_mixed_plain_rfc822_plain_02.py ├── test_multi_mixed_plain_application_x_zip_compressed_01.py ├── test_multi_alternative_plain_html_03.py ├── test_multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_01.py ├── test_multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_base64_01.py ├── test_single_plain_04.py └── test_multi_multi.py ├── .gitattributes ├── dev_requirements.txt ├── csirtg_mail ├── constants.py ├── __init__.py ├── btc.py ├── utils.py ├── client.py ├── urls.py ├── parse.py └── _version.py ├── samples └── email │ ├── single_html_04.eml │ ├── multi_alternative_plain_html_02.eml │ ├── single_plain_02.eml │ ├── multi_mixed_alternative_plain_html_01.eml │ ├── single_plain_05.eml │ ├── single_html_03.eml │ ├── single_plain_01.eml │ ├── single_html_05.eml │ ├── multi_mixed_plain_rfc822_plain_01.eml │ ├── single_plain_03.eml │ ├── single_plain_04.eml │ ├── multi_mixed_plain_application_x_zip_compressed_01.eml │ ├── multi_mixed_plain_rfc822_plain_02.eml │ ├── multi_alternative_plain_text_01.eml │ ├── multi_alternative_plain_html_01.eml │ ├── single_plain_06.eml │ ├── multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_01.eml │ ├── multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_base64_01.eml │ ├── multi_alternative_plain_html_03.eml │ ├── single_html_01.eml │ ├── single_html_02.eml │ └── Test_multipart.eml ├── requirements.txt ├── MANIFEST.in ├── setup.cfg ├── .coveragerc ├── .travis.yml ├── Vagrantfile ├── .gitignore ├── setup.py ├── LICENSE └── README.md /test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | csirtg_mail/_version.py export-subst 2 | -------------------------------------------------------------------------------- /dev_requirements.txt: -------------------------------------------------------------------------------- 1 | coverage>=4.2 2 | pytest-cov>=2.6 3 | pytest>=4.2 4 | -r requirements.txt 5 | -------------------------------------------------------------------------------- /csirtg_mail/constants.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | PYVERSION = 2 4 | if sys.version_info > (3,): 5 | PYVERSION = 3 6 | -------------------------------------------------------------------------------- /samples/email/single_html_04.eml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/csirtgadgets/csirtg-mail-py/HEAD/samples/email/single_html_04.eml -------------------------------------------------------------------------------- /csirtg_mail/__init__.py: -------------------------------------------------------------------------------- 1 | from .parse import * 2 | from ._version import get_versions 3 | __version__ = get_versions()['version'] 4 | del get_versions 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pyzmail>=1.0.3,<2.0 ; python_version <= '3.5' 2 | pyzmail36>=1.0.3,<2.0 ; python_version >= '3.6' 3 | beautifulsoup4>=4.4.0 4 | chardet>=2.3.0 5 | lxml>=3.5.0 6 | html5lib>=1.0 -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include versioneer.py 2 | include csirtg_mail/_version.py 3 | include requirements.txt 4 | include dev_requirements.txt 5 | include LICENSE README.md 6 | recursive-include samples * 7 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [tool:pytest] 2 | norecursedirs = build 3 | 4 | [versioneer] 5 | VCS = git 6 | style = pep440 7 | versionfile_source = csirtg_mail/_version.py 8 | versionfile_build = csirtg_mail/_version.py 9 | tag_prefix = 10 | parentdir_prefix = csirtg-mail- 11 | -------------------------------------------------------------------------------- /test/test_multi_mixed_msdoc.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | from pprint import pprint 3 | 4 | TEST_FILE = 'samples/email/multi_mixed_msdoc.eml' 5 | 6 | with open(TEST_FILE, encoding='utf8') as f: 7 | email = f.read() 8 | 9 | 10 | def test_mytest(): 11 | results = csirtg_mail.from_string(email) 12 | assert results['attachments'][0]['type'] == 'application/msword' 13 | 14 | 15 | if __name__ == "__main__": 16 | test_mytest() 17 | -------------------------------------------------------------------------------- /test/test_single_plain_03.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_plain_03.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_body_email_addresses(): 16 | assert "yyounisammaarah2015@gmail.com" in results[0]['body_email_addresses'] 17 | -------------------------------------------------------------------------------- /test/test_single_html_03.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_html_03.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_body_email_addresses(): 16 | assert "dhlcourier.c1950@outlook.com" in results[0]['body_email_addresses'] 17 | -------------------------------------------------------------------------------- /test/test_single_plain_06.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_plain_06.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email, defanged_urls=True) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_extract_btcs(): 16 | print(results[0]['btcs']) 17 | assert "1KhDTLk95fZQBd5tUXj4123459bBAji2DB" in results[0]['btcs'] 18 | -------------------------------------------------------------------------------- /test/test_single_plain_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_plain_01.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith('Hello') 17 | 18 | 19 | def test_extract_urls(): 20 | assert "http://www.socialservices.cn/detail.php?id=9" in results[0]['urls'] 21 | -------------------------------------------------------------------------------- /test/test_single_plain_02.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_plain_02.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | 'http://www.indiana.edu') 18 | 19 | 20 | def test_extract_urls(): 21 | assert "http://www.indiana.edu" in results[0]['urls'] 22 | -------------------------------------------------------------------------------- /test/test_single_html_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_html_01.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == 'MAILER-DAEMON@ironport.csirtgadgets.org' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | '') 18 | assert results[0]['mail_parts'][1]['filename'].startswith( 19 | 'PP-015-725-201-298.html') 20 | -------------------------------------------------------------------------------- /test/test_single_plain_05.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_plain_05.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email, defanged_urls=True) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | 14 | 15 | def test_extract_urls(): 16 | print(results[0]['urls']) 17 | assert "hxxp://www.blah.blah.com.badness.com/wp=stuff/uno/dos/tres/" in results[0]['urls'] 18 | assert "hxxp[:]//blah[.]com/Login.php" in results[0]['urls'] 19 | assert "hxxps://www.blah.blah.com.badness.com/badness.php" in results[0]['urls'] 20 | -------------------------------------------------------------------------------- /test/test_single_html_02_sanitized_urls.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_html_02.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email, sanitize_urls=True) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == 'Appidms@tripadvisor.com' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | '\n
') 18 | 19 | 20 | def test_extract_urls(): 21 | assert "http://www.homerunsports.com/sites/all/themes/zen/zen-internals/css/direct/index.php" in results[0]['urls'] 22 | -------------------------------------------------------------------------------- /test/test_multi_alternative_plain_html_02.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/multi_alternative_plain_html_02.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['delivered-to'][0] == 'john@csirtgadgets.org' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | 'http://www.indiana.edu') 18 | assert results[0]['mail_parts'][1]['decoded_body'].startswith( 19 | '
2: 7 | with open(TEST_FILE, encoding='latin-1') as f: 8 | email = f.read() 9 | email = str(email) 10 | else: 11 | with open(TEST_FILE, encoding='utf8') as f: 12 | email = f.read() 13 | 14 | results = csirtg_mail.parse_email_from_string(email) 15 | 16 | 17 | def test_message_headers(): 18 | assert results[0]['headers']['return-path'][0] == '' 19 | 20 | 21 | def test_body_email_addresses(): 22 | assert "user1@example.com" in results[0]['body_email_addresses'] 23 | assert "user2@example.com" in results[0]['body_email_addresses'] 24 | -------------------------------------------------------------------------------- /test/test_single_html_02.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/single_html_02.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == 'Appidms@tripadvisor.com' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | '\n
') 18 | 19 | 20 | def test_extract_urls(): 21 | assert "http://www.homerunsports.com/sites/all/themes/zen/zen-internals/css/direct/index.php?cmd=_login-processing&login_cmd=_login-done&login_access=852105208512140" in results[ 22 | 0]['urls'] 23 | -------------------------------------------------------------------------------- /test/test_multi_alternative_plain_html_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | from pprint import pprint 3 | 4 | TEST_FILE = 'samples/email/multi_alternative_plain_html_01.eml' 5 | 6 | with open(TEST_FILE, encoding='utf8') as f: 7 | email = f.read() 8 | 9 | results = csirtg_mail.parse_email_from_string(email) 10 | 11 | 12 | def test_message_headers(): 13 | assert results[0]['headers']['return-path'][0] == 'career@walmart.com' 14 | 15 | 16 | def test_message_parts(): 17 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 18 | ' \n\nYou have been selected') 19 | assert results[0]['mail_parts'][1]['decoded_body'].startswith( 20 | ' 2: 7 | with open(TEST_FILE, encoding='latin-1') as f: 8 | email = f.read() 9 | email = str(email) 10 | else: 11 | with open(TEST_FILE, encoding='utf8') as f: 12 | email = f.read() 13 | 14 | results = csirtg_mail.parse_email_from_string(email) 15 | 16 | 17 | def test_message_headers(): 18 | assert results[0]['headers']['return-path'][0] == '' 19 | 20 | 21 | def test_message_parts(): 22 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 23 | '\n\n' 13 | 14 | 15 | def test_message_parts(): 16 | ascii_encoded_body = results[0]['mail_parts'][0]['decoded_body'].encode( 17 | 'ascii', 'xmlcharrefreplace') 18 | assert ascii_encoded_body.decode('utf-8').startswith("Dear Où") 19 | 20 | 21 | def test_extract_urls(): 22 | urls = set(results[0]['urls']) 23 | assert 'http://www.geldfa.de/3957/generic-ranitidine-online-pharmacy-canadian-zantac-compresse' in urls 24 | -------------------------------------------------------------------------------- /test/test_multi_mixed_plain_rfc822_plain_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/multi_mixed_plain_rfc822_plain_01.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | assert results[1]['headers']['to'][0] == 'John ' 14 | 15 | 16 | def test_message_parts(): 17 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 18 | 'give me your credentials') 19 | assert results[1]['mail_parts'][0]['decoded_body'].startswith( 20 | 'phishing message attached') 21 | 22 | 23 | def test_extract_urls(): 24 | assert "http://www.example.com" in results[0]['urls'] 25 | -------------------------------------------------------------------------------- /test/test_multi_mixed_plain_rfc822_plain_02.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/multi_mixed_plain_rfc822_plain_02.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | assert results[1]['headers']['delivered-to'][0] == 'john@csirtgadgets.org' 14 | 15 | 16 | def test_message_parts(): 17 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 18 | 'give me your credentials') 19 | assert results[1]['mail_parts'][0]['decoded_body'].startswith( 20 | 'forward attachment as inline') 21 | 22 | 23 | def test_extract_urls(): 24 | assert "http://www.example.com" in results[0]['urls'] 25 | -------------------------------------------------------------------------------- /samples/email/multi_alternative_plain_html_02.eml: -------------------------------------------------------------------------------- 1 | MIME-Version: 1.0 2 | Received: by 10.36.27.135 with HTTP; Mon, 6 Jul 2015 10:51:11 -0700 (PDT) 3 | Date: Mon, 6 Jul 2015 13:51:11 -0400 4 | Delivered-To: john@csirtgadgets.org 5 | Message-ID: 6 | Subject: test2 (text plain) 7 | From: John 8 | To: John 9 | Content-Type: multipart/alternative; boundary="f46d042a0a5519988c051a388de8" 10 | 11 | --f46d042a0a5519988c051a388de8 12 | Content-Type: text/plain; charset=UTF-8 13 | 14 | http://www.indiana.edu 15 | 16 | 17 | --f46d042a0a5519988c051a388de8 18 | Content-Type: text/html; charset=UTF-8 19 | 20 | 21 | 22 | --f46d042a0a5519988c051a388de8-- 23 | -------------------------------------------------------------------------------- /test/test_multi_mixed_plain_application_x_zip_compressed_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | from csirtg_mail.constants import PYVERSION 3 | 4 | TEST_FILE = 'samples/email/multi_mixed_plain_application_x_zip_compressed_01.eml' 5 | 6 | if PYVERSION > 2: 7 | with open(TEST_FILE, encoding='utf-8') as f: 8 | email = f.read() 9 | else: 10 | with open(TEST_FILE, encoding='utf8') as f: 11 | email = f.read() 12 | 13 | results = csirtg_mail.parse_email_from_string(email) 14 | 15 | 16 | def test_message_headers(): 17 | assert results[0]['headers']['to'][0] == 'Larry ' 18 | 19 | 20 | def test_message_parts(): 21 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 22 | 'See the attached zip file') 23 | assert results[0]['mail_parts'][1]['base64_encoded_payload'].startswith( 24 | 'UEsDBBQACAAIAO') 25 | -------------------------------------------------------------------------------- /test/test_multi_alternative_plain_html_03.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/multi_alternative_plain_html_03.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['to'][0] == 'undisclosed-recipients:;' 13 | 14 | 15 | def test_message_parts(): 16 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 17 | ' \n\n-- \n\n [1]') 18 | assert results[0]['mail_parts'][1]['decoded_body'].startswith( 19 | '' 13 | assert results[1]['headers']['to'][0].startswith( 14 | 'John ') 15 | assert results[2]['headers']['to'][0].startswith( 16 | 'John ') 17 | 18 | 19 | def test_message_parts(): 20 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 21 | 'give me your credentials') 22 | assert results[1]['mail_parts'][0]['decoded_body'].startswith( 23 | 'phishing message attached') 24 | assert results[2]['mail_parts'][0]['decoded_body'].startswith( 25 | 'forward attachment of attachment') 26 | 27 | 28 | def test_extract_urls(): 29 | assert "http://www.example.com" in results[0]['urls'] 30 | -------------------------------------------------------------------------------- /test/test_multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_base64_01.py: -------------------------------------------------------------------------------- 1 | import csirtg_mail 2 | 3 | TEST_FILE = 'samples/email/multi_mixed_plain_rfc822_mixed_plain_rfc822_plain_base64_01.eml' 4 | 5 | with open(TEST_FILE, encoding='utf8') as f: 6 | email = f.read() 7 | 8 | results = csirtg_mail.parse_email_from_string(email) 9 | 10 | 11 | def test_message_headers(): 12 | assert results[0]['headers']['return-path'][0] == '' 13 | assert results[1]['headers']['to'][0].startswith( 14 | 'John ') 15 | assert results[2]['headers']['to'][0].startswith( 16 | 'John ') 17 | 18 | 19 | def test_message_parts(): 20 | assert results[0]['mail_parts'][0]['decoded_body'].startswith( 21 | 'give me your credentials') 22 | assert results[1]['mail_parts'][0]['decoded_body'].startswith( 23 | 'phishing message attached') 24 | assert results[2]['mail_parts'][0]['decoded_body'].startswith( 25 | 'forward attachment of attachment') 26 | 27 | 28 | def test_extract_urls(): 29 | assert "http://www.example.com" in results[0]['urls'] 30 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | language: python 4 | python: 5 | - 2.7 6 | - 3.5 7 | - 3.6 8 | 9 | install: 10 | - pip install pip --upgrade 11 | - easy_install distribute 12 | - pip install setuptools --upgrade 13 | - pip install -r dev_requirements.txt 14 | 15 | script: 16 | - python setup.py test 17 | - python setup.py sdist bdist bdist_wheel 18 | 19 | notifications: 20 | email: 21 | on_success: never 22 | on_failure: never 23 | 24 | deploy: 25 | provider: pypi 26 | user: wesyoung 27 | password: 28 | secure: ZBAKlT269C1Hmx90t13Fro5ldcKP9nFAzATDwKDVvLI9bE53/dV3XjCk76pf69qYkMxf99Fvq02WzXPHEK7SQ7Kg/oQPnJRvhBNx4Mv1jtvztI8t1wi57PAYo5AgrY76gABPIgqpUsUlO01mMdk6j2Uf8z5dA5ylOVXwXrpQYLZ77YFruNT/WaeXAT9V7k5zXh7cQRzcTSJSQppWa/hrpw3MNCecAgYPJEl/TGKg063S1EAGm3yq10wJGN/J1nsEoGtidoihSfpuwxxbpeBC7dKzKVpxjqJjSN2Gxd05P9kT+8Ss+Ncz/8qpoqI3XBlwvo+ZHjg9AbVO8skk3WVZfd34wub9xaIQwO3x8ttU9+b24B0014ix0kFeQrqJsleHO9i9ZUO5tF4Qcl1011LkRNUxiBW2zGaz7PfI+VyNBG3Kix80ixweCF0QVvyKmZAuhCxyyR1uBiigYyz3IRuhcPvaGbB25Tn1PSblX2ef55QAKDE8Zu6t2Klv5WD0jIotBg/5bT8fwTMJRss58t62oOFIyVEbzuWTdFSU/cfZFUcPxy1/JITgSzGBwZmHbDK2qyoJRQm8rRRt7d6TmpV9BEcPLq98WTF4BpMLg88T/9WKgRc4fhc6V2bEgTL4LeYbFUIRIYH0aAYMenWU/dqwH73WNHhQvIxplT7G4Z+znvs= 29 | on: 30 | branch: master 31 | tags: true 32 | condition: $TRAVIS_PYTHON_VERSION = "3.5" 33 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | #e -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # This will setup a clean Ubuntu1404 LTS env 5 | 6 | $script = <