diff options
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r-- | mitmproxy/tools/cmdline.py | 174 | ||||
-rw-r--r-- | mitmproxy/tools/console/flowlist.py | 6 | ||||
-rw-r--r-- | mitmproxy/tools/console/master.py | 22 | ||||
-rw-r--r-- | mitmproxy/tools/console/options.py | 21 | ||||
-rw-r--r-- | mitmproxy/tools/console/palettepicker.py | 4 | ||||
-rw-r--r-- | mitmproxy/tools/console/statusbar.py | 8 | ||||
-rw-r--r-- | mitmproxy/tools/dump.py | 18 | ||||
-rw-r--r-- | mitmproxy/tools/main.py | 23 | ||||
-rw-r--r-- | mitmproxy/tools/web/master.py | 8 |
9 files changed, 86 insertions, 198 deletions
diff --git a/mitmproxy/tools/cmdline.py b/mitmproxy/tools/cmdline.py index f607ad71..1c620fd6 100644 --- a/mitmproxy/tools/cmdline.py +++ b/mitmproxy/tools/cmdline.py @@ -1,9 +1,7 @@ import argparse -import re import os from mitmproxy import exceptions -from mitmproxy import flowfilter from mitmproxy import options from mitmproxy import platform from mitmproxy.utils import human @@ -19,91 +17,6 @@ class ParseException(Exception): pass -def _parse_hook(s): - sep, rem = s[0], s[1:] - parts = rem.split(sep, 2) - if len(parts) == 2: - patt = ".*" - a, b = parts - elif len(parts) == 3: - patt, a, b = parts - else: - raise ParseException( - "Malformed hook specifier - too few clauses: %s" % s - ) - - if not a: - raise ParseException("Empty clause: %s" % str(patt)) - - if not flowfilter.parse(patt): - raise ParseException("Malformed filter pattern: %s" % patt) - - return patt, a, b - - -def parse_replace_hook(s): - """ - Returns a (pattern, regex, replacement) tuple. - - The general form for a replacement hook is as follows: - - /patt/regex/replacement - - The first character specifies the separator. Example: - - :~q:foo:bar - - If only two clauses are specified, the pattern is set to match - universally (i.e. ".*"). Example: - - /foo/bar/ - - Clauses are parsed from left to right. Extra separators are taken to be - part of the final clause. For instance, the replacement clause below is - "foo/bar/": - - /one/two/foo/bar/ - - Checks that pattern and regex are both well-formed. Raises - ParseException on error. - """ - patt, regex, replacement = _parse_hook(s) - try: - re.compile(regex) - except re.error as e: - raise ParseException("Malformed replacement regex: %s" % str(e)) - return patt, regex, replacement - - -def parse_setheader(s): - """ - Returns a (pattern, header, value) tuple. - - The general form for a replacement hook is as follows: - - /patt/header/value - - The first character specifies the separator. Example: - - :~q:foo:bar - - If only two clauses are specified, the pattern is set to match - universally (i.e. ".*"). Example: - - /foo/bar/ - - Clauses are parsed from left to right. Extra separators are taken to be - part of the final clause. For instance, the value clause below is - "foo/bar/": - - /one/two/foo/bar/ - - Checks that pattern and regex are both well-formed. Raises - ParseException on error. - """ - return _parse_hook(s) - - def get_common_options(args): stickycookie, stickyauth = None, None if args.stickycookie_filt: @@ -116,34 +29,6 @@ def get_common_options(args): if stream_large_bodies: stream_large_bodies = human.parse_size(stream_large_bodies) - reps = [] - 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 or []: - try: - patt, rex, path = parse_replace_hook(i) - except ParseException as e: - raise exceptions.OptionsError(e) - try: - v = open(path, "rb").read() - except IOError as e: - raise exceptions.OptionsError( - "Could not read replace file: %s" % path - ) - reps.append((patt, rex, v)) - - setheaders = [] - for i in args.setheader or []: - try: - p = parse_setheader(i) - except ParseException as e: - raise exceptions.OptionsError(e) - setheaders.append(p) - if args.streamfile and args.streamfile[0] == args.rfile: if args.streamfile[1] == "wb": raise exceptions.OptionsError( @@ -212,9 +97,9 @@ def get_common_options(args): args.verbose = 0 return dict( - app=args.app, - app_host=args.app_host, - app_port=args.app_port, + onboarding=args.onboarding, + onboarding_host=args.onboarding_host, + onboarding_port=args.onboarding_port, anticache=args.anticache, anticomp=args.anticomp, @@ -224,8 +109,9 @@ def get_common_options(args): refresh_server_playback=not args.norefresh, server_replay_use_headers=args.server_replay_use_headers, rfile=args.rfile, - replacements=reps, - setheaders=setheaders, + replacements=args.replacements, + replacement_files=args.replacement_files, + setheaders=args.setheaders, server_replay=args.server_replay, scripts=args.scripts, stickycookie=stickycookie, @@ -568,13 +454,13 @@ def proxy_ssl_options(parser): def onboarding_app(parser): group = parser.add_argument_group("Onboarding App") group.add_argument( - "--noapp", - action="store_false", dest="app", + "--no-onboarding", + action="store_false", dest="onboarding", help="Disable the mitmproxy onboarding app." ) group.add_argument( - "--app-host", - action="store", dest="app_host", + "--onboarding-host", + action="store", dest="onboarding_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: @@ -582,9 +468,9 @@ def onboarding_app(parser): """ % options.APP_HOST ) group.add_argument( - "--app-port", + "--onboarding-port", action="store", - dest="app_port", + dest="onboarding_port", type=int, metavar="80", help="Port to serve the onboarding app from." @@ -676,13 +562,13 @@ def replacements(parser): ) group.add_argument( "--replace", - action="append", type=str, dest="replace", + action="append", type=str, dest="replacements", metavar="PATTERN", help="Replacement pattern." ) group.add_argument( "--replace-from-file", - action="append", type=str, dest="replace_file", + action="append", type=str, dest="replacement_files", metavar="PATH", help=""" Replacement pattern, where the replacement clause is a path to a @@ -702,7 +588,7 @@ def set_headers(parser): ) group.add_argument( "--setheader", - action="append", type=str, dest="setheader", + action="append", type=str, dest="setheaders", metavar="PATTERN", help="Header set pattern." ) @@ -762,42 +648,42 @@ def common_options(parser): def mitmproxy(): - # Don't import mitmproxy.tools.console for mitmdump, urwid is not available on all - # platforms. + # Don't import mitmproxy.tools.console for mitmdump, urwid is not available + # on all platforms. from .console import palettes parser = argparse.ArgumentParser(usage="%(prog)s [options]") common_options(parser) parser.add_argument( "--palette", type=str, - action="store", dest="palette", + action="store", dest="console_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", + action="store_true", dest="console_palette_transparent", help="Set transparent background for palette." ) parser.add_argument( "-e", "--eventlog", - action="store_true", dest="eventlog", + action="store_true", dest="console_eventlog", help="Show event log." ) parser.add_argument( "--follow", - action="store_true", dest="focus_follow", + action="store_true", dest="console_focus_follow", help="Focus follows new flows." ) parser.add_argument( "--order", - type=str, dest="order", + type=str, dest="console_order", choices=[o[1] for o in view.orders], help="Flow sort order." ) parser.add_argument( "--no-mouse", - action="store_true", dest="no_mouse", + action="store_true", dest="console_no_mouse", help="Disable mouse interaction." ) group = parser.add_argument_group( @@ -851,24 +737,24 @@ def mitmweb(): group = parser.add_argument_group("Mitmweb") group.add_argument( "--no-browser", - action="store_false", dest="open_browser", + action="store_false", dest="web_open_browser", help="Don't start a browser" ) group.add_argument( - "--wport", - action="store", type=int, dest="wport", + "--web-port", + action="store", type=int, dest="web_port", metavar="PORT", help="Mitmweb port." ) group.add_argument( - "--wiface", - action="store", dest="wiface", + "--web-iface", + action="store", dest="web_iface", metavar="IFACE", help="Mitmweb interface." ) group.add_argument( - "--wdebug", - action="store_true", dest="wdebug", + "--web-debug", + action="store_true", dest="web_debug", help="Turn on mitmweb debugging" ) diff --git a/mitmproxy/tools/console/flowlist.py b/mitmproxy/tools/console/flowlist.py index 1fe0be73..8ee2d55d 100644 --- a/mitmproxy/tools/console/flowlist.py +++ b/mitmproxy/tools/console/flowlist.py @@ -387,7 +387,7 @@ class FlowListBox(urwid.ListBox): lookup = dict([(i[0], i[1]) for i in view.orders]) def change_order(k): - self.master.options.order = lookup[k] + self.master.options.console_order = lookup[k] signals.status_prompt_onekey.send( prompt = "Order", @@ -398,8 +398,8 @@ class FlowListBox(urwid.ListBox): o = self.master.options o.focus_follow = not o.focus_follow elif key == "v": - val = not self.master.options.order_reversed - self.master.options.order_reversed = val + val = not self.master.options.console_order_reversed + self.master.options.console_order_reversed = val elif key == "W": if self.master.options.streamfile: self.master.options.streamfile = None diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py index 8afdce2c..77b48e8d 100644 --- a/mitmproxy/tools/console/master.py +++ b/mitmproxy/tools/console/master.py @@ -33,8 +33,6 @@ from mitmproxy.tools.console import statusbar from mitmproxy.tools.console import window from mitmproxy.utils import strutils -from mitmproxy.net import tcp - EVENTLOG_SIZE = 10000 @@ -108,7 +106,7 @@ class ConsoleMaster(master.Master): self.logbuffer.append(e) if len(self.logbuffer) > EVENTLOG_SIZE: self.logbuffer.pop(0) - if self.options.focus_follow: + if self.options.console_focus_follow: self.logbuffer.set_focus(len(self.logbuffer) - 1) def sig_call_in(self, sender, seconds, callback, args=()): @@ -152,7 +150,7 @@ class ConsoleMaster(master.Master): signals.add_log("Script error: %s" % e, "warn") def toggle_eventlog(self): - self.options.eventlog = not self.options.eventlog + self.options.console_eventlog = not self.options.console_eventlog self.view_flowlist() signals.replace_view_state.send(self) @@ -232,8 +230,8 @@ class ConsoleMaster(master.Master): def set_palette(self, options, updated): self.ui.register_palette( - palettes.palettes[options.palette].palette( - options.palette_transparent + palettes.palettes[options.console_palette].palette( + options.console_palette_transparent ) ) self.ui.clear() @@ -255,7 +253,7 @@ class ConsoleMaster(master.Master): self.loop = urwid.MainLoop( urwid.SolidFill("x"), screen = self.ui, - handle_mouse = not self.options.no_mouse, + handle_mouse = not self.options.console_no_mouse, ) self.ab = statusbar.ActionBar() @@ -273,14 +271,6 @@ class ConsoleMaster(master.Master): sys.exit(1) self.loop.set_alarm_in(0.01, self.ticker) - if self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover - def http2err(*args, **kwargs): - signals.status_message.send( - message = "HTTP/2 disabled - OpenSSL 1.0.2+ required." - " Use --no-http2 to silence this warning.", - expire=5 - ) - self.loop.set_alarm_in(0.01, http2err) self.loop.set_alarm_in( 0.0001, @@ -357,7 +347,7 @@ class ConsoleMaster(master.Master): if self.ui.started: self.ui.clear() - if self.options.eventlog: + if self.options.console_eventlog: body = flowlist.BodyPile(self) else: body = flowlist.FlowListBox(self) diff --git a/mitmproxy/tools/console/options.py b/mitmproxy/tools/console/options.py index 54876f87..4115bd18 100644 --- a/mitmproxy/tools/console/options.py +++ b/mitmproxy/tools/console/options.py @@ -6,6 +6,9 @@ from mitmproxy.tools.console import grideditor from mitmproxy.tools.console import select from mitmproxy.tools.console import signals +from mitmproxy.addons import replace +from mitmproxy.addons import setheaders + footer = [ ('heading_key', "enter/space"), ":toggle ", ('heading_key', "C"), ":clear all ", @@ -75,7 +78,7 @@ class Options(urwid.WidgetWrap): select.Option( "Palette", "P", - checker("palette", master.options), + checker("console_palette", master.options), self.palette ), select.Option( @@ -188,10 +191,16 @@ class Options(urwid.WidgetWrap): ) def setheaders(self): + data = [] + for d in self.master.options.setheaders: + if isinstance(d, str): + data.append(setheaders.parse_setheader(d)) + else: + data.append(d) self.master.view_grideditor( grideditor.SetHeadersEditor( self.master, - self.master.options.setheaders, + data, self.master.options.setter("setheaders") ) ) @@ -215,10 +224,16 @@ class Options(urwid.WidgetWrap): ) def replacepatterns(self): + data = [] + for d in self.master.options.replacements: + if isinstance(d, str): + data.append(replace.parse_hook(d)) + else: + data.append(d) self.master.view_grideditor( grideditor.ReplaceEditor( self.master, - self.master.options.replacements, + data, self.master.options.setter("replacements") ) ) diff --git a/mitmproxy/tools/console/palettepicker.py b/mitmproxy/tools/console/palettepicker.py index 0d943baf..4c5c62a0 100644 --- a/mitmproxy/tools/console/palettepicker.py +++ b/mitmproxy/tools/console/palettepicker.py @@ -42,7 +42,7 @@ class PalettePicker(urwid.WidgetWrap): return select.Option( i, None, - lambda: self.master.options.palette == name, + lambda: self.master.options.console_palette == name, lambda: setattr(self.master.options, "palette", name) ) @@ -58,7 +58,7 @@ class PalettePicker(urwid.WidgetWrap): select.Option( "Transparent", "T", - lambda: master.options.palette_transparent, + lambda: master.options.console_palette_transparent, master.options.toggler("palette_transparent") ) ] diff --git a/mitmproxy/tools/console/statusbar.py b/mitmproxy/tools/console/statusbar.py index 785dc766..2c7f9efb 100644 --- a/mitmproxy/tools/console/statusbar.py +++ b/mitmproxy/tools/console/statusbar.py @@ -204,10 +204,10 @@ class StatusBar(urwid.WidgetWrap): r.append("[") r.append(("heading_key", "M")) r.append(":%s]" % self.master.options.default_contentview) - if self.master.options.order: + if self.master.options.console_order: r.append("[") r.append(("heading_key", "o")) - r.append(":%s]" % self.master.options.order) + r.append(":%s]" % self.master.options.console_order) opts = [] if self.master.options.anticache: @@ -222,7 +222,7 @@ class StatusBar(urwid.WidgetWrap): opts.append("killextra") if self.master.options.no_upstream_cert: opts.append("no-upstream-cert") - if self.master.options.focus_follow: + if self.master.options.console_focus_follow: opts.append("following") if self.master.options.stream_large_bodies: opts.append( @@ -258,7 +258,7 @@ class StatusBar(urwid.WidgetWrap): else: offset = self.master.view.focus.index + 1 - if self.master.options.order_reversed: + if self.master.options.console_order_reversed: arrow = common.SYMBOL_UP else: arrow = common.SYMBOL_DOWN diff --git a/mitmproxy/tools/dump.py b/mitmproxy/tools/dump.py index 4e2844a1..e1e40fb0 100644 --- a/mitmproxy/tools/dump.py +++ b/mitmproxy/tools/dump.py @@ -6,7 +6,6 @@ from mitmproxy import addons from mitmproxy import options from mitmproxy import master from mitmproxy.addons import dumper, termlog -from mitmproxy.net import tcp class DumpError(Exception): @@ -30,7 +29,13 @@ class Options(options.Options): class DumpMaster(master.Master): - def __init__(self, options, server, with_termlog=True, with_dumper=True): + def __init__( + self, + options: Options, + server, + with_termlog=True, + with_dumper=True, + ) -> None: master.Master.__init__(self, options, server) self.has_errored = False if with_termlog: @@ -38,8 +43,6 @@ class DumpMaster(master.Master): self.addons.add(*addons.default_addons()) if with_dumper: self.addons.add(dumper.Dumper()) - # This line is just for type hinting - self.options = self.options # type: Options if not self.options.no_server: self.add_log( @@ -47,13 +50,6 @@ class DumpMaster(master.Master): "info" ) - if self.server and self.options.http2 and not tcp.HAS_ALPN: # pragma: no cover - self.add_log( - "ALPN support missing (OpenSSL 1.0.2+ required)!\n" - "HTTP/2 is disabled. Use --no-http2 to silence this warning.", - "error" - ) - if options.rfile: try: self.load_flows_file(options.rfile) diff --git a/mitmproxy/tools/main.py b/mitmproxy/tools/main.py index 727e993f..ce78cd13 100644 --- a/mitmproxy/tools/main.py +++ b/mitmproxy/tools/main.py @@ -70,14 +70,15 @@ def mitmproxy(args=None): # pragma: no cover console_options.merge(cmdline.get_common_options(args)) console_options.merge( dict( - palette = args.palette, - palette_transparent = args.palette_transparent, - eventlog = args.eventlog, - focus_follow = args.focus_follow, - intercept = args.intercept, + console_palette = args.console_palette, + console_palette_transparent = args.console_palette_transparent, + console_eventlog = args.console_eventlog, + console_focus_follow = args.console_focus_follow, + console_no_mouse = args.console_no_mouse, + console_order = args.console_order, + filter = args.filter, - no_mouse = args.no_mouse, - order = args.order, + intercept = args.intercept, ) ) @@ -149,10 +150,10 @@ def mitmweb(args=None): # pragma: no cover web_options.merge( dict( intercept = args.intercept, - open_browser = args.open_browser, - wdebug = args.wdebug, - wiface = args.wiface, - wport = args.wport, + web_open_browser = args.web_open_browser, + web_debug = args.web_debug, + web_iface = args.web_iface, + web_port = args.web_port, ) ) server = process_options(parser, web_options, args) diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py index e6c15a0a..6ebcfe47 100644 --- a/mitmproxy/tools/web/master.py +++ b/mitmproxy/tools/web/master.py @@ -38,7 +38,7 @@ class WebMaster(master.Master): if with_termlog: self.addons.add(termlog.TermLog()) self.app = app.Application( - self, self.options.wdebug + self, self.options.web_debug ) # This line is just for type hinting self.options = self.options # type: Options @@ -103,7 +103,7 @@ class WebMaster(master.Master): iol = tornado.ioloop.IOLoop.instance() http_server = tornado.httpserver.HTTPServer(self.app) - http_server.listen(self.options.wport, self.options.wiface) + http_server.listen(self.options.web_port, self.options.web_iface) iol.add_callback(self.start) tornado.ioloop.PeriodicCallback(lambda: self.tick(timeout=0), 5).start() @@ -113,13 +113,13 @@ class WebMaster(master.Master): "info" ) - web_url = "http://{}:{}/".format(self.options.wiface, self.options.wport) + web_url = "http://{}:{}/".format(self.options.web_iface, self.options.web_port) self.add_log( "Web server listening at {}".format(web_url), "info" ) - if self.options.open_browser: + if self.options.web_open_browser: success = open_browser(web_url) if not success: self.add_log( |