From e0f3cce14cb26d10bc259d431f688fb0d10ab3f5 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Thu, 20 Oct 2016 10:38:57 +1300 Subject: netlib.utils.[get,set]bit -> mitmproxy.utils.bits --- mitmproxy/tools/main.py | 2 +- mitmproxy/utils/bits.py | 15 +++++++++++ mitmproxy/utils/version_check.py | 43 ++++++++++++++++++++++++++++++ netlib/tcp.py | 2 +- netlib/utils.py | 16 ----------- netlib/version_check.py | 43 ------------------------------ netlib/websockets/frame.py | 22 +++++++-------- test/mitmproxy/test_utils_version_check.py | 25 +++++++++++++++++ test/netlib/test_version_check.py | 25 ----------------- 9 files changed, 96 insertions(+), 97 deletions(-) create mode 100644 mitmproxy/utils/bits.py create mode 100644 mitmproxy/utils/version_check.py delete mode 100644 netlib/version_check.py create mode 100644 test/mitmproxy/test_utils_version_check.py delete mode 100644 test/netlib/test_version_check.py diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py index f3526de9..9fce9234 100644 --- a/mitmproxy/tools/main.py +++ b/mitmproxy/tools/main.py @@ -6,7 +6,7 @@ from mitmproxy.tools import cmdline from mitmproxy import exceptions from mitmproxy.proxy import config from mitmproxy.proxy import server -from netlib import version_check +from mitmproxy.utils import version_check from mitmproxy.utils import debug diff --git a/mitmproxy/utils/bits.py b/mitmproxy/utils/bits.py new file mode 100644 index 00000000..ec0d40ef --- /dev/null +++ b/mitmproxy/utils/bits.py @@ -0,0 +1,15 @@ + + +def setbit(byte, offset, value): + """ + Set a bit in a byte to 1 if value is truthy, 0 if not. + """ + if value: + return byte | (1 << offset) + else: + return byte & ~(1 << offset) + + +def getbit(byte, offset): + mask = 1 << offset + return bool(byte & mask) diff --git a/mitmproxy/utils/version_check.py b/mitmproxy/utils/version_check.py new file mode 100644 index 00000000..547c031c --- /dev/null +++ b/mitmproxy/utils/version_check.py @@ -0,0 +1,43 @@ +""" +Having installed a wrong version of pyOpenSSL or netlib is unfortunately a +very common source of error. Check before every start that both versions +are somewhat okay. +""" +import sys +import inspect +import os.path + +import OpenSSL + +PYOPENSSL_MIN_VERSION = (0, 15) + + +def check_pyopenssl_version(min_version=PYOPENSSL_MIN_VERSION, fp=sys.stderr): + min_version_str = u".".join(str(x) for x in min_version) + try: + v = tuple(int(x) for x in OpenSSL.__version__.split(".")[:2]) + except ValueError: + print( + u"Cannot parse pyOpenSSL version: {}" + u"mitmproxy requires pyOpenSSL {} or greater.".format( + OpenSSL.__version__, min_version_str + ), + file=fp + ) + return + if v < min_version: + print( + u"You are using an outdated version of pyOpenSSL: " + u"mitmproxy requires pyOpenSSL {} or greater.".format(min_version_str), + file=fp + ) + # Some users apparently have multiple versions of pyOpenSSL installed. + # Report which one we got. + pyopenssl_path = os.path.dirname(inspect.getfile(OpenSSL)) + print( + u"Your pyOpenSSL {} installation is located at {}".format( + OpenSSL.__version__, pyopenssl_path + ), + file=fp + ) + sys.exit(1) diff --git a/netlib/tcp.py b/netlib/tcp.py index 4fde657f..4379c9b5 100644 --- a/netlib/tcp.py +++ b/netlib/tcp.py @@ -18,7 +18,7 @@ import OpenSSL from OpenSSL import SSL from netlib import certutils -from netlib import version_check +from mitmproxy.utils import version_check from mitmproxy.types import serializable from netlib import exceptions from mitmproxy.types import basethread diff --git a/netlib/utils.py b/netlib/utils.py index 779eaa27..7b007cb5 100644 --- a/netlib/utils.py +++ b/netlib/utils.py @@ -1,21 +1,5 @@ import re - -def setbit(byte, offset, value): - """ - Set a bit in a byte to 1 if value is truthy, 0 if not. - """ - if value: - return byte | (1 << offset) - else: - return byte & ~(1 << offset) - - -def getbit(byte, offset): - mask = 1 << offset - return bool(byte & mask) - - _label_valid = re.compile(b"(?!-)[A-Z\d-]{1,63}(? 125 indicates you need to read more bytes diff --git a/test/mitmproxy/test_utils_version_check.py b/test/mitmproxy/test_utils_version_check.py new file mode 100644 index 00000000..5c8d8c8c --- /dev/null +++ b/test/mitmproxy/test_utils_version_check.py @@ -0,0 +1,25 @@ +import io +import mock +from mitmproxy.utils import version_check + + +@mock.patch("sys.exit") +def test_check_pyopenssl_version(sexit): + fp = io.StringIO() + version_check.check_pyopenssl_version(fp=fp) + assert not fp.getvalue() + assert not sexit.called + + version_check.check_pyopenssl_version((9999,), fp=fp) + assert "outdated" in fp.getvalue() + assert sexit.called + + +@mock.patch("sys.exit") +@mock.patch("OpenSSL.__version__") +def test_unparseable_pyopenssl_version(version, sexit): + version.split.return_value = ["foo", "bar"] + fp = io.StringIO() + version_check.check_pyopenssl_version(fp=fp) + assert "Cannot parse" in fp.getvalue() + assert not sexit.called diff --git a/test/netlib/test_version_check.py b/test/netlib/test_version_check.py deleted file mode 100644 index 01820dad..00000000 --- a/test/netlib/test_version_check.py +++ /dev/null @@ -1,25 +0,0 @@ -import io -import mock -from netlib import version_check - - -@mock.patch("sys.exit") -def test_check_pyopenssl_version(sexit): - fp = io.StringIO() - version_check.check_pyopenssl_version(fp=fp) - assert not fp.getvalue() - assert not sexit.called - - version_check.check_pyopenssl_version((9999,), fp=fp) - assert "outdated" in fp.getvalue() - assert sexit.called - - -@mock.patch("sys.exit") -@mock.patch("OpenSSL.__version__") -def test_unparseable_pyopenssl_version(version, sexit): - version.split.return_value = ["foo", "bar"] - fp = io.StringIO() - version_check.check_pyopenssl_version(fp=fp) - assert "Cannot parse" in fp.getvalue() - assert not sexit.called -- cgit v1.2.3