diff options
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r-- | mitmproxy/tools/cmdline.py | 169 | ||||
-rw-r--r-- | mitmproxy/tools/console/master.py | 44 | ||||
-rw-r--r-- | mitmproxy/tools/console/options.py | 58 | ||||
-rw-r--r-- | mitmproxy/tools/console/palettepicker.py | 21 | ||||
-rw-r--r-- | mitmproxy/tools/dump.py | 15 | ||||
-rw-r--r-- | mitmproxy/tools/main.py | 67 | ||||
-rw-r--r-- | mitmproxy/tools/web/master.py | 23 |
7 files changed, 160 insertions, 237 deletions
diff --git a/mitmproxy/tools/cmdline.py b/mitmproxy/tools/cmdline.py index f8246199..925491d7 100644 --- a/mitmproxy/tools/cmdline.py +++ b/mitmproxy/tools/cmdline.py @@ -1,6 +1,7 @@ -import configargparse -import os +import argparse import re +import os + from mitmproxy import exceptions from mitmproxy import flowfilter from mitmproxy import options @@ -11,6 +12,9 @@ from mitmproxy import version from mitmproxy.addons import view +CONFIG_PATH = os.path.join(options.CA_DIR, "config.yaml") + + class ParseException(Exception): pass @@ -113,13 +117,13 @@ def get_common_options(args): stream_large_bodies = human.parse_size(stream_large_bodies) reps = [] - for i in args.replace: + for i in args.replace or []: try: p = parse_replace_hook(i) except ParseException as e: raise exceptions.OptionsError(e) reps.append(p) - for i in args.replace_file: + for i in args.replace_file or []: try: patt, rex, path = parse_replace_hook(i) except ParseException as e: @@ -133,7 +137,7 @@ def get_common_options(args): reps.append((patt, rex, v)) setheaders = [] - for i in args.setheader: + for i in args.setheader or []: try: p = parse_setheader(i) except ParseException as e: @@ -154,7 +158,7 @@ def get_common_options(args): # Proxy config certs = [] - for i in args.certs: + for i in args.certs or []: parts = i.split("=", 1) if len(parts) == 1: parts = ["*", parts[0]] @@ -287,8 +291,7 @@ def basic_options(parser): ) parser.add_argument( "--anticache", - action="store_true", dest="anticache", default=False, - + action="store_true", dest="anticache", help=""" Strip out request headers that might cause the server to return 304-not-modified. @@ -296,12 +299,12 @@ def basic_options(parser): ) parser.add_argument( "--cadir", - action="store", type=str, dest="cadir", default=options.CA_DIR, + action="store", type=str, dest="cadir", help="Location of the default mitmproxy CA files. (%s)" % options.CA_DIR ) parser.add_argument( "--host", - action="store_true", dest="showhost", default=False, + action="store_true", dest="showhost", help="Use the Host header to construct URLs for display." ) parser.add_argument( @@ -311,12 +314,12 @@ def basic_options(parser): ) parser.add_argument( "-r", "--read-flows", - action="store", dest="rfile", default=None, + action="store", dest="rfile", help="Read flows from file." ) parser.add_argument( "-s", "--script", - action="append", type=str, dest="scripts", default=[], + action="append", type=str, dest="scripts", metavar='"script.py --bar"', help=""" Run a script. Surround with quotes to pass script arguments. Can be @@ -327,18 +330,17 @@ def basic_options(parser): "-t", "--stickycookie", action="store", dest="stickycookie_filt", - default=None, metavar="FILTER", help="Set sticky cookie filter. Matched against requests." ) parser.add_argument( "-u", "--stickyauth", - action="store", dest="stickyauth_filt", default=None, metavar="FILTER", + action="store", dest="stickyauth_filt", metavar="FILTER", help="Set sticky auth filter. Matched against requests." ) parser.add_argument( "-v", "--verbose", - action="store_const", dest="verbose", default=2, const=3, + action="store_const", dest="verbose", const=3, help="Increase log verbosity." ) streamfile = parser.add_mutually_exclusive_group() @@ -354,19 +356,19 @@ def basic_options(parser): ) parser.add_argument( "-z", "--anticomp", - action="store_true", dest="anticomp", default=False, + action="store_true", dest="anticomp", help="Try to convince servers to send us un-compressed data." ) parser.add_argument( "-Z", "--body-size-limit", - action="store", dest="body_size_limit", default=None, + action="store", dest="body_size_limit", metavar="SIZE", help="Byte size limit of HTTP request and response bodies." " Understands k/m/g suffixes, i.e. 3m for 3 megabytes." ) parser.add_argument( "--stream", - action="store", dest="stream_large_bodies", default=None, + action="store", dest="stream_large_bodies", metavar="SIZE", help=""" Stream data to the client if response body exceeds the given @@ -383,7 +385,6 @@ def proxy_modes(parser): action="store", type=str, dest="reverse_proxy", - default=None, help=""" Forward all requests to upstream HTTP server: http[s]://host[:port]. Clients can always connect both @@ -393,12 +394,12 @@ def proxy_modes(parser): ) group.add_argument( "--socks", - action="store_true", dest="socks_proxy", default=False, + action="store_true", dest="socks_proxy", help="Set SOCKS5 proxy mode." ) group.add_argument( "-T", "--transparent", - action="store_true", dest="transparent_proxy", default=False, + action="store_true", dest="transparent_proxy", help="Set transparent proxy mode." ) group.add_argument( @@ -406,7 +407,6 @@ def proxy_modes(parser): action="store", type=str, dest="upstream_proxy", - default=None, help="Forward all requests to upstream proxy server: http://host[:port]" ) @@ -415,12 +415,12 @@ def proxy_options(parser): group = parser.add_argument_group("Proxy Options") group.add_argument( "-b", "--bind-address", - action="store", type=str, dest="addr", default='', + action="store", type=str, dest="addr", help="Address to bind proxy to (defaults to all interfaces)" ) group.add_argument( "-I", "--ignore", - action="append", type=str, dest="ignore_hosts", default=[], + action="append", type=str, dest="ignore_hosts", metavar="HOST", help=""" Ignore host and forward all traffic without processing it. In @@ -433,7 +433,7 @@ def proxy_options(parser): ) group.add_argument( "--tcp", - action="append", type=str, dest="tcp_hosts", default=[], + action="append", type=str, dest="tcp_hosts", metavar="HOST", help=""" Generic TCP SSL proxy mode for all hosts that match the pattern. @@ -448,7 +448,7 @@ def proxy_options(parser): ) group.add_argument( "-p", "--port", - action="store", type=int, dest="port", default=options.LISTEN_PORT, + action="store", type=int, dest="port", help="Proxy service port." ) group.add_argument( @@ -467,7 +467,7 @@ def proxy_options(parser): parser.add_argument( "--upstream-auth", - action="store", dest="upstream_auth", default=None, + action="store", dest="upstream_auth", type=str, help=""" Add HTTP Basic authentcation to upstream proxy and reverse proxy @@ -491,7 +491,7 @@ def proxy_options(parser): ) group.add_argument( "--upstream-bind-address", - action="store", type=str, dest="upstream_bind_address", default='', + action="store", type=str, dest="upstream_bind_address", help="Address to bind upstream requests to (defaults to none)" ) @@ -502,7 +502,6 @@ def proxy_ssl_options(parser): group.add_argument( "--cert", dest='certs', - default=[], type=str, metavar="SPEC", action="append", @@ -514,56 +513,56 @@ def proxy_ssl_options(parser): 'as the first entry. Can be passed multiple times.') group.add_argument( "--ciphers-client", action="store", - type=str, dest="ciphers_client", default=options.DEFAULT_CLIENT_CIPHERS, + type=str, dest="ciphers_client", help="Set supported ciphers for client connections. (OpenSSL Syntax)" ) group.add_argument( "--ciphers-server", action="store", - type=str, dest="ciphers_server", default=None, + type=str, dest="ciphers_server", help="Set supported ciphers for server connections. (OpenSSL Syntax)" ) group.add_argument( "--client-certs", action="store", - type=str, dest="clientcerts", default=None, + type=str, dest="clientcerts", help="Client certificate file or directory." ) group.add_argument( - "--no-upstream-cert", default=False, + "--no-upstream-cert", action="store_true", dest="no_upstream_cert", help="Don't connect to upstream server to look up certificate details." ) group.add_argument( - "--add-upstream-certs-to-client-chain", default=False, + "--add-upstream-certs-to-client-chain", action="store_true", dest="add_upstream_certs_to_client_chain", help="Add all certificates of the upstream server to the certificate chain " "that will be served to the proxy client, as extras." ) group.add_argument( - "--insecure", default=False, + "--insecure", action="store_true", dest="ssl_insecure", help="Do not verify upstream server SSL/TLS certificates." ) group.add_argument( - "--upstream-trusted-cadir", default=None, action="store", + "--upstream-trusted-cadir", action="store", dest="ssl_verify_upstream_trusted_cadir", help="Path to a directory of trusted CA certificates for upstream " "server verification prepared using the c_rehash tool." ) group.add_argument( - "--upstream-trusted-ca", default=None, action="store", + "--upstream-trusted-ca", action="store", dest="ssl_verify_upstream_trusted_ca", help="Path to a PEM formatted trusted CA certificate." ) group.add_argument( "--ssl-version-client", dest="ssl_version_client", - default="secure", action="store", + action="store", choices=tcp.sslversion_choices.keys(), help="Set supported SSL/TLS versions for client connections. " "SSLv2, SSLv3 and 'all' are INSECURE. Defaults to secure, which is TLS1.0+." ) group.add_argument( "--ssl-version-server", dest="ssl_version_server", - default="secure", action="store", + action="store", choices=tcp.sslversion_choices.keys(), help="Set supported SSL/TLS versions for server connections. " "SSLv2, SSLv3 and 'all' are INSECURE. Defaults to secure, which is TLS1.0+." @@ -574,12 +573,12 @@ def onboarding_app(parser): group = parser.add_argument_group("Onboarding App") group.add_argument( "--noapp", - action="store_false", dest="app", default=True, + action="store_false", dest="app", help="Disable the mitmproxy onboarding app." ) group.add_argument( "--app-host", - action="store", dest="app_host", default=options.APP_HOST, metavar="host", + action="store", dest="app_host", help=""" Domain to serve the onboarding app from. For transparent mode, use an IP when a DNS entry for the app domain is not present. Default: @@ -590,7 +589,6 @@ def onboarding_app(parser): "--app-port", action="store", dest="app_port", - default=options.APP_PORT, type=int, metavar="80", help="Port to serve the onboarding app from." @@ -601,7 +599,7 @@ def client_replay(parser): group = parser.add_argument_group("Client Replay") group.add_argument( "-c", "--client-replay", - action="append", dest="client_replay", default=[], metavar="PATH", + action="append", dest="client_replay", metavar="PATH", help="Replay client requests from a saved file." ) @@ -610,23 +608,23 @@ def server_replay(parser): group = parser.add_argument_group("Server Replay") group.add_argument( "-S", "--server-replay", - action="append", dest="server_replay", default=[], metavar="PATH", + action="append", dest="server_replay", metavar="PATH", help="Replay server responses from a saved file." ) group.add_argument( "-k", "--replay-kill-extra", - action="store_true", dest="replay_kill_extra", default=False, + action="store_true", dest="replay_kill_extra", help="Kill extra requests during replay." ) group.add_argument( "--server-replay-use-header", - action="append", dest="server_replay_use_headers", type=str, default=[], + action="append", dest="server_replay_use_headers", type=str, help="Request headers to be considered during replay. " "Can be passed multiple times." ) group.add_argument( "--norefresh", - action="store_true", dest="norefresh", default=False, + action="store_true", dest="norefresh", help=""" Disable response refresh, which updates times in cookies and headers for replayed responses. @@ -634,21 +632,21 @@ def server_replay(parser): ) group.add_argument( "--no-pop", - action="store_true", dest="server_replay_nopop", default=False, + action="store_true", dest="server_replay_nopop", help="Disable response pop from response flow. " "This makes it possible to replay same response multiple times." ) payload = group.add_mutually_exclusive_group() payload.add_argument( "--replay-ignore-content", - action="store_true", dest="server_replay_ignore_content", default=False, + action="store_true", dest="server_replay_ignore_content", help=""" Ignore request's content while searching for a saved flow to replay """ ) payload.add_argument( "--replay-ignore-payload-param", - action="append", dest="server_replay_ignore_payload_params", type=str, default=[], + action="append", dest="server_replay_ignore_payload_params", type=str, help=""" Request's payload parameters (application/x-www-form-urlencoded or multipart/form-data) to be ignored while searching for a saved flow to replay. @@ -658,7 +656,7 @@ def server_replay(parser): group.add_argument( "--replay-ignore-param", - action="append", dest="server_replay_ignore_params", type=str, default=[], + action="append", dest="server_replay_ignore_params", type=str, help=""" Request's parameters to be ignored while searching for a saved flow to replay. Can be passed multiple times. @@ -668,7 +666,6 @@ def server_replay(parser): "--replay-ignore-host", action="store_true", dest="server_replay_ignore_host", - default=False, help="Ignore request's destination host while searching for a saved flow to replay") @@ -683,13 +680,13 @@ def replacements(parser): ) group.add_argument( "--replace", - action="append", type=str, dest="replace", default=[], + action="append", type=str, dest="replace", metavar="PATTERN", help="Replacement pattern." ) group.add_argument( "--replace-from-file", - action="append", type=str, dest="replace_file", default=[], + action="append", type=str, dest="replace_file", metavar="PATH", help=""" Replacement pattern, where the replacement clause is a path to a @@ -709,7 +706,7 @@ def set_headers(parser): ) group.add_argument( "--setheader", - action="append", type=str, dest="setheader", default=[], + action="append", type=str, dest="setheader", metavar="PATTERN", help="Header set pattern." ) @@ -747,6 +744,15 @@ def proxy_authentication(parser): def common_options(parser): + parser.add_argument( + "--conf", + type=str, dest="conf", default=CONFIG_PATH, + metavar="PATH", + help=""" + Configuration file + """ + ) + basic_options(parser) proxy_modes(parser) proxy_options(parser) @@ -764,26 +770,17 @@ def mitmproxy(): # platforms. from .console import palettes - parser = configargparse.ArgumentParser( - usage="%(prog)s [options]", - args_for_setting_config_path=["--conf"], - default_config_files=[ - os.path.join(options.CA_DIR, "common.conf"), - os.path.join(options.CA_DIR, "mitmproxy.conf") - ], - add_config_file_help=True, - add_env_var_help=True - ) + parser = argparse.ArgumentParser(usage="%(prog)s [options]") common_options(parser) parser.add_argument( - "--palette", type=str, default=palettes.DEFAULT, + "--palette", type=str, action="store", dest="palette", choices=sorted(palettes.palettes.keys()), help="Select color palette: " + ", ".join(palettes.palettes.keys()) ) parser.add_argument( "--palette-transparent", - action="store_true", dest="palette_transparent", default=False, + action="store_true", dest="palette_transparent", help="Set transparent background for palette." ) parser.add_argument( @@ -798,7 +795,7 @@ def mitmproxy(): ) parser.add_argument( "--order", - type=str, dest="order", default=None, + type=str, dest="order", choices=[o[1] for o in view.orders], help="Flow sort order." ) @@ -813,33 +810,24 @@ def mitmproxy(): ) group.add_argument( "-i", "--intercept", action="store", - type=str, dest="intercept", default=None, + type=str, dest="intercept", help="Intercept filter expression." ) group.add_argument( "-f", "--filter", action="store", - type=str, dest="filter", default=None, + type=str, dest="filter", help="Filter view expression." ) return parser def mitmdump(): - parser = configargparse.ArgumentParser( - usage="%(prog)s [options] [filter]", - args_for_setting_config_path=["--conf"], - default_config_files=[ - os.path.join(options.CA_DIR, "common.conf"), - os.path.join(options.CA_DIR, "mitmdump.conf") - ], - add_config_file_help=True, - add_env_var_help=True - ) + parser = argparse.ArgumentParser(usage="%(prog)s [options] [filter]") common_options(parser) parser.add_argument( "--keepserving", - action="store_true", dest="keepserving", default=False, + action="store_true", dest="keepserving", help=""" Continue serving after client playback or file read. We exit by default. @@ -847,7 +835,7 @@ def mitmdump(): ) parser.add_argument( "-d", "--detail", - action="count", dest="flow_detail", default=1, + action="count", dest="flow_detail", help="Increase flow detail display level. Can be passed multiple times." ) parser.add_argument( @@ -862,16 +850,7 @@ def mitmdump(): def mitmweb(): - parser = configargparse.ArgumentParser( - usage="%(prog)s [options]", - args_for_setting_config_path=["--conf"], - default_config_files=[ - os.path.join(options.CA_DIR, "common.conf"), - os.path.join(options.CA_DIR, "mitmweb.conf") - ], - add_config_file_help=True, - add_env_var_help=True - ) + parser = argparse.ArgumentParser(usage="%(prog)s [options]") group = parser.add_argument_group("Mitmweb") group.add_argument( @@ -881,13 +860,13 @@ def mitmweb(): ) group.add_argument( "--wport", - action="store", type=int, dest="wport", default=8081, + action="store", type=int, dest="wport", metavar="PORT", help="Mitmweb port." ) group.add_argument( "--wiface", - action="store", dest="wiface", default="127.0.0.1", + action="store", dest="wiface", metavar="IFACE", help="Mitmweb interface." ) @@ -904,7 +883,7 @@ def mitmweb(): ) group.add_argument( "-i", "--intercept", action="store", - type=str, dest="intercept", default=None, + type=str, dest="intercept", help="Intercept filter expression." ) return parser diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py index 5d0e0ef4..9b6cc6ab 100644 --- a/mitmproxy/tools/console/master.py +++ b/mitmproxy/tools/console/master.py @@ -11,7 +11,6 @@ import tempfile import traceback import urwid -from typing import Optional from mitmproxy import addons from mitmproxy import controller @@ -39,33 +38,6 @@ from mitmproxy.net import tcp EVENTLOG_SIZE = 500 -class Options(mitmproxy.options.Options): - def __init__( - self, - *, # all args are keyword-only. - eventlog: bool = False, - focus_follow: bool = False, - intercept: Optional[str] = None, - filter: Optional[str] = None, - palette: Optional[str] = None, - palette_transparent: bool = False, - no_mouse: bool = False, - order: Optional[str] = None, - order_reversed: bool = False, - **kwargs - ): - self.eventlog = eventlog - self.focus_follow = focus_follow - self.intercept = intercept - self.filter = filter - self.palette = palette - self.palette_transparent = palette_transparent - self.no_mouse = no_mouse - self.order = order - self.order_reversed = order_reversed - super().__init__(**kwargs) - - class ConsoleMaster(master.Master): palette = [] @@ -77,9 +49,6 @@ class ConsoleMaster(master.Master): self.options = self.options # type: Options self.options.errored.connect(self.options_error) - self.palette = options.palette - self.palette_transparent = options.palette_transparent - self.logbuffer = urwid.SimpleListWalker([]) self.view_stack = [] @@ -253,10 +222,11 @@ class ConsoleMaster(master.Master): self.ui.start() os.unlink(name) - def set_palette(self, name): - self.palette = name + def set_palette(self, options, updated): self.ui.register_palette( - palettes.palettes[name].palette(self.palette_transparent) + palettes.palettes[options.palette].palette( + options.palette_transparent + ) ) self.ui.clear() @@ -269,7 +239,11 @@ class ConsoleMaster(master.Master): def run(self): self.ui = urwid.raw_display.Screen() self.ui.set_terminal_properties(256) - self.set_palette(self.palette) + self.set_palette(self.options, None) + self.options.subscribe( + self.set_palette, + ["palette", "palette_transparent"] + ) self.loop = urwid.MainLoop( urwid.SolidFill("x"), screen = self.ui, diff --git a/mitmproxy/tools/console/options.py b/mitmproxy/tools/console/options.py index 824041dc..94483b3d 100644 --- a/mitmproxy/tools/console/options.py +++ b/mitmproxy/tools/console/options.py @@ -3,7 +3,6 @@ import urwid from mitmproxy import contentviews from mitmproxy.tools.console import common from mitmproxy.tools.console import grideditor -from mitmproxy.tools.console import palettes from mitmproxy.tools.console import select from mitmproxy.tools.console import signals @@ -26,6 +25,12 @@ def _mkhelp(): help_context = _mkhelp() +def checker(opt, options): + def _check(): + return options.has_changed(opt) + return _check + + class Options(urwid.WidgetWrap): def __init__(self, master): @@ -36,25 +41,25 @@ class Options(urwid.WidgetWrap): select.Option( "Header Set Patterns", "H", - lambda: len(master.options.setheaders), + checker("setheaders", master.options), self.setheaders ), select.Option( "Ignore Patterns", "I", - lambda: master.options.ignore_hosts, + checker("ignore_hosts", master.options), self.ignore_hosts ), select.Option( "Replacement Patterns", "R", - lambda: len(master.options.replacements), + checker("replacements", master.options), self.replacepatterns ), select.Option( "Scripts", "S", - lambda: master.options.scripts, + checker("scripts", master.options), self.scripts ), @@ -62,19 +67,19 @@ class Options(urwid.WidgetWrap): select.Option( "Default Display Mode", "M", - lambda: self.master.options.default_contentview != "auto", + checker("default_contentview", master.options), self.default_displaymode ), select.Option( "Palette", "P", - lambda: self.master.palette != palettes.DEFAULT, + checker("palette", master.options), self.palette ), select.Option( "Show Host", "w", - lambda: master.options.showhost, + checker("showhost", master.options), master.options.toggler("showhost") ), @@ -82,19 +87,19 @@ class Options(urwid.WidgetWrap): select.Option( "No Upstream Certs", "U", - lambda: master.options.no_upstream_cert, + checker("no_upstream_cert", master.options), master.options.toggler("no_upstream_cert") ), select.Option( "TCP Proxying", "T", - lambda: master.options.tcp_hosts, + checker("tcp_hosts", master.options), self.tcp_hosts ), select.Option( "Don't Verify SSL/TLS Certificates", "V", - lambda: master.options.ssl_insecure, + checker("ssl_insecure", master.options), master.options.toggler("ssl_insecure") ), @@ -102,37 +107,37 @@ class Options(urwid.WidgetWrap): select.Option( "Anti-Cache", "a", - lambda: master.options.anticache, + checker("anticache", master.options), master.options.toggler("anticache") ), select.Option( "Anti-Compression", "o", - lambda: master.options.anticomp, + checker("anticomp", master.options), master.options.toggler("anticomp") ), select.Option( "Kill Extra", "x", - lambda: master.options.replay_kill_extra, + checker("replay_kill_extra", master.options), master.options.toggler("replay_kill_extra") ), select.Option( "No Refresh", "f", - lambda: not master.options.refresh_server_playback, + checker("refresh_server_playback", master.options), master.options.toggler("refresh_server_playback") ), select.Option( "Sticky Auth", "A", - lambda: master.options.stickyauth, + checker("stickyauth", master.options), self.sticky_auth ), select.Option( "Sticky Cookies", "t", - lambda: master.options.stickycookie, + checker("stickycookie", master.options), self.sticky_cookie ), ] @@ -160,25 +165,10 @@ class Options(urwid.WidgetWrap): return super().keypress(size, key) def clearall(self): - self.master.options.update( - anticache = False, - anticomp = False, - ignore_hosts = (), - tcp_hosts = (), - replay_kill_extra = False, - no_upstream_cert = False, - refresh_server_playback = True, - replacements = [], - scripts = [], - setheaders = [], - showhost = False, - stickyauth = None, - stickycookie = None, - default_contentview = "auto", - ) + self.master.options.reset() signals.update_settings.send(self) signals.status_message.send( - message = "All select.Options cleared", + message = "Options cleared", expire = 1 ) diff --git a/mitmproxy/tools/console/palettepicker.py b/mitmproxy/tools/console/palettepicker.py index a3eb9b90..0d943baf 100644 --- a/mitmproxy/tools/console/palettepicker.py +++ b/mitmproxy/tools/console/palettepicker.py @@ -3,7 +3,6 @@ import urwid from mitmproxy.tools.console import common from mitmproxy.tools.console import palettes from mitmproxy.tools.console import select -from mitmproxy.tools.console import signals footer = [ ('heading_key', "enter/space"), ":select", @@ -43,8 +42,8 @@ class PalettePicker(urwid.WidgetWrap): return select.Option( i, None, - lambda: self.master.palette == name, - lambda: self.select(name) + lambda: self.master.options.palette == name, + lambda: setattr(self.master.options, "palette", name) ) for i in high: @@ -59,8 +58,8 @@ class PalettePicker(urwid.WidgetWrap): select.Option( "Transparent", "T", - lambda: master.palette_transparent, - self.toggle_palette_transparent + lambda: master.options.palette_transparent, + master.options.toggler("palette_transparent") ) ] ) @@ -73,15 +72,7 @@ class PalettePicker(urwid.WidgetWrap): self.lb, header = title ) - signals.update_settings.connect(self.sig_update_settings) + master.options.changed.connect(self.sig_options_changed) - def sig_update_settings(self, sender): + def sig_options_changed(self, options, updated): self.lb.walker._modified() - - def select(self, name): - self.master.set_palette(name) - - def toggle_palette_transparent(self): - self.master.palette_transparent = not self.master.palette_transparent - self.master.set_palette(self.master.palette) - signals.update_settings.send(self) diff --git a/mitmproxy/tools/dump.py b/mitmproxy/tools/dump.py index 3cd94c30..90332627 100644 --- a/mitmproxy/tools/dump.py +++ b/mitmproxy/tools/dump.py @@ -1,9 +1,8 @@ -from typing import Optional, IO +from typing import Optional from mitmproxy import controller from mitmproxy import exceptions from mitmproxy import addons -from mitmproxy import io from mitmproxy import options from mitmproxy import master from mitmproxy.addons import dumper, termlog @@ -21,13 +20,11 @@ class Options(options.Options): keepserving: bool = False, filtstr: Optional[str] = None, flow_detail: int = 1, - tfile: Optional[IO[str]] = None, **kwargs ) -> None: self.filtstr = filtstr self.flow_detail = flow_detail self.keepserving = keepserving - self.tfile = tfile super().__init__(**kwargs) @@ -62,16 +59,6 @@ class DumpMaster(master.Master): self.add_log("Flow file corrupted.", "error") raise DumpError(v) - def _readflow(self, paths): - """ - Utitility function that reads a list of flows - or raises a DumpError if that fails. - """ - try: - return io.read_flows_from_paths(paths) - except exceptions.FlowReadException as e: - raise DumpError(str(e)) - @controller.handler def log(self, e): if e.level == "error": diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py index c3b1e3a9..3c0e44bc 100644 --- a/mitmproxy/tools/main.py +++ b/mitmproxy/tools/main.py @@ -11,12 +11,21 @@ import signal # noqa from mitmproxy.tools import cmdline # noqa from mitmproxy import exceptions # noqa +from mitmproxy import options # noqa from mitmproxy.proxy import config # noqa from mitmproxy.proxy import server # noqa from mitmproxy.utils import version_check # noqa from mitmproxy.utils import debug # noqa +def notnone(d): + ret = {} + for k, v in d.items(): + if v is not None: + ret[k] = v + return ret + + def assert_utf8_env(): spec = "" for i in ["LANG", "LC_CTYPE", "LC_ALL"]: @@ -63,17 +72,21 @@ def mitmproxy(args=None): # pragma: no cover args = parser.parse_args(args) try: - console_options = console.master.Options( - **cmdline.get_common_options(args) + console_options = options.Options() + console_options.load_paths(args.conf) + console_options.update(**notnone(cmdline.get_common_options(args))) + console_options.update( + **notnone(dict( + palette = args.palette, + palette_transparent = args.palette_transparent, + eventlog = args.eventlog, + focus_follow = args.focus_follow, + intercept = args.intercept, + filter = args.filter, + no_mouse = args.no_mouse, + order = args.order, + )) ) - console_options.palette = args.palette - console_options.palette_transparent = args.palette_transparent - console_options.eventlog = args.eventlog - console_options.focus_follow = args.focus_follow - console_options.intercept = args.intercept - console_options.filter = args.filter - console_options.no_mouse = args.no_mouse - console_options.order = args.order server = process_options(parser, console_options, args) m = console.master.ConsoleMaster(console_options, server) @@ -98,10 +111,17 @@ def mitmdump(args=None): # pragma: no cover master = None try: - dump_options = dump.Options(**cmdline.get_common_options(args)) - dump_options.flow_detail = args.flow_detail - dump_options.keepserving = args.keepserving - dump_options.filtstr = " ".join(args.filter) if args.filter else None + dump_options = options.Options() + dump_options.load_paths(args.conf) + dump_options.update(**notnone(cmdline.get_common_options(args))) + dump_options.update( + **notnone(dict( + flow_detail = args.flow_detail, + keepserving = args.keepserving, + filtstr = " ".join(args.filter) if args.filter else None, + )) + ) + server = process_options(parser, dump_options, args) master = dump.DumpMaster(dump_options, server) @@ -130,13 +150,18 @@ def mitmweb(args=None): # pragma: no cover args = parser.parse_args(args) try: - web_options = web.master.Options(**cmdline.get_common_options(args)) - web_options.intercept = args.intercept - web_options.open_browser = args.open_browser - web_options.wdebug = args.wdebug - web_options.wiface = args.wiface - web_options.wport = args.wport - + web_options = options.Options() + web_options.load_paths(args.conf) + web_options.update(**notnone(cmdline.get_common_options(args))) + web_options.update( + **notnone(dict( + intercept = args.intercept, + open_browser = args.open_browser, + wdebug = args.wdebug, + wiface = args.wiface, + wport = args.wport, + )) + ) server = process_options(parser, web_options, args) m = web.master.WebMaster(web_options, server) except exceptions.OptionsError as e: diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py index 89ad698d..edb12467 100644 --- a/mitmproxy/tools/web/master.py +++ b/mitmproxy/tools/web/master.py @@ -1,5 +1,4 @@ import webbrowser -from typing import Optional, IO import tornado.httpserver import tornado.ioloop @@ -7,7 +6,6 @@ from mitmproxy import addons from mitmproxy import exceptions from mitmproxy import log from mitmproxy import master -from mitmproxy import options from mitmproxy.addons import eventstore from mitmproxy.addons import intercept from mitmproxy.addons import termlog @@ -15,27 +13,6 @@ from mitmproxy.addons import view from mitmproxy.tools.web import app -class Options(options.Options): - def __init__( - self, - *, # all args are keyword-only. - intercept: Optional[str] = None, - tfile: Optional[IO[str]] = None, - open_browser: bool = True, - wdebug: bool = False, - wport: int = 8081, - wiface: str = "127.0.0.1", - **kwargs - ) -> None: - self.intercept = intercept - self.tfile = tfile - self.open_browser = open_browser - self.wdebug = wdebug - self.wport = wport - self.wiface = wiface - super().__init__(**kwargs) - - class WebMaster(master.Master): def __init__(self, options, server): super().__init__(options, server) |