Force or replace local site theme on *.googlesource.com
Sample usage: ~/mitm-gerrit/mitm-theme.sh ./path/to/theme.html Change-Id: I9c445d5c8354952771d73b1de0a29626787c8634
This commit is contained in:
@@ -36,6 +36,17 @@ This flow assumes no additional .html/.js are needed, i.e. the plugin is a singl
|
|||||||
2. Open any *.googlesource.com domain in proxied window
|
2. Open any *.googlesource.com domain in proxied window
|
||||||
3. plugin.html and more.js are served
|
3. plugin.html and more.js are served
|
||||||
|
|
||||||
|
### Force or replace default site theme for *.googlesource.com
|
||||||
|
|
||||||
|
1. Create a new proxied browser window and start mitmproxy via Docker:
|
||||||
|
```
|
||||||
|
~/mitm-gerrit/mitm-theme.sh ./path/to/theme.html
|
||||||
|
```
|
||||||
|
2. Open any *.googlesource.com domain in proxied window
|
||||||
|
3. Default site themes are enabled.
|
||||||
|
4. Local `theme.html` content replaces `/static/gerrit-theme.html`
|
||||||
|
5. `/static/*` URLs are served from local theme directory, i.e. `./path/to/`
|
||||||
|
|
||||||
### Serve uncompiled PolyGerrit
|
### Serve uncompiled PolyGerrit
|
||||||
|
|
||||||
1. Create a new proxied browser window and start mitmproxy via Docker:
|
1. Create a new proxied browser window and start mitmproxy via Docker:
|
||||||
|
31
contrib/mitm-ui/mitm-theme.sh
Executable file
31
contrib/mitm-ui/mitm-theme.sh
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [[ -z "$1" ]]; then
|
||||||
|
echo This script forces or replaces default site theme on *.googlesource.com
|
||||||
|
echo Provide path to the theme.html as a parameter.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
realpath() {
|
||||||
|
OURPWD=$PWD
|
||||||
|
cd "$(dirname "$1")"
|
||||||
|
LINK=$(basename "$1")
|
||||||
|
while [ -L "$LINK" ]; do
|
||||||
|
LINK=$(readlink "$LINK")
|
||||||
|
cd "$(dirname "$LINK")"
|
||||||
|
LINK="$(basename "$1")"
|
||||||
|
done
|
||||||
|
REAL_DIR=`pwd -P`
|
||||||
|
RESULT=$REAL_DIR/$LINK
|
||||||
|
cd "$OURPWD"
|
||||||
|
echo "$RESULT"
|
||||||
|
}
|
||||||
|
|
||||||
|
theme=$(realpath "$1")
|
||||||
|
theme_dir=$(dirname "${theme}")
|
||||||
|
|
||||||
|
mitm_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
|
||||||
|
|
||||||
|
"${mitm_dir}"/dev-chrome.sh &
|
||||||
|
|
||||||
|
"${mitm_dir}"/mitm-docker.sh -v "${theme_dir}":"${theme_dir}" "serve-app-dev.py --strip_assets --theme \"${theme}\""
|
@@ -32,9 +32,10 @@ import re
|
|||||||
import argparse
|
import argparse
|
||||||
import os.path
|
import os.path
|
||||||
import json
|
import json
|
||||||
|
import mimetypes
|
||||||
|
|
||||||
class Server:
|
class Server:
|
||||||
def __init__(self, devpath, plugins, pluginroot, assets, strip_assets):
|
def __init__(self, devpath, plugins, pluginroot, assets, strip_assets, theme):
|
||||||
if devpath:
|
if devpath:
|
||||||
print("Serving app from " + devpath)
|
print("Serving app from " + devpath)
|
||||||
if pluginroot:
|
if pluginroot:
|
||||||
@@ -53,6 +54,7 @@ class Server:
|
|||||||
self.devpath = devpath
|
self.devpath = devpath
|
||||||
self.pluginroot = pluginroot
|
self.pluginroot = pluginroot
|
||||||
self.strip_assets = strip_assets
|
self.strip_assets = strip_assets
|
||||||
|
self.theme = theme
|
||||||
|
|
||||||
def readfile(self, path):
|
def readfile(self, path):
|
||||||
with open(path, 'rb') as contentfile:
|
with open(path, 'rb') as contentfile:
|
||||||
@@ -92,6 +94,8 @@ def response(flow: http.HTTPFlow) -> None:
|
|||||||
localfile = ""
|
localfile = ""
|
||||||
if flow.request.path == "/config/server/info":
|
if flow.request.path == "/config/server/info":
|
||||||
config = json.loads(flow.response.content[5:].decode('utf8'))
|
config = json.loads(flow.response.content[5:].decode('utf8'))
|
||||||
|
if server.theme:
|
||||||
|
config['default_theme'] = '/static/gerrit-theme.html'
|
||||||
for filename, path in server.plugins.items():
|
for filename, path in server.plugins.items():
|
||||||
pluginname = filename.split(".")[0]
|
pluginname = filename.split(".")[0]
|
||||||
payload = config["plugin"]["js_resource_paths" if filename.endswith(".js") else "html_resource_paths"]
|
payload = config["plugin"]["js_resource_paths" if filename.endswith(".js") else "html_resource_paths"]
|
||||||
@@ -115,13 +119,23 @@ def response(flow: http.HTTPFlow) -> None:
|
|||||||
localfile = server.pluginroot + pluginfile
|
localfile = server.pluginroot + pluginfile
|
||||||
elif os.path.isfile(server.pluginroot + pluginurl):
|
elif os.path.isfile(server.pluginroot + pluginurl):
|
||||||
localfile = server.pluginroot + pluginurl
|
localfile = server.pluginroot + pluginurl
|
||||||
|
|
||||||
|
if server.theme:
|
||||||
|
if flow.request.path.endswith('/gerrit-theme.html'):
|
||||||
|
localfile = server.theme
|
||||||
|
else:
|
||||||
|
match = re.match("^/static(/[\w\.]+)$", flow.request.path)
|
||||||
|
if match is not None:
|
||||||
|
localfile = os.path.dirname(server.theme) + match.group(1)
|
||||||
|
|
||||||
if localfile and os.path.isfile(localfile):
|
if localfile and os.path.isfile(localfile):
|
||||||
if pluginmatch is not None:
|
if pluginmatch is not None:
|
||||||
print("Serving " + flow.request.path + " from " + localfile)
|
print("Serving " + flow.request.path + " from " + localfile)
|
||||||
flow.response.content = server.readfile(localfile)
|
flow.response.content = server.readfile(localfile)
|
||||||
flow.response.status_code = 200
|
flow.response.status_code = 200
|
||||||
if localfile.endswith('.js'):
|
localtype = mimetypes.guess_type(localfile)
|
||||||
flow.response.headers['Content-type'] = 'text/javascript'
|
if localtype and localtype[0]:
|
||||||
|
flow.response.headers['Content-type'] = localtype[0]
|
||||||
|
|
||||||
def expandpath(path):
|
def expandpath(path):
|
||||||
return os.path.realpath(os.path.expanduser(path))
|
return os.path.realpath(os.path.expanduser(path))
|
||||||
@@ -132,8 +146,11 @@ parser.add_argument("--plugins", type=str, default="", help="Comma-separated lis
|
|||||||
parser.add_argument("--plugin_root", type=str, default="", help="Path containing individual plugin files to replace")
|
parser.add_argument("--plugin_root", type=str, default="", help="Path containing individual plugin files to replace")
|
||||||
parser.add_argument("--assets", type=str, default="", help="Path containing assets file to import.")
|
parser.add_argument("--assets", type=str, default="", help="Path containing assets file to import.")
|
||||||
parser.add_argument("--strip_assets", action="store_true", help="Strip plugin bundles from the response.")
|
parser.add_argument("--strip_assets", action="store_true", help="Strip plugin bundles from the response.")
|
||||||
|
parser.add_argument("--theme", type=str, help="Path to the default site theme to be used.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
server = Server(expandpath(args.app) + '/',
|
server = Server(expandpath(args.app) + '/',
|
||||||
args.plugins, expandpath(args.plugin_root) + '/',
|
args.plugins,
|
||||||
|
expandpath(args.plugin_root) + '/',
|
||||||
args.assets and expandpath(args.assets),
|
args.assets and expandpath(args.assets),
|
||||||
args.strip_assets)
|
args.strip_assets,
|
||||||
|
expandpath(args.theme))
|
||||||
|
Reference in New Issue
Block a user