diff --git a/.travis.yml b/.travis.yml index 1214c04c..0f78cb1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ python: install: - "pip install 'argparse>=1.2.1' --allow-all-external" + - pip install pyopenssl - python setup.py -q install - pip install coverage pytest-cov coveralls --use-mirrors diff --git a/pywb/framework/certauth.py b/pywb/framework/certauth.py index 35c0c000..9824b9b3 100644 --- a/pywb/framework/certauth.py +++ b/pywb/framework/certauth.py @@ -1,7 +1,13 @@ import logging import os -from OpenSSL import crypto -from OpenSSL.SSL import FILETYPE_PEM +openssl_avail = False +try: + from OpenSSL import crypto + from OpenSSL.SSL import FILETYPE_PEM + openssl_avail = True +except ImportError: # pragma: no cover + pass + import random from argparse import ArgumentParser diff --git a/pywb/framework/proxy.py b/pywb/framework/proxy.py index 2352ed9e..c5e75dfd 100644 --- a/pywb/framework/proxy.py +++ b/pywb/framework/proxy.py @@ -12,7 +12,7 @@ from pywb.utils.wbexception import BadRequestException from pywb.utils.bufferedreaders import BufferedReader -from certauth import CertificateAuthority +from certauth import CertificateAuthority, openssl_avail from proxy_resolvers import ProxyAuthResolver, CookieResolver @@ -91,6 +91,13 @@ class ProxyRouter(object): self.proxy_cert_dl_view = None return + if not openssl_avail: # pragma: no coverage + print('HTTPS proxy not available as pyopenssl is not installed') + print('Please install via "pip install pyopenssl" to enable HTTPS support') + self.ca = None + self.proxy_cert_dl_view = None + return + # HTTPS Only Options ca_file = proxy_options.get('root_ca_file') diff --git a/pywb/framework/test/test_certauth.py b/pywb/framework/test/test_certauth.py index 5ca89070..6f7ce583 100644 --- a/pywb/framework/test/test_certauth.py +++ b/pywb/framework/test/test_certauth.py @@ -1,3 +1,5 @@ +import pytest + import os import shutil @@ -6,6 +8,10 @@ from pywb.framework.certauth import main, CertificateAuthority TEST_CA_DIR = './pywb/framework/test/pywb_test_ca_certs' TEST_CA_ROOT = './pywb/framework/test/pywb_test_ca.pem' +def setup_module(): + openssl_support = pytest.importorskip("OpenSSL") + pass + def test_create_root(): ret = main([TEST_CA_ROOT, '-n', 'Test Root Cert']) assert ret == 0 diff --git a/setup.py b/setup.py index 6b5482bf..ce73017b 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,6 @@ setup( 'jinja2', 'surt', 'pyyaml', - 'pyopenssl', ], tests_require=[ 'pytest', diff --git a/tests/test_proxy_https.py b/tests/test_proxy_https.py index 58bc9d6c..e13284a2 100644 --- a/tests/test_proxy_https.py +++ b/tests/test_proxy_https.py @@ -1,3 +1,5 @@ +import pytest + from pywb.webapp.pywb_init import create_wb_router from pywb.framework.wsgi_wrappers import init_app @@ -8,8 +10,10 @@ from pywb.framework.proxy_resolvers import CookieResolver import threading import requests import shutil +import sys import os + TEST_CONFIG = 'tests/test_config_proxy.yaml' TEST_CA_DIR = './tests/pywb_test_certs' @@ -19,6 +23,8 @@ server = None sesh_key = None def setup_module(): + openssl_support = pytest.importorskip("OpenSSL") + global server server = ServeThread() server.daemon = True @@ -67,7 +73,6 @@ class TestHttpsProxy: if sesh_key: self.session.headers.update({'Cookie': '__pywb_proxy_sesh=' + sesh_key}) self.session.cookies.set('__pywb_proxy_sesh', sesh_key, domain='.pywb.proxy') - #self.session.cookies.set('__pywb_proxy_sesh', sesh_key, domain='.iana.org') return self.session.get(url, proxies=server.proxy_dict, @@ -78,7 +83,6 @@ class TestHttpsProxy: if sesh_key: self.session.headers.update({'Cookie': '__pywb_proxy_sesh=' + sesh_key}) self.session.cookies.set('__pywb_proxy_sesh', sesh_key, domain='.pywb.proxy') - #self.session.cookies.set('__pywb_proxy_sesh', sesh_key, domain='.iana.org') return self.session.post(url, data=data, @@ -160,15 +164,14 @@ class TestHttpsProxy: assert resp.url == 'https://example.com/' assert '20140127171251' in resp.text + @pytest.mark.skipif(sys.version_info < (2,7), + reason="doesn't work in 2.6") def test_post_replay_all_coll(self): resp = self.post_url('https://httpbin.org/post', data={'foo': 'bar', 'test': 'abc'}) assert resp.url == 'https://httpbin.org/post' assert 'application/json' in resp.headers['content-type'] assert resp.status_code == 200 - #assert 'wbinfo.proxy_magic = "pywb.proxy";' in resp.text - #assert '20140126200624' in resp.text - # Bounce back to select.pywb.proxy due to missing session def test_clear_key(self): # clear session key