From d2475e6a146534b5e7aaf2cc7b0b9a75e418415e Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Sat, 13 Sep 2014 23:05:12 +0200 Subject: web: start gui --- web/src/js/certinstall.jsx | 27 ----------- web/src/js/datastructures.js | 101 ++++++++++++++++++++++++++++++++++++++++++ web/src/js/footer.react.js | 12 +++++ web/src/js/header.react.js | 73 ++++++++++++++++++++++++++++++ web/src/js/mitmproxy.js | 10 ----- web/src/js/mitmproxy.react.js | 60 +++++++++++++++++++++++++ web/src/js/router.jsx | 10 ----- 7 files changed, 246 insertions(+), 47 deletions(-) delete mode 100644 web/src/js/certinstall.jsx create mode 100644 web/src/js/datastructures.js create mode 100644 web/src/js/footer.react.js create mode 100644 web/src/js/header.react.js delete mode 100644 web/src/js/mitmproxy.js create mode 100644 web/src/js/mitmproxy.react.js delete mode 100644 web/src/js/router.jsx (limited to 'web/src/js') diff --git a/web/src/js/certinstall.jsx b/web/src/js/certinstall.jsx deleted file mode 100644 index 2e681ac2..00000000 --- a/web/src/js/certinstall.jsx +++ /dev/null @@ -1,27 +0,0 @@ -/** @jsx React.DOM */ - -var CertInstallView = React.createClass({ - render: function () { - return
-

Click to install the mitmproxy certificate:

-
-
- -

Apple

-
-
- -

Windows

-
-
- -

Android

-
-
- -

Other

-
-
-
; - } -}); diff --git a/web/src/js/datastructures.js b/web/src/js/datastructures.js new file mode 100644 index 00000000..59f64e66 --- /dev/null +++ b/web/src/js/datastructures.js @@ -0,0 +1,101 @@ +class EventEmitter { + constructor(){ + this._listeners = {}; + } + emit(event){ + if(!(event in this._listeners)){ + return; + } + this._listeners[event].forEach(function (listener) { + listener(event, this); + }.bind(this)); + } + addListener(event, f){ + this._listeners[event] = this._listeners[event] || []; + this._listeners[event].push(f); + } + removeListener(event, f){ + if(!(event in this._listeners)){ + return false; + } + var index = this._listeners.indexOf(f); + if (index >= 0) { + this._listeners.splice(this._listeners.indexOf(f), 1); + } + } +} + +var FLOW_CHANGED = "flow.changed"; + +class FlowStore extends EventEmitter{ + constructor() { + super(); + this.flows = []; + this._listeners = []; + } + + getAll() { + return this.flows; + } + + emitChange() { + return this.emit(FLOW_CHANGED); + } + + addChangeListener(f) { + this.addListener(FLOW_CHANGED, f); + } + + removeChangeListener(f) { + this.removeListener(FLOW_CHANGED, f); + } +} + +class DummyFlowStore extends FlowStore { + constructor(flows) { + super(); + this.flows = flows; + } + + addFlow(f) { + this.flows.push(f); + this.emitChange(); + } +} + + +SETTINGS_CHANGED = "settings.change"; + +class Settings extends EventEmitter { + constructor(){ + super(); + this.settings = false; + } + + getAll(){ + return this.settings; + } + + emitChange() { + return this.emit(SETTINGS_CHANGED); + } + + addChangeListener(f) { + this.addListener(SETTINGS_CHANGED, f); + } + + removeChangeListener(f) { + this.removeListener(SETTINGS_CHANGED, f); + } +} + +class DummySettings extends Settings { + constructor(settings){ + super(); + this.settings = settings; + } + update(obj){ + _.merge(this.settings, obj); + this.emitChange(); + } +} \ No newline at end of file diff --git a/web/src/js/footer.react.js b/web/src/js/footer.react.js new file mode 100644 index 00000000..96506e85 --- /dev/null +++ b/web/src/js/footer.react.js @@ -0,0 +1,12 @@ +/** @jsx React.DOM */ + +var Footer = React.createClass({ + render : function(){ + var style = { + textAlign: "center" + }; + return (); + } +}); \ No newline at end of file diff --git a/web/src/js/header.react.js b/web/src/js/header.react.js new file mode 100644 index 00000000..b204eeb8 --- /dev/null +++ b/web/src/js/header.react.js @@ -0,0 +1,73 @@ +/** @jsx React.DOM */ + +var MainMenu = React.createClass({ + render : function(){ + return (
Main Menu
); + } +}); +var ToolsMenu = React.createClass({ + render : function(){ + return (
Tools Menu
); + } +}); +var ReportsMenu = React.createClass({ + render : function(){ + return (
Reports Menu
); + } +}); + +var _Header_Entries = { + main: { + title: "Traffic", + route: "main", + menu: MainMenu + }, + tools: { + title: "Tools", + route: "main", + menu: ToolsMenu + }, + reports: { + title: "Visualization", + route: "reports", + menu: ReportsMenu + } +}; + +var Header = React.createClass({ + getInitialState: function(){ + return {active: "main"}; + }, + handleClick: function(active){ + this.setState({active: active}); + ReactRouter.transitionTo(_Header_Entries[active].route); + return false; + }, + handleFileClick: function(){ + console.log("File click"); + }, + render: function(){ + + var header = []; + for(var item in _Header_Entries){ + var classes = this.state.active == item ? "active" : ""; + header.push({ _Header_Entries[item].title }); + } + + var menu = _Header_Entries[this.state.active].menu(); + return ( +
+
+ mitmproxy { this.props.settings.version } +
+ +
+ { menu } +
+
); + } +}); \ No newline at end of file diff --git a/web/src/js/mitmproxy.js b/web/src/js/mitmproxy.js deleted file mode 100644 index a8e55065..00000000 --- a/web/src/js/mitmproxy.js +++ /dev/null @@ -1,10 +0,0 @@ - -mitmproxy = function () { - function init() { - React.renderComponent(Router(), $("#mitmproxy")[0]); - } - var exports = { - init: init, - }; - return exports; -}(); diff --git a/web/src/js/mitmproxy.react.js b/web/src/js/mitmproxy.react.js new file mode 100644 index 00000000..2a2ee910 --- /dev/null +++ b/web/src/js/mitmproxy.react.js @@ -0,0 +1,60 @@ +/** @jsx React.DOM */ + +var App = React.createClass({ + getInitialState: function () { + return { + settings: {} //TODO: How explicit should we get here? + //List all subattributes? + }; + }, + componentDidMount: function () { + //TODO: Replace DummyStore with real settings over WS (https://facebook.github.io/react/tips/initial-ajax.html) + //TODO: Is there a sensible place where we can store this? + var settings = new DummySettings({ + version: "0.12" + }); + settings.addChangeListener(this._onSettingsChange); + + //This would be async in some way or another. + this._onSettingsChange(null, settings); + }, + _onSettingsChange: function(event, settings){ + this.setState({settings: settings.getAll()}); + }, + render: function () { + return ( +
+
+
+ +
+
+
+ ); + } +}); + +var Traffic = React.createClass({ + render: function(){ + var json = JSON.stringify(this.props, null, 4); + var i = 5; + while(i--) json += json; + return (
{json}
); + } +}); + +var Reports = React.createClass({ + render: function(){ + return (
Report Editor
); + } +}); + +var routes = ( + + + + + + + +); \ No newline at end of file diff --git a/web/src/js/router.jsx b/web/src/js/router.jsx deleted file mode 100644 index dc3e729b..00000000 --- a/web/src/js/router.jsx +++ /dev/null @@ -1,10 +0,0 @@ -/** @jsx React.DOM */ - -var Router = React.createClass({ - render: function(){ - return - - - ; - } -}); -- cgit v1.2.3