aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/tools/web/master.py
diff options
context:
space:
mode:
Diffstat (limited to 'mitmproxy/tools/web/master.py')
-rw-r--r--mitmproxy/tools/web/master.py125
1 files changed, 46 insertions, 79 deletions
diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py
index d2203f10..5457fb40 100644
--- a/mitmproxy/tools/web/master.py
+++ b/mitmproxy/tools/web/master.py
@@ -1,49 +1,20 @@
import sys
import webbrowser
+from typing import Optional
import tornado.httpserver
import tornado.ioloop
-
-from typing import Optional
-
from mitmproxy import addons
from mitmproxy import exceptions
-from mitmproxy.addons import view
-from mitmproxy.addons import intercept
-from mitmproxy import options
+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 view
from mitmproxy.tools.web import app
-class Stop(Exception):
- pass
-
-
-class _WebState():
- def add_log(self, e, level):
- # server-side log ids are odd
- self._last_event_id += 2
- entry = {
- "id": self._last_event_id,
- "message": e,
- "level": level
- }
- self.events.append(entry)
- app.ClientConnection.broadcast(
- resource="events",
- cmd="add",
- data=entry
- )
-
- def clear(self):
- super().clear()
- self.events.clear()
- app.ClientConnection.broadcast(
- resource="events",
- cmd="reset"
- )
-
-
class Options(options.Options):
def __init__(
self,
@@ -52,54 +23,34 @@ class Options(options.Options):
wdebug: bool = False,
wport: int = 8081,
wiface: str = "127.0.0.1",
- # wauthenticator: Optional[authentication.PassMan] = None,
- wsingleuser: Optional[str] = None,
- whtpasswd: Optional[str] = None,
**kwargs
) -> None:
+ self.intercept = intercept
self.wdebug = wdebug
self.wport = wport
self.wiface = wiface
- # self.wauthenticator = wauthenticator
- # self.wsingleuser = wsingleuser
- # self.whtpasswd = whtpasswd
- self.intercept = intercept
super().__init__(**kwargs)
- # TODO: This doesn't belong here.
- def process_web_options(self, parser):
- # if self.wsingleuser or self.whtpasswd:
- # if self.wsingleuser:
- # if len(self.wsingleuser.split(':')) != 2:
- # return parser.error(
- # "Invalid single-user specification. Please use the format username:password"
- # )
- # username, password = self.wsingleuser.split(':')
- # # self.wauthenticator = authentication.PassManSingleUser(username, password)
- # elif self.whtpasswd:
- # try:
- # self.wauthenticator = authentication.PassManHtpasswd(self.whtpasswd)
- # except ValueError as v:
- # return parser.error(v.message)
- # else:
- # self.wauthenticator = None
- pass
-
class WebMaster(master.Master):
-
def __init__(self, options, server):
super().__init__(options, server)
self.view = view.View()
- self.view.sig_view_add.connect(self._sig_add)
- self.view.sig_view_remove.connect(self._sig_remove)
- self.view.sig_view_update.connect(self._sig_update)
- self.view.sig_view_refresh.connect(self._sig_refresh)
+ self.view.sig_view_add.connect(self._sig_view_add)
+ self.view.sig_view_remove.connect(self._sig_view_remove)
+ self.view.sig_view_update.connect(self._sig_view_update)
+ self.view.sig_view_refresh.connect(self._sig_view_refresh)
+
+ self.events = eventstore.EventStore()
+ self.events.sig_add.connect(self._sig_events_add)
+ self.events.sig_refresh.connect(self._sig_events_refresh)
+
+ self.options.changed.connect(self._sig_options_update)
self.addons.add(*addons.default_addons())
- self.addons.add(self.view, intercept.Intercept())
+ self.addons.add(self.view, self.events, intercept.Intercept())
self.app = app.Application(
- self, self.options.wdebug, False
+ self, self.options.wdebug
)
# This line is just for type hinting
self.options = self.options # type: Options
@@ -112,33 +63,53 @@ class WebMaster(master.Master):
"error"
)
- def _sig_add(self, view, flow):
+ def _sig_view_add(self, view, flow):
app.ClientConnection.broadcast(
resource="flows",
cmd="add",
- data=app.convert_flow_to_json_dict(flow)
+ data=app.flow_to_json(flow)
)
- def _sig_update(self, view, flow):
+ def _sig_view_update(self, view, flow):
app.ClientConnection.broadcast(
resource="flows",
cmd="update",
- data=app.convert_flow_to_json_dict(flow)
+ data=app.flow_to_json(flow)
)
- def _sig_remove(self, view, flow):
+ def _sig_view_remove(self, view, flow):
app.ClientConnection.broadcast(
resource="flows",
cmd="remove",
data=dict(id=flow.id)
)
- def _sig_refresh(self, view):
+ def _sig_view_refresh(self, view):
app.ClientConnection.broadcast(
resource="flows",
cmd="reset"
)
+ def _sig_events_add(self, event_store, entry: log.LogEntry):
+ app.ClientConnection.broadcast(
+ resource="events",
+ cmd="add",
+ data=app.logentry_to_json(entry)
+ )
+
+ def _sig_events_refresh(self, event_store):
+ app.ClientConnection.broadcast(
+ resource="events",
+ cmd="reset"
+ )
+
+ def _sig_options_update(self, options, updated):
+ app.ClientConnection.broadcast(
+ resource="settings",
+ cmd="update",
+ data={k: getattr(options, k) for k in updated}
+ )
+
def run(self): # pragma: no cover
iol = tornado.ioloop.IOLoop.instance()
@@ -155,13 +126,9 @@ class WebMaster(master.Master):
print("No webbrowser found. Please open a browser and point it to {}".format(url))
iol.start()
- except (Stop, KeyboardInterrupt):
+ except (KeyboardInterrupt):
self.shutdown()
- # def add_log(self, e, level="info"):
- # super().add_log(e, level)
- # return self.state.add_log(e, level)
-
def open_browser(url: str) -> bool:
"""