From d3feaa3bc6e2d9c2c7ee8286038c69c0b9601869 Mon Sep 17 00:00:00 2001 From: Chris Czub Date: Mon, 9 Nov 2015 15:07:58 -0500 Subject: Add custom content view plugin support for mitmproxy/mitmdump --- libmproxy/flow.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- libmproxy/script.py | 7 +++++++ 2 files changed, 52 insertions(+), 1 deletion(-) (limited to 'libmproxy') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 55a4dbcf..5acbebf2 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -9,7 +9,7 @@ import cookielib import os import re import urlparse - +import inspect from netlib import wsgi from netlib.exceptions import HttpException @@ -21,6 +21,11 @@ from .proxy.config import HostMatcher from .protocol.http_replay import RequestReplayThread from .protocol import Kill from .models import ClientConnection, ServerConnection, HTTPResponse, HTTPFlow, HTTPRequest +from . import contentviews as cv + + +class PluginError(Exception): + pass class AppRegistry: @@ -614,6 +619,43 @@ class State(object): self.flows.kill_all(master) +class Plugins(object): + def __init__(self): + self._view_plugins = {} + + def __iter__(self): + for plugin_type in ('view_plugins',): + yield (plugin_type, getattr(self, '_' + plugin_type)) + + def __getitem__(self, key): + if key in ('view_plugins',): + return getattr(self, '_' + key) + else: + return None + + def register_view(self, id, **kwargs): + if self._view_plugins.get(id): + raise PluginError("Duplicate view registration for %s" % (id, )) + + if not kwargs.get('class_ref') or not \ + callable(kwargs['class_ref']) or not \ + isinstance(kwargs['class_ref'], type): + raise PluginError("No custom content view class passed for view %s" % (id, )) + + script_path = inspect.stack()[1][1] + + view_plugin = { + 'title': kwargs.get('title') or id, + 'class_ref': kwargs['class_ref'], + 'script_path': script_path, + } + self._view_plugins[id] = view_plugin + + cv.add(kwargs['class_ref']()) + + print("Registered view plugin %s from script %s" % (kwargs['title'], script_path)) + + class FlowMaster(controller.Master): def __init__(self, server, state): controller.Master.__init__(self, server) @@ -643,6 +685,8 @@ class FlowMaster(controller.Master): self.stream = None self.apps = AppRegistry() + self.plugins = Plugins() + def start_app(self, host, port): self.apps.add( app.mapp, diff --git a/libmproxy/script.py b/libmproxy/script.py index 9d051c12..f11c5cd8 100644 --- a/libmproxy/script.py +++ b/libmproxy/script.py @@ -56,6 +56,13 @@ class ScriptContext: def app_registry(self): return self._master.apps + @property + def plugins(self): + if hasattr(self._master, 'plugins'): + return self._master.plugins + + return None + class Script: """ -- cgit v1.2.3