diff options
Diffstat (limited to 'mitmproxy/tools')
-rw-r--r-- | mitmproxy/tools/web/app.py | 35 | ||||
-rw-r--r-- | mitmproxy/tools/web/master.py | 92 |
2 files changed, 57 insertions, 70 deletions
diff --git a/mitmproxy/tools/web/app.py b/mitmproxy/tools/web/app.py index 41701d36..bbdc2bf9 100644 --- a/mitmproxy/tools/web/app.py +++ b/mitmproxy/tools/web/app.py @@ -116,8 +116,8 @@ class RequestHandler(BasicAuth, tornado.web.RequestHandler): return json.loads(self.request.body.decode()) @property - def state(self): - return self.application.master.state + def view(self): + return self.application.master.view @property def master(self) -> "mitmproxy.tools.web.master.WebMaster": @@ -126,7 +126,8 @@ class RequestHandler(BasicAuth, tornado.web.RequestHandler): @property def flow(self): flow_id = str(self.path_kwargs["flow_id"]) - flow = self.state.flows.get(flow_id) + # FIXME: Add a facility to addon.view to safely access the store + flow = self.view._store.get(flow_id) if flow: return flow else: @@ -184,7 +185,7 @@ class Flows(RequestHandler): def get(self): self.write(dict( - data=[convert_flow_to_json_dict(f) for f in self.state.flows] + data=[convert_flow_to_json_dict(f) for f in self.view] )) @@ -195,31 +196,31 @@ class DumpFlows(RequestHandler): bio = BytesIO() fw = io.FlowWriter(bio) - for f in self.state.flows: + for f in self.view: fw.add(f) self.write(bio.getvalue()) bio.close() def post(self): - self.state.clear() + self.view.clear() content = self.request.files.values()[0][0].body bio = BytesIO(content) - self.state.load_flows(io.FlowReader(bio).stream()) + self.view.load_flows(io.FlowReader(bio).stream()) bio.close() class ClearAll(RequestHandler): def post(self): - self.state.clear() + self.view.clear() class AcceptFlows(RequestHandler): def post(self): - self.state.flows.accept_all(self.master) + self.view.flows.accept_all(self.master) class AcceptFlow(RequestHandler): @@ -233,7 +234,7 @@ class FlowHandler(RequestHandler): def delete(self, flow_id): if self.flow.killable: self.flow.kill(self.master) - self.state.delete_flow(self.flow) + self.view.delete_flow(self.flow) def put(self, flow_id): flow = self.flow @@ -270,19 +271,19 @@ class FlowHandler(RequestHandler): print("Warning: Unknown update {}.{}: {}".format(a, k, v)) else: print("Warning: Unknown update {}: {}".format(a, b)) - self.state.update_flow(flow) + self.view.update_flow(flow) class DuplicateFlow(RequestHandler): def post(self, flow_id): - self.master.state.duplicate_flow(self.flow) + self.master.view.duplicate_flow(self.flow) class RevertFlow(RequestHandler): def post(self, flow_id): - self.state.revert(self.flow) + self.flow.revert() class ReplayFlow(RequestHandler): @@ -290,7 +291,7 @@ class ReplayFlow(RequestHandler): def post(self, flow_id): self.flow.backup() self.flow.response = None - self.state.update_flow(self.flow) + self.view.update_flow(self.flow) r = self.master.replay_request(self.flow) if r: @@ -303,7 +304,7 @@ class FlowContent(RequestHandler): self.flow.backup() message = getattr(self.flow, message) message.content = self.request.files.values()[0][0].body - self.state.update_flow(self.flow) + self.view.update_flow(self.flow) def get(self, flow_id, message): message = getattr(self.flow, message) @@ -340,7 +341,7 @@ class FlowContentView(RequestHandler): message = getattr(self.flow, message) description, lines, error = contentviews.get_message_content_view( - contentviews.get(content_view.replace('_', ' ')), message + contentviews.get(content_view.replace('_', ' ')).name, message ) # if error: # add event log @@ -355,7 +356,7 @@ class Events(RequestHandler): def get(self): self.write(dict( - data=list(self.state.events) + data=list([]) )) diff --git a/mitmproxy/tools/web/master.py b/mitmproxy/tools/web/master.py index cf0bfd73..0922733d 100644 --- a/mitmproxy/tools/web/master.py +++ b/mitmproxy/tools/web/master.py @@ -8,7 +8,7 @@ from typing import Optional from mitmproxy import addons from mitmproxy import exceptions -from mitmproxy.addons import state +from mitmproxy.addons import view from mitmproxy.addons import intercept from mitmproxy import options from mitmproxy import master @@ -20,53 +20,7 @@ class Stop(Exception): pass -class WebFlowView(state.FlowView): - - def __init__(self, store): - super().__init__(store, None) - - def _add(self, f): - super()._add(f) - app.ClientConnection.broadcast( - type="UPDATE_FLOWS", - cmd="add", - data=app.convert_flow_to_json_dict(f) - ) - - def _update(self, f): - super()._update(f) - app.ClientConnection.broadcast( - type="UPDATE_FLOWS", - cmd="update", - data=app.convert_flow_to_json_dict(f) - ) - - def _remove(self, f): - super()._remove(f) - app.ClientConnection.broadcast( - type="UPDATE_FLOWS", - cmd="remove", - data=dict(id=f.id) - ) - - def _recalculate(self, flows): - super()._recalculate(flows) - app.ClientConnection.broadcast( - type="UPDATE_FLOWS", - cmd="reset" - ) - - -class WebState(state.State): - - def __init__(self): - super().__init__() - self.view._close() - self.view = WebFlowView(self.flows) - - self._last_event_id = 0 - self.events = collections.deque(maxlen=1000) - +class _WebState(): def add_log(self, e, level): self._last_event_id += 1 entry = { @@ -136,9 +90,14 @@ class WebMaster(master.Master): def __init__(self, options, server): super().__init__(options, server) - self.state = WebState() + self.view = view.View() + self.view.sig_add.connect(self._sig_add) + self.view.sig_remove.connect(self._sig_remove) + self.view.sig_update.connect(self._sig_update) + self.view.sig_refresh.connect(self._sig_refresh) + self.addons.add(*addons.default_addons()) - self.addons.add(self.state, intercept.Intercept()) + self.addons.add(self.view, intercept.Intercept()) self.app = app.Application( self, self.options.wdebug, self.options.wauthenticator ) @@ -162,6 +121,33 @@ class WebMaster(master.Master): print("Stream file error: {}".format(err), file=sys.stderr) sys.exit(1) + def _sig_add(self, view, flow): + app.ClientConnection.broadcast( + type="UPDATE_FLOWS", + cmd="add", + data=app.convert_flow_to_json_dict(flow) + ) + + def _sig_update(self, view, flow): + app.ClientConnection.broadcast( + type="UPDATE_FLOWS", + cmd="update", + data=app.convert_flow_to_json_dict(flow) + ) + + def _sig_remove(self, view, flow): + app.ClientConnection.broadcast( + type="UPDATE_FLOWS", + cmd="remove", + data=dict(id=flow.id) + ) + + def _sig_refresh(self, view): + app.ClientConnection.broadcast( + type="UPDATE_FLOWS", + cmd="reset" + ) + def run(self): # pragma: no cover iol = tornado.ioloop.IOLoop.instance() @@ -178,6 +164,6 @@ class WebMaster(master.Master): except (Stop, KeyboardInterrupt): self.shutdown() - def add_log(self, e, level="info"): - super().add_log(e, level) - return self.state.add_log(e, level) + # def add_log(self, e, level="info"): + # super().add_log(e, level) + # return self.state.add_log(e, level) |