From 9bc1514aefe524a0c6afceec8e2d2afe15acdf66 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 12:05:10 +1200 Subject: Unify proxy config and options This is step 1 in a gradual "boiling frog" strategy. Decorate ProxyConfig with an Options object. --- test/mitmproxy/test_flow.py | 4 +++- test/mitmproxy/test_protocol_http2.py | 6 ++++-- test/mitmproxy/test_proxy.py | 7 +++++-- test/mitmproxy/tservers.py | 16 +++++++++------- 4 files changed, 21 insertions(+), 12 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index 90f7f915..a44353e7 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -4,6 +4,7 @@ import io import netlib.utils from netlib.http import Headers from mitmproxy import filt, controller, flow +from mitmproxy.flow import options from mitmproxy.contrib import tnetstring from mitmproxy.exceptions import FlowReadException from mitmproxy.models import Error @@ -640,6 +641,7 @@ class TestSerialize: r = self._treader() s = flow.State() conf = ProxyConfig( + options.Options(), mode="reverse", upstream_server=("https", ("use-this-domain", 80)) ) @@ -753,7 +755,7 @@ class TestFlowMaster: pb = [tutils.tflow(resp=True), f] fm = flow.FlowMaster( flow.options.Options(), - DummyServer(ProxyConfig()), + DummyServer(ProxyConfig(options.Options())), s ) assert not fm.start_server_playback( diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index b8f724bd..04ca94bf 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -9,6 +9,7 @@ import traceback import h2 +from mitmproxy.flow import options from mitmproxy.proxy.config import ProxyConfig from mitmproxy.cmdline import APP_HOST, APP_PORT @@ -88,9 +89,10 @@ class _Http2TestBase(object): @classmethod def setup_class(cls): - cls.config = ProxyConfig(**cls.get_proxy_config()) + cls.masteroptions = options.Options() + cls.config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) - tmaster = tservers.TestMaster(cls.config) + tmaster = tservers.TestMaster(cls.masteroptions, cls.config) tmaster.start_app(APP_HOST, APP_PORT) cls.proxy = tservers.ProxyThread(tmaster) cls.proxy.start() diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index cd24fc9f..f4f73cf5 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -7,6 +7,7 @@ from mitmproxy.proxy import ProxyConfig from mitmproxy.proxy.config import process_proxy_options from mitmproxy.models.connections import ServerConnection from mitmproxy.proxy.server import DummyServer, ProxyServer, ConnectionHandler +from mitmproxy.flow import options from netlib.exceptions import TcpDisconnect from pathod import test from netlib.http import http1 @@ -58,8 +59,8 @@ class TestProcessProxyOptions: def p(self, *args): parser = tutils.MockParser() cmdline.common_options(parser) - opts = parser.parse_args(args=args) - return parser, process_proxy_options(parser, opts) + args = parser.parse_args(args=args) + return parser, process_proxy_options(parser, options.Options(), args) def assert_err(self, err, *args): tutils.raises(err, self.p, *args) @@ -159,12 +160,14 @@ class TestProxyServer: @tutils.skip_windows def test_err(self): conf = ProxyConfig( + options.Options(), port=1 ) tutils.raises("error starting proxy server", ProxyServer, conf) def test_err_2(self): conf = ProxyConfig( + options.Options(), host="invalidhost" ) tutils.raises("error starting proxy server", ProxyServer, conf) diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index 9b830b2d..e236656e 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -32,11 +32,11 @@ def errapp(environ, start_response): class TestMaster(flow.FlowMaster): - def __init__(self, config): + def __init__(self, opts, config): config.port = 0 s = ProxyServer(config) state = flow.State() - flow.FlowMaster.__init__(self, options.Options(), s, state) + flow.FlowMaster.__init__(self, opts, s, state) self.addons.add(*builtins.default_addons()) self.apps.add(testapp, "testapp", 80) self.apps.add(errapp, "errapp", 80) @@ -80,6 +80,7 @@ class ProxyTestBase(object): no_upstream_cert = False authenticator = None masterclass = TestMaster + masteroptions = options.Options() add_upstream_certs_to_client_chain = False @classmethod @@ -91,9 +92,8 @@ class ProxyTestBase(object): ssl=cls.ssl, ssloptions=cls.ssloptions) - cls.config = ProxyConfig(**cls.get_proxy_config()) - - tmaster = cls.masterclass(cls.config) + cls.config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) + tmaster = cls.masterclass(cls.masteroptions, cls.config) tmaster.start_app(APP_HOST, APP_PORT) cls.proxy = ProxyThread(tmaster) cls.proxy.start() @@ -284,17 +284,19 @@ class ChainProxyTest(ProxyTestBase): @classmethod def setup_class(cls): + cls.masteroptions = options.Options() cls.chain = [] super(ChainProxyTest, cls).setup_class() for _ in range(cls.n): - config = ProxyConfig(**cls.get_proxy_config()) - tmaster = cls.masterclass(config) + config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) + tmaster = cls.masterclass(cls.masteroptions, config) proxy = ProxyThread(tmaster) proxy.start() cls.chain.insert(0, proxy) # Patch the orginal proxy to upstream mode cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig( + cls.masteroptions, **cls.get_proxy_config()) @classmethod -- cgit v1.2.3 From 6908dc4d901fbe23107253535596a14ed2691539 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 14:19:39 +1200 Subject: ProxyConfig refactor Step two of frog boiling: move listening address and port into options. This is the hard bit, because it touches the test suite so deeply. --- test/mitmproxy/test_protocol_http2.py | 9 +++++--- test/mitmproxy/test_proxy.py | 6 ++---- test/mitmproxy/test_server.py | 4 ++-- test/mitmproxy/tservers.py | 40 +++++++++++++++++------------------ 4 files changed, 30 insertions(+), 29 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index 04ca94bf..dd81ba23 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -90,9 +90,10 @@ class _Http2TestBase(object): @classmethod def setup_class(cls): cls.masteroptions = options.Options() - cls.config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) + cnf, opts = cls.get_proxy_config() + cls.config = ProxyConfig(opts, **cnf) - tmaster = tservers.TestMaster(cls.masteroptions, cls.config) + tmaster = tservers.TestMaster(opts, cls.config) tmaster.start_app(APP_HOST, APP_PORT) cls.proxy = tservers.ProxyThread(tmaster) cls.proxy.start() @@ -103,12 +104,14 @@ class _Http2TestBase(object): @classmethod def get_proxy_config(cls): + opts = options.Options(listen_port=0) cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - return dict( + d = dict( no_upstream_cert=False, cadir=cls.cadir, authenticator=None, ) + return d, opts @property def master(self): diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index f4f73cf5..c87e1ad4 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -160,15 +160,13 @@ class TestProxyServer: @tutils.skip_windows def test_err(self): conf = ProxyConfig( - options.Options(), - port=1 + options.Options(listen_port=1), ) tutils.raises("error starting proxy server", ProxyServer, conf) def test_err_2(self): conf = ProxyConfig( - options.Options(), - host="invalidhost" + options.Options(listen_host="invalidhost"), ) tutils.raises("error starting proxy server", ProxyServer, conf) diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index 2e580d47..20372c92 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -484,9 +484,9 @@ class TestHttps2Http(tservers.ReverseProxyTest): @classmethod def get_proxy_config(cls): - d = super(TestHttps2Http, cls).get_proxy_config() + d, opts = super(TestHttps2Http, cls).get_proxy_config() d["upstream_server"] = ("http", d["upstream_server"][1]) - return d + return d, opts def pathoc(self, ssl, sni=None): """ diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index e236656e..f9e1925f 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -33,7 +33,6 @@ def errapp(environ, start_response): class TestMaster(flow.FlowMaster): def __init__(self, opts, config): - config.port = 0 s = ProxyServer(config) state = flow.State() flow.FlowMaster.__init__(self, opts, s, state) @@ -55,7 +54,8 @@ class ProxyThread(threading.Thread): threading.Thread.__init__(self) self.tmaster = tmaster self.name = "ProxyThread (%s:%s)" % ( - tmaster.server.address.host, tmaster.server.address.port) + tmaster.server.address.host, tmaster.server.address.port + ) controller.should_exit = False @property @@ -80,7 +80,6 @@ class ProxyTestBase(object): no_upstream_cert = False authenticator = None masterclass = TestMaster - masteroptions = options.Options() add_upstream_certs_to_client_chain = False @classmethod @@ -92,8 +91,9 @@ class ProxyTestBase(object): ssl=cls.ssl, ssloptions=cls.ssloptions) - cls.config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) - tmaster = cls.masterclass(cls.masteroptions, cls.config) + cnf, opts = cls.get_proxy_config() + cls.config = ProxyConfig(opts, **cnf) + tmaster = cls.masterclass(opts, cls.config) tmaster.start_app(APP_HOST, APP_PORT) cls.proxy = ProxyThread(tmaster) cls.proxy.start() @@ -120,12 +120,13 @@ class ProxyTestBase(object): @classmethod def get_proxy_config(cls): cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - return dict( + cnf = dict( no_upstream_cert = cls.no_upstream_cert, cadir = cls.cadir, authenticator = cls.authenticator, add_upstream_certs_to_client_chain = cls.add_upstream_certs_to_client_chain, ) + return cnf, options.Options(listen_port=0) class HTTPProxyTest(ProxyTestBase): @@ -199,9 +200,9 @@ class TransparentProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() + d, opts = ProxyTestBase.get_proxy_config() d["mode"] = "transparent" - return d + return d, opts def pathod(self, spec, sni=None): """ @@ -231,13 +232,13 @@ class ReverseProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() + d, opts = ProxyTestBase.get_proxy_config() d["upstream_server"] = ( "https" if cls.ssl else "http", ("127.0.0.1", cls.server.port) ) d["mode"] = "reverse" - return d + return d, opts def pathoc(self, sni=None): """ @@ -266,9 +267,9 @@ class SocksModeTest(HTTPProxyTest): @classmethod def get_proxy_config(cls): - d = ProxyTestBase.get_proxy_config() + d, opts = ProxyTestBase.get_proxy_config() d["mode"] = "socks5" - return d + return d, opts class ChainProxyTest(ProxyTestBase): @@ -284,20 +285,19 @@ class ChainProxyTest(ProxyTestBase): @classmethod def setup_class(cls): - cls.masteroptions = options.Options() cls.chain = [] super(ChainProxyTest, cls).setup_class() for _ in range(cls.n): - config = ProxyConfig(cls.masteroptions, **cls.get_proxy_config()) - tmaster = cls.masterclass(cls.masteroptions, config) + cnf, opts = cls.get_proxy_config() + config = ProxyConfig(opts, **cnf) + tmaster = cls.masterclass(opts, config) proxy = ProxyThread(tmaster) proxy.start() cls.chain.insert(0, proxy) # Patch the orginal proxy to upstream mode - cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig( - cls.masteroptions, - **cls.get_proxy_config()) + cnf, opts = cls.get_proxy_config() + cls.config = cls.proxy.tmaster.config = cls.proxy.tmaster.server.config = ProxyConfig(opts, **cnf) @classmethod def teardown_class(cls): @@ -313,13 +313,13 @@ class ChainProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): - d = super(ChainProxyTest, cls).get_proxy_config() + d, opts = super(ChainProxyTest, cls).get_proxy_config() if cls.chain: # First proxy is in normal mode. d.update( mode="upstream", upstream_server=("http", ("127.0.0.1", cls.chain[0].port)) ) - return d + return d, opts class HTTPUpstreamProxyTest(ChainProxyTest, HTTPProxyTest): -- cgit v1.2.3 From b1b1a1b9cfad24d62ffc5bf0613927fadd7bc77e Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 14:50:10 +1200 Subject: ProxyConfig: cadir to options --- test/mitmproxy/test_protocol_http2.py | 3 +-- test/mitmproxy/tservers.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index dd81ba23..34e6656a 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -105,10 +105,9 @@ class _Http2TestBase(object): @classmethod def get_proxy_config(cls): opts = options.Options(listen_port=0) - cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") + opts.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") d = dict( no_upstream_cert=False, - cadir=cls.cadir, authenticator=None, ) return d, opts diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index f9e1925f..ddb2922a 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -122,11 +122,10 @@ class ProxyTestBase(object): cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") cnf = dict( no_upstream_cert = cls.no_upstream_cert, - cadir = cls.cadir, authenticator = cls.authenticator, add_upstream_certs_to_client_chain = cls.add_upstream_certs_to_client_chain, ) - return cnf, options.Options(listen_port=0) + return cnf, options.Options(listen_port=0, cadir=cls.cadir) class HTTPProxyTest(ProxyTestBase): -- cgit v1.2.3 From 856e1c2ba938c6fb7639286cb27ae5cf3f63e2c8 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 15:40:40 +1200 Subject: Move clientcers & cadir to Options Also adds a .configure mechanism to ProxyConfig, and hooks it up to the change event. --- test/mitmproxy/test_proxy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index c87e1ad4..70ddfd40 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -60,7 +60,9 @@ class TestProcessProxyOptions: parser = tutils.MockParser() cmdline.common_options(parser) args = parser.parse_args(args=args) - return parser, process_proxy_options(parser, options.Options(), args) + opts = cmdline.get_common_options(args) + pconf = process_proxy_options(parser, options.Options(**opts), args) + return parser, pconf def assert_err(self, err, *args): tutils.raises(err, self.p, *args) -- cgit v1.2.3 From d2268ddb1ebfca2b3314c3bde12d3a356fd6a114 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 16:58:53 +1200 Subject: ProxyConfig: --body-size-limit to Options --- test/mitmproxy/test_protocol_http2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test') diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index 34e6656a..d910ecae 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -591,7 +591,7 @@ class TestBodySizeLimit(_Http2Test): return True def test_body_size_limit(self): - self.config.body_size_limit = 20 + self.config.options.body_size_limit = 20 client, h2_conn = self._setup_connection() -- cgit v1.2.3 From f9622074ccdfafda384fa3a1466d8363c2a65244 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 18 Jul 2016 18:10:21 +1200 Subject: ProxyConfig: mode, upstream_server and upstream_auth to Options --- test/mitmproxy/test_cmdline.py | 29 ---------------------- test/mitmproxy/test_flow.py | 8 +++---- test/mitmproxy/test_proxy.py | 33 ++++++++++++------------- test/mitmproxy/test_proxy_config.py | 48 +++++++++++++++++++++++++++++++++++++ test/mitmproxy/test_server.py | 5 ++-- test/mitmproxy/tservers.py | 20 +++++++++------- 6 files changed, 84 insertions(+), 59 deletions(-) create mode 100644 test/mitmproxy/test_proxy_config.py (limited to 'test') diff --git a/test/mitmproxy/test_cmdline.py b/test/mitmproxy/test_cmdline.py index 4fe2cf94..55627408 100644 --- a/test/mitmproxy/test_cmdline.py +++ b/test/mitmproxy/test_cmdline.py @@ -1,5 +1,4 @@ import argparse -import base64 from mitmproxy import cmdline from . import tutils @@ -36,34 +35,6 @@ def test_parse_replace_hook(): ) -def test_parse_server_spec(): - tutils.raises("Invalid server specification", cmdline.parse_server_spec, "") - assert cmdline.parse_server_spec( - "http://foo.com:88") == (b"http", (b"foo.com", 88)) - assert cmdline.parse_server_spec( - "http://foo.com") == (b"http", (b"foo.com", 80)) - assert cmdline.parse_server_spec( - "https://foo.com") == (b"https", (b"foo.com", 443)) - tutils.raises( - "Invalid server specification", - cmdline.parse_server_spec, - "foo.com") - tutils.raises( - "Invalid server specification", - cmdline.parse_server_spec, - "http://") - - -def test_parse_upstream_auth(): - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, "") - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, ":") - tutils.raises("Invalid upstream auth specification", cmdline.parse_upstream_auth, ":test") - assert cmdline.parse_upstream_auth( - "test:test") == b"Basic" + b" " + base64.b64encode(b"test:test") - assert cmdline.parse_upstream_auth( - "test:") == b"Basic" + b" " + base64.b64encode(b"test:") - - def test_parse_setheaders(): x = cmdline.parse_setheader("/foo/bar/voing") assert x == ("foo", "bar", "voing") diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index a44353e7..ee588a5c 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -640,12 +640,12 @@ class TestSerialize: def test_load_flows_reverse(self): r = self._treader() s = flow.State() - conf = ProxyConfig( - options.Options(), + opts = options.Options( mode="reverse", - upstream_server=("https", ("use-this-domain", 80)) + upstream_server="https://use-this-domain" ) - fm = flow.FlowMaster(None, DummyServer(conf), s) + conf = ProxyConfig(opts) + fm = flow.FlowMaster(opts, DummyServer(conf), s) fm.load_flows(r) assert s.flows[0].request.host == "use-this-domain" diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index 70ddfd40..16c4821c 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -85,21 +85,22 @@ class TestProcessProxyOptions: @mock.patch("mitmproxy.platform.resolver") def test_modes(self, _): - self.assert_noerr("-R", "http://localhost") - self.assert_err("expected one argument", "-R") - self.assert_err("Invalid server specification", "-R", "reverse") - - self.assert_noerr("-T") - - self.assert_noerr("-U", "http://localhost") - self.assert_err("expected one argument", "-U") - self.assert_err("Invalid server specification", "-U", "upstream") - - self.assert_noerr("--upstream-auth", "test:test") - self.assert_err("expected one argument", "--upstream-auth") - self.assert_err("Invalid upstream auth specification", "--upstream-auth", "test") - - self.assert_err("mutually exclusive", "-R", "http://localhost", "-T") + # self.assert_noerr("-R", "http://localhost") + # self.assert_err("expected one argument", "-R") + # self.assert_err("Invalid server specification", "-R", "reverse") + # + # self.assert_noerr("-T") + # + # self.assert_noerr("-U", "http://localhost") + # self.assert_err("expected one argument", "-U") + # self.assert_err("Invalid server specification", "-U", "upstream") + # + # self.assert_noerr("--upstream-auth", "test:test") + # self.assert_err("expected one argument", "--upstream-auth") + self.assert_err( + "Invalid upstream auth specification", "--upstream-auth", "test" + ) + # self.assert_err("mutually exclusive", "-R", "http://localhost", "-T") def test_socks_auth(self): self.assert_err("Proxy Authentication not supported in SOCKS mode.", "--socks", "--nonanonymous") @@ -187,7 +188,7 @@ class TestConnectionHandler: config = mock.Mock() root_layer = mock.Mock() root_layer.side_effect = RuntimeError - config.mode.return_value = root_layer + config.options.mode.return_value = root_layer channel = mock.Mock() def ask(_, x): diff --git a/test/mitmproxy/test_proxy_config.py b/test/mitmproxy/test_proxy_config.py new file mode 100644 index 00000000..2f31d502 --- /dev/null +++ b/test/mitmproxy/test_proxy_config.py @@ -0,0 +1,48 @@ +from . import tutils +import base64 +from mitmproxy.proxy import config + + +def test_parse_server_spec(): + tutils.raises( + "Invalid server specification", config.parse_server_spec, "" + ) + assert config.parse_server_spec("http://foo.com:88") == ( + b"http", (b"foo.com", 88) + ) + assert config.parse_server_spec("http://foo.com") == ( + b"http", (b"foo.com", 80) + ) + assert config.parse_server_spec("https://foo.com") == ( + b"https", (b"foo.com", 443) + ) + tutils.raises( + "Invalid server specification", + config.parse_server_spec, + "foo.com" + ) + tutils.raises( + "Invalid server specification", + config.parse_server_spec, + "http://" + ) + + +def test_parse_upstream_auth(): + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + "" + ) + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + ":" + ) + tutils.raises( + "Invalid upstream auth specification", + config.parse_upstream_auth, + ":test" + ) + assert config.parse_upstream_auth("test:test") == b"Basic" + b" " + base64.b64encode(b"test:test") + assert config.parse_upstream_auth("test:") == b"Basic" + b" " + base64.b64encode(b"test:") diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index 20372c92..ca3f8a97 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -15,7 +15,7 @@ from pathod import pathoc, pathod from mitmproxy.builtins import script from mitmproxy import controller -from mitmproxy.proxy.config import HostMatcher +from mitmproxy.proxy.config import HostMatcher, parse_server_spec from mitmproxy.models import Error, HTTPResponse, HTTPFlow from . import tutils, tservers @@ -485,7 +485,8 @@ class TestHttps2Http(tservers.ReverseProxyTest): @classmethod def get_proxy_config(cls): d, opts = super(TestHttps2Http, cls).get_proxy_config() - d["upstream_server"] = ("http", d["upstream_server"][1]) + s = parse_server_spec(opts.upstream_server) + opts.upstream_server = "http://%s" % s.address.decode("ascii") return d, opts def pathoc(self, ssl, sni=None): diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index ddb2922a..b7b1f001 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -200,7 +200,7 @@ class TransparentProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): d, opts = ProxyTestBase.get_proxy_config() - d["mode"] = "transparent" + opts.mode = "transparent" return d, opts def pathod(self, spec, sni=None): @@ -232,11 +232,15 @@ class ReverseProxyTest(ProxyTestBase): @classmethod def get_proxy_config(cls): d, opts = ProxyTestBase.get_proxy_config() - d["upstream_server"] = ( - "https" if cls.ssl else "http", - ("127.0.0.1", cls.server.port) + opts.upstream_server = "".join( + [ + "https" if cls.ssl else "http", + "://", + "127.0.0.1:", + str(cls.server.port) + ] ) - d["mode"] = "reverse" + opts.mode = "reverse" return d, opts def pathoc(self, sni=None): @@ -267,7 +271,7 @@ class SocksModeTest(HTTPProxyTest): @classmethod def get_proxy_config(cls): d, opts = ProxyTestBase.get_proxy_config() - d["mode"] = "socks5" + opts.mode = "socks5" return d, opts @@ -314,9 +318,9 @@ class ChainProxyTest(ProxyTestBase): def get_proxy_config(cls): d, opts = super(ChainProxyTest, cls).get_proxy_config() if cls.chain: # First proxy is in normal mode. - d.update( + opts.update( mode="upstream", - upstream_server=("http", ("127.0.0.1", cls.chain[0].port)) + upstream_server="http://127.0.0.1:%s" % cls.chain[0].port ) return d, opts -- cgit v1.2.3 From 78e8159007051122de1a1be1467d9261266b288e Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 11:10:37 +1200 Subject: config.parse_server_spec shouldn't pass byts to tcp.Address --- test/mitmproxy/test_proxy_config.py | 6 +++--- test/mitmproxy/test_server.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_proxy_config.py b/test/mitmproxy/test_proxy_config.py index 2f31d502..d8085eb8 100644 --- a/test/mitmproxy/test_proxy_config.py +++ b/test/mitmproxy/test_proxy_config.py @@ -8,13 +8,13 @@ def test_parse_server_spec(): "Invalid server specification", config.parse_server_spec, "" ) assert config.parse_server_spec("http://foo.com:88") == ( - b"http", (b"foo.com", 88) + "http", ("foo.com", 88) ) assert config.parse_server_spec("http://foo.com") == ( - b"http", (b"foo.com", 80) + "http", ("foo.com", 80) ) assert config.parse_server_spec("https://foo.com") == ( - b"https", (b"foo.com", 443) + "https", ("foo.com", 443) ) tutils.raises( "Invalid server specification", diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index ca3f8a97..73e070ac 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -486,7 +486,7 @@ class TestHttps2Http(tservers.ReverseProxyTest): def get_proxy_config(cls): d, opts = super(TestHttps2Http, cls).get_proxy_config() s = parse_server_spec(opts.upstream_server) - opts.upstream_server = "http://%s" % s.address.decode("ascii") + opts.upstream_server = "http://%s" % s.address return d, opts def pathoc(self, ssl, sni=None): -- cgit v1.2.3 From 0a3839375de80a032f244c62ee254199750e5f91 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 11:41:04 +1200 Subject: ProxyConfig: various SSL options to Options --- test/mitmproxy/tservers.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index b7b1f001..2bfc27e8 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -123,9 +123,12 @@ class ProxyTestBase(object): cnf = dict( no_upstream_cert = cls.no_upstream_cert, authenticator = cls.authenticator, - add_upstream_certs_to_client_chain = cls.add_upstream_certs_to_client_chain, ) - return cnf, options.Options(listen_port=0, cadir=cls.cadir) + return cnf, options.Options( + listen_port=0, + cadir=cls.cadir, + add_upstream_certs_to_client_chain=cls.add_upstream_certs_to_client_chain + ) class HTTPProxyTest(ProxyTestBase): -- cgit v1.2.3 From 98bf544664dcbf4b8846d1dbe5c07d053baad184 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 12:17:30 +1200 Subject: Regularize naming of upstream_trusted_ca* options --- test/mitmproxy/test_proxy.py | 4 ++-- test/mitmproxy/test_server.py | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index 16c4821c..5cceb8c2 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -149,12 +149,12 @@ class TestProcessProxyOptions: def test_upstream_trusted_cadir(self): expected_dir = "/path/to/a/ca/dir" p = self.assert_noerr("--upstream-trusted-cadir", expected_dir) - assert p.openssl_trusted_cadir_server == expected_dir + assert p.options.ssl_verify_upstream_trusted_cadir == expected_dir def test_upstream_trusted_ca(self): expected_file = "/path/to/a/cert/file" p = self.assert_noerr("--upstream-trusted-ca", expected_file) - assert p.openssl_trusted_ca_server == expected_file + assert p.options.ssl_verify_upstream_trusted_ca == expected_file class TestProxyServer: diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index 73e070ac..a64a8565 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -369,14 +369,14 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): def test_verification_w_cadir(self): self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_cadir_server = tutils.test_data.path( - "data/trusted-cadir/") - + self.config.options.ssl_verify_upstream_trusted_cadir = tutils.test_data.path( + "data/trusted-cadir/" + ) self.pathoc() def test_verification_w_pemfile(self): self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_ca_server = tutils.test_data.path( + self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( "data/trusted-cadir/trusted-ca.pem") self.pathoc() @@ -401,21 +401,21 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest): def test_default_verification_w_bad_cert(self): """Should use no verification.""" - self.config.openssl_trusted_ca_server = tutils.test_data.path( + self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( "data/trusted-cadir/trusted-ca.pem") assert self._request().status_code == 242 def test_no_verification_w_bad_cert(self): self.config.openssl_verification_mode_server = SSL.VERIFY_NONE - self.config.openssl_trusted_ca_server = tutils.test_data.path( + self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( "data/trusted-cadir/trusted-ca.pem") assert self._request().status_code == 242 def test_verification_w_bad_cert(self): self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.openssl_trusted_ca_server = tutils.test_data.path( + self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( "data/trusted-cadir/trusted-ca.pem") assert self._request().status_code == 502 -- cgit v1.2.3 From 26fa88a338c96a9e57fdbf3943a8936eaac4c5c7 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 13:23:54 +1200 Subject: ProxyConfig: Refactor to move verification mode checks into configure --- test/mitmproxy/test_server.py | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index a64a8565..f036fefd 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -368,9 +368,11 @@ class TestHTTPSUpstreamServerVerificationWTrustedCert(tservers.HTTPProxyTest): ]) def test_verification_w_cadir(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.options.ssl_verify_upstream_trusted_cadir = tutils.test_data.path( - "data/trusted-cadir/" + self.config.options.update( + ssl_verify_upstream_cert = True, + ssl_verify_upstream_trusted_cadir = tutils.test_data.path( + "data/trusted-cadir/" + ) ) self.pathoc() @@ -401,23 +403,29 @@ class TestHTTPSUpstreamServerVerificationWBadCert(tservers.HTTPProxyTest): def test_default_verification_w_bad_cert(self): """Should use no verification.""" - self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 242 def test_no_verification_w_bad_cert(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_NONE - self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_cert = False, + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 242 def test_verification_w_bad_cert(self): - self.config.openssl_verification_mode_server = SSL.VERIFY_PEER - self.config.options.ssl_verify_upstream_trusted_ca = tutils.test_data.path( - "data/trusted-cadir/trusted-ca.pem") - + self.config.options.update( + ssl_verify_upstream_cert = True, + ssl_verify_upstream_trusted_ca = tutils.test_data.path( + "data/trusted-cadir/trusted-ca.pem" + ) + ) assert self._request().status_code == 502 -- cgit v1.2.3 From 5cfe783b6c38b9fa6473e57b9567149146829108 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 14:06:02 +1200 Subject: ProxyConfig: http2, rawtcp, no_upstream_cert -> Options --- test/mitmproxy/test_protocol_http2.py | 5 +---- test/mitmproxy/tservers.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index d910ecae..e8866643 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -104,10 +104,9 @@ class _Http2TestBase(object): @classmethod def get_proxy_config(cls): - opts = options.Options(listen_port=0) + opts = options.Options(listen_port=0, no_upstream_cert=False) opts.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") d = dict( - no_upstream_cert=False, authenticator=None, ) return d, opts @@ -122,8 +121,6 @@ class _Http2TestBase(object): self.server.server.handle_server_event = self.handle_server_event def _setup_connection(self): - self.config.http2 = True - client = netlib.tcp.TCPClient(("127.0.0.1", self.proxy.port)) client.connect() diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index 2bfc27e8..8df30e34 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -121,12 +121,12 @@ class ProxyTestBase(object): def get_proxy_config(cls): cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") cnf = dict( - no_upstream_cert = cls.no_upstream_cert, authenticator = cls.authenticator, ) return cnf, options.Options( listen_port=0, cadir=cls.cadir, + no_upstream_cert = cls.no_upstream_cert, add_upstream_certs_to_client_chain=cls.add_upstream_certs_to_client_chain ) -- cgit v1.2.3 From be081a24bc1e1d7cd740289775b6de8e1ece2372 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 14:51:12 +1200 Subject: ProxyConf: auth_* into Options --- test/mitmproxy/test_protocol_http2.py | 4 +--- test/mitmproxy/test_proxy.py | 6 +++++- test/mitmproxy/test_server.py | 7 +------ test/mitmproxy/tservers.py | 5 +---- 4 files changed, 8 insertions(+), 14 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_protocol_http2.py b/test/mitmproxy/test_protocol_http2.py index e8866643..a7a3ba3f 100644 --- a/test/mitmproxy/test_protocol_http2.py +++ b/test/mitmproxy/test_protocol_http2.py @@ -106,9 +106,7 @@ class _Http2TestBase(object): def get_proxy_config(cls): opts = options.Options(listen_port=0, no_upstream_cert=False) opts.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - d = dict( - authenticator=None, - ) + d = dict() return d, opts @property diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index 5cceb8c2..4127a889 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -103,7 +103,11 @@ class TestProcessProxyOptions: # self.assert_err("mutually exclusive", "-R", "http://localhost", "-T") def test_socks_auth(self): - self.assert_err("Proxy Authentication not supported in SOCKS mode.", "--socks", "--nonanonymous") + self.assert_err( + "Proxy Authentication not supported in SOCKS mode.", + "--socks", + "--nonanonymous" + ) def test_client_certs(self): with tutils.tmpdir() as cadir: diff --git a/test/mitmproxy/test_server.py b/test/mitmproxy/test_server.py index f036fefd..b8b057fd 100644 --- a/test/mitmproxy/test_server.py +++ b/test/mitmproxy/test_server.py @@ -298,13 +298,8 @@ class TestHTTP(tservers.HTTPProxyTest, CommonMixin, AppMixin): class TestHTTPAuth(tservers.HTTPProxyTest): - authenticator = http.authentication.BasicProxyAuth( - http.authentication.PassManSingleUser( - "test", - "test"), - "realm") - def test_auth(self): + self.master.options.auth_singleuser = "test:test" assert self.pathod("202").status_code == 407 p = self.pathoc() ret = p.request(""" diff --git a/test/mitmproxy/tservers.py b/test/mitmproxy/tservers.py index 8df30e34..495765da 100644 --- a/test/mitmproxy/tservers.py +++ b/test/mitmproxy/tservers.py @@ -78,7 +78,6 @@ class ProxyTestBase(object): ssl = None ssloptions = False no_upstream_cert = False - authenticator = None masterclass = TestMaster add_upstream_certs_to_client_chain = False @@ -120,9 +119,7 @@ class ProxyTestBase(object): @classmethod def get_proxy_config(cls): cls.cadir = os.path.join(tempfile.gettempdir(), "mitmproxy") - cnf = dict( - authenticator = cls.authenticator, - ) + cnf = dict() return cnf, options.Options( listen_port=0, cadir=cls.cadir, -- cgit v1.2.3 From ef380917a89d18d684c03269bae77f6d53dcc1b8 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 15:08:53 +1200 Subject: ProxyConf: adapt mitmproxy console, ditch tcp|host filter attrs on flow.master --- test/mitmproxy/test_flow.py | 9 --------- 1 file changed, 9 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_flow.py b/test/mitmproxy/test_flow.py index ee588a5c..e17a125c 100644 --- a/test/mitmproxy/test_flow.py +++ b/test/mitmproxy/test_flow.py @@ -12,7 +12,6 @@ from mitmproxy.models import Flow from mitmproxy.models import HTTPFlow from mitmproxy.models import HTTPRequest from mitmproxy.models import HTTPResponse -from mitmproxy.proxy.config import HostMatcher from mitmproxy.proxy import ProxyConfig from mitmproxy.proxy.server import DummyServer from mitmproxy.models.connections import ClientConnection @@ -690,14 +689,6 @@ class TestSerialize: class TestFlowMaster: - def test_getset_ignore(self): - p = mock.Mock() - p.config.check_ignore = HostMatcher() - fm = flow.FlowMaster(None, p, flow.State()) - assert not fm.get_ignore_filter() - fm.set_ignore_filter(["^apple\.com:", ":443$"]) - assert fm.get_ignore_filter() - def test_replay(self): s = flow.State() fm = flow.FlowMaster(None, None, s) -- cgit v1.2.3 From 9c9d28d068d5c0aadea2baf10b48435f6283d659 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 19 Jul 2016 15:19:58 +1200 Subject: Remove proxy.config.process_proxy_options --- test/mitmproxy/test_proxy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/mitmproxy/test_proxy.py b/test/mitmproxy/test_proxy.py index 4127a889..7095d9d2 100644 --- a/test/mitmproxy/test_proxy.py +++ b/test/mitmproxy/test_proxy.py @@ -4,10 +4,10 @@ from OpenSSL import SSL from mitmproxy import cmdline from mitmproxy.proxy import ProxyConfig -from mitmproxy.proxy.config import process_proxy_options from mitmproxy.models.connections import ServerConnection from mitmproxy.proxy.server import DummyServer, ProxyServer, ConnectionHandler from mitmproxy.flow import options +from mitmproxy.proxy import config from netlib.exceptions import TcpDisconnect from pathod import test from netlib.http import http1 @@ -61,7 +61,7 @@ class TestProcessProxyOptions: cmdline.common_options(parser) args = parser.parse_args(args=args) opts = cmdline.get_common_options(args) - pconf = process_proxy_options(parser, options.Options(**opts), args) + pconf = config.ProxyConfig(options.Options(**opts)) return parser, pconf def assert_err(self, err, *args): -- cgit v1.2.3