mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-27 02:24:18 +00:00
console: basic options page
This commit is contained in:
parent
fe6957eddb
commit
65971f02ad
@ -15,7 +15,7 @@ import urwid
|
|||||||
import weakref
|
import weakref
|
||||||
|
|
||||||
from .. import controller, flow, script
|
from .. import controller, flow, script
|
||||||
from . import flowlist, flowview, help, window, signals
|
from . import flowlist, flowview, help, window, signals, options
|
||||||
from . import grideditor, palettes, contentview, statusbar
|
from . import grideditor, palettes, contentview, statusbar
|
||||||
|
|
||||||
EVENTLOG_SIZE = 500
|
EVENTLOG_SIZE = 500
|
||||||
@ -465,6 +465,16 @@ class ConsoleMaster(flow.FlowMaster):
|
|||||||
None
|
None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def view_options(self):
|
||||||
|
signals.push_view_state.send(self)
|
||||||
|
self.loop.widget = window.Window(
|
||||||
|
self,
|
||||||
|
options.Options(self),
|
||||||
|
None,
|
||||||
|
statusbar.StatusBar(self, help.footer),
|
||||||
|
None
|
||||||
|
)
|
||||||
|
|
||||||
def view_grideditor(self, ge):
|
def view_grideditor(self, ge):
|
||||||
signals.push_view_state.send(self)
|
signals.push_view_state.send(self)
|
||||||
self.loop.widget = window.Window(
|
self.loop.widget = window.Window(
|
||||||
@ -586,24 +596,6 @@ class ConsoleMaster(flow.FlowMaster):
|
|||||||
if a != "n":
|
if a != "n":
|
||||||
raise urwid.ExitMainLoop
|
raise urwid.ExitMainLoop
|
||||||
|
|
||||||
def _change_options(self, a):
|
|
||||||
if a == "a":
|
|
||||||
self.anticache = not self.anticache
|
|
||||||
if a == "c":
|
|
||||||
self.anticomp = not self.anticomp
|
|
||||||
if a == "h":
|
|
||||||
self.showhost = not self.showhost
|
|
||||||
self.sync_list_view()
|
|
||||||
self.refresh_focus()
|
|
||||||
elif a == "k":
|
|
||||||
self.killextra = not self.killextra
|
|
||||||
elif a == "n":
|
|
||||||
self.refresh_server_playback = not self.refresh_server_playback
|
|
||||||
elif a == "u":
|
|
||||||
self.server.config.no_upstream_cert =\
|
|
||||||
not self.server.config.no_upstream_cert
|
|
||||||
signals.update_settings.send(self)
|
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.state.killall(self)
|
self.state.killall(self)
|
||||||
flow.FlowMaster.shutdown(self)
|
flow.FlowMaster.shutdown(self)
|
||||||
|
151
libmproxy/console/options.py
Normal file
151
libmproxy/console/options.py
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
import urwid
|
||||||
|
|
||||||
|
from . import common, signals
|
||||||
|
|
||||||
|
help_context = None
|
||||||
|
|
||||||
|
|
||||||
|
class OptionWidget(urwid.WidgetWrap):
|
||||||
|
def __init__(self, option, text, active, focus):
|
||||||
|
self.option = option
|
||||||
|
opt = urwid.Text(text, align="center")
|
||||||
|
if focus and active:
|
||||||
|
opt = urwid.AttrWrap(opt, "option_active_selected")
|
||||||
|
elif focus:
|
||||||
|
opt = urwid.AttrWrap(opt, "option_selected")
|
||||||
|
elif active:
|
||||||
|
opt = urwid.AttrWrap(opt, "option_active")
|
||||||
|
opt = urwid.Padding(opt, align="center", width=("relative", 20))
|
||||||
|
urwid.WidgetWrap.__init__(self, opt)
|
||||||
|
|
||||||
|
def keypress(self, size, key):
|
||||||
|
return key
|
||||||
|
|
||||||
|
def selectable(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class OptionWalker(urwid.ListWalker):
|
||||||
|
def __init__(self, options):
|
||||||
|
urwid.ListWalker.__init__(self)
|
||||||
|
self.options = options
|
||||||
|
self.focus = 0
|
||||||
|
signals.update_settings.connect(self.sig_update_settings)
|
||||||
|
|
||||||
|
def sig_update_settings(self, sender):
|
||||||
|
self._modified()
|
||||||
|
|
||||||
|
def set_focus(self, pos):
|
||||||
|
self.focus = pos
|
||||||
|
|
||||||
|
def get_focus(self):
|
||||||
|
return self.options[self.focus].render(True), self.focus
|
||||||
|
|
||||||
|
def get_next(self, pos):
|
||||||
|
if pos >= len(self.options)-1:
|
||||||
|
return None, None
|
||||||
|
return self.options[pos+1].render(False), pos+1
|
||||||
|
|
||||||
|
def get_prev(self, pos):
|
||||||
|
if pos <= 0:
|
||||||
|
return None, None
|
||||||
|
return self.options[pos-1].render(False), pos-1
|
||||||
|
|
||||||
|
|
||||||
|
class OptionListBox(urwid.ListBox):
|
||||||
|
def __init__(self, options):
|
||||||
|
urwid.ListBox.__init__(
|
||||||
|
self,
|
||||||
|
OptionWalker(options)
|
||||||
|
)
|
||||||
|
|
||||||
|
def keypress(self, size, key):
|
||||||
|
key = common.shortcuts(key)
|
||||||
|
if key == "enter":
|
||||||
|
self.get_focus()[0].option.ativate()
|
||||||
|
return None
|
||||||
|
return super(self.__class__, self).keypress(size, key)
|
||||||
|
|
||||||
|
|
||||||
|
_neg = lambda: False
|
||||||
|
class Option:
|
||||||
|
def __init__(self, text, getstate=None, ativate=None):
|
||||||
|
self.text = text
|
||||||
|
self.getstate = getstate or _neg
|
||||||
|
self.ativate = ativate or _neg
|
||||||
|
|
||||||
|
def render(self, focus):
|
||||||
|
return OptionWidget(self, self.text, self.getstate(), focus)
|
||||||
|
|
||||||
|
|
||||||
|
class Options(urwid.WidgetWrap):
|
||||||
|
def __init__(self, master):
|
||||||
|
self.master = master
|
||||||
|
self.lb = OptionListBox(
|
||||||
|
[
|
||||||
|
Option(
|
||||||
|
"Anti-Cache",
|
||||||
|
lambda: master.anticache,
|
||||||
|
self.toggle_anticache
|
||||||
|
),
|
||||||
|
Option(
|
||||||
|
"Anti-Compression",
|
||||||
|
lambda: master.anticomp,
|
||||||
|
self.toggle_anticomp
|
||||||
|
),
|
||||||
|
#Option("Header Set Patterns"),
|
||||||
|
#Option("Ignore Patterns"),
|
||||||
|
Option(
|
||||||
|
"Kill Extra",
|
||||||
|
lambda: master.killextra,
|
||||||
|
self.toggle_killextra
|
||||||
|
),
|
||||||
|
#Option("Manage Scripts"),
|
||||||
|
#Option("Replacement Patterns"),
|
||||||
|
Option(
|
||||||
|
"Show Host",
|
||||||
|
lambda: master.showhost,
|
||||||
|
self.toggle_showhost
|
||||||
|
),
|
||||||
|
#Option("Sticky Cookies"),
|
||||||
|
#Option("Sticky Auth"),
|
||||||
|
#Option("TCP Proxying"),
|
||||||
|
Option(
|
||||||
|
"No Refresh",
|
||||||
|
lambda: not master.refresh_server_playback,
|
||||||
|
self.toggle_refresh_server_playback
|
||||||
|
),
|
||||||
|
Option(
|
||||||
|
"No Upstream Certs",
|
||||||
|
lambda: master.server.config.no_upstream_cert,
|
||||||
|
self.toggle_upstream_cert
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
title = urwid.Text("Options")
|
||||||
|
title = urwid.Padding(title, align="left", width=("relative", 100))
|
||||||
|
title = urwid.AttrWrap(title, "heading")
|
||||||
|
self._w = urwid.Frame(
|
||||||
|
self.lb,
|
||||||
|
header = title
|
||||||
|
)
|
||||||
|
self.master.loop.widget.footer.update("")
|
||||||
|
|
||||||
|
def toggle_anticache(self):
|
||||||
|
self.master.anticache = not self.master.anticache
|
||||||
|
|
||||||
|
def toggle_anticomp(self):
|
||||||
|
self.master.anticomp = not self.master.anticomp
|
||||||
|
|
||||||
|
def toggle_killextra(self):
|
||||||
|
self.master.killextra = not self.master.killextra
|
||||||
|
|
||||||
|
def toggle_showhost(self):
|
||||||
|
self.master.showhost = not self.master.showhost
|
||||||
|
|
||||||
|
def toggle_refresh_server_playback(self):
|
||||||
|
self.master.refresh_server_playback = not self.master.refresh_server_playback
|
||||||
|
|
||||||
|
def toggle_upstream_cert(self):
|
||||||
|
self.master.server.config.no_upstream_cert = not self.master.server.config.no_upstream_cert
|
||||||
|
signals.update_settings.send(self)
|
@ -17,6 +17,9 @@ class Palette:
|
|||||||
# Help
|
# Help
|
||||||
'key', 'head', 'text',
|
'key', 'head', 'text',
|
||||||
|
|
||||||
|
# Options
|
||||||
|
'option_selected', 'option_active', 'option_active_selected',
|
||||||
|
|
||||||
# List and Connections
|
# List and Connections
|
||||||
'method', 'focus',
|
'method', 'focus',
|
||||||
'code_200', 'code_300', 'code_400', 'code_500', 'code_other',
|
'code_200', 'code_300', 'code_400', 'code_500', 'code_other',
|
||||||
@ -60,6 +63,9 @@ class LowDark(Palette):
|
|||||||
head = ('white,bold', 'default'),
|
head = ('white,bold', 'default'),
|
||||||
text = ('light gray', 'default'),
|
text = ('light gray', 'default'),
|
||||||
|
|
||||||
|
# Options
|
||||||
|
option_selected = ('light gray', 'dark blue'),
|
||||||
|
|
||||||
# List and Connections
|
# List and Connections
|
||||||
method = ('dark cyan', 'default'),
|
method = ('dark cyan', 'default'),
|
||||||
focus = ('yellow', 'default'),
|
focus = ('yellow', 'default'),
|
||||||
@ -112,6 +118,11 @@ class LowLight(Palette):
|
|||||||
head = ('black,bold', 'default'),
|
head = ('black,bold', 'default'),
|
||||||
text = ('dark gray', 'default'),
|
text = ('dark gray', 'default'),
|
||||||
|
|
||||||
|
# Options
|
||||||
|
option_selected = ('light gray', 'dark blue'),
|
||||||
|
option_active = ('light red', 'default'),
|
||||||
|
option_active_selected = ('light red', 'dark blue'),
|
||||||
|
|
||||||
# List and Connections
|
# List and Connections
|
||||||
method = ('dark cyan', 'default'),
|
method = ('dark cyan', 'default'),
|
||||||
focus = ('black', 'default'),
|
focus = ('black', 'default'),
|
||||||
@ -181,6 +192,11 @@ class SolarizedLight(LowLight):
|
|||||||
key = (sol_blue, 'default',),
|
key = (sol_blue, 'default',),
|
||||||
head = (sol_base00, 'default'),
|
head = (sol_base00, 'default'),
|
||||||
|
|
||||||
|
# Options
|
||||||
|
option_selected = (sol_base2, sol_base02),
|
||||||
|
option_active = (sol_orange, 'default'),
|
||||||
|
option_active_selected = (sol_orange, sol_base02),
|
||||||
|
|
||||||
# List and Connections
|
# List and Connections
|
||||||
method = (sol_cyan, 'default'),
|
method = (sol_cyan, 'default'),
|
||||||
focus = (sol_base01, 'default'),
|
focus = (sol_base01, 'default'),
|
||||||
@ -223,6 +239,9 @@ class SolarizedDark(LowDark):
|
|||||||
key = (sol_blue, 'default',),
|
key = (sol_blue, 'default',),
|
||||||
head = (sol_base00, 'default'),
|
head = (sol_base00, 'default'),
|
||||||
|
|
||||||
|
# Options
|
||||||
|
option_selected = (sol_base03, sol_base01),
|
||||||
|
|
||||||
# List and Connections
|
# List and Connections
|
||||||
method = (sol_cyan, 'default'),
|
method = (sol_cyan, 'default'),
|
||||||
focus = (sol_base1, 'default'),
|
focus = (sol_base1, 'default'),
|
||||||
@ -252,10 +271,10 @@ class SolarizedDark(LowDark):
|
|||||||
|
|
||||||
|
|
||||||
palettes = {
|
palettes = {
|
||||||
"lowlight": LowLight(),
|
#"lowlight": LowLight(),
|
||||||
"lowdark": LowDark(),
|
#"lowdark": LowDark(),
|
||||||
"light": Light(),
|
#"light": Light(),
|
||||||
"dark": Dark(),
|
#"dark": Dark(),
|
||||||
"solarized_light": SolarizedLight(),
|
"solarized_light": SolarizedLight(),
|
||||||
"solarized_dark": SolarizedDark(),
|
#"solarized_dark": SolarizedDark(),
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,8 @@ class Window(urwid.Frame):
|
|||||||
text = self.master.state.intercept_txt,
|
text = self.master.state.intercept_txt,
|
||||||
callback = self.master.set_intercept
|
callback = self.master.set_intercept
|
||||||
)
|
)
|
||||||
|
elif k == "o":
|
||||||
|
self.master.view_options()
|
||||||
elif k == "Q":
|
elif k == "Q":
|
||||||
raise urwid.ExitMainLoop
|
raise urwid.ExitMainLoop
|
||||||
elif k == "q":
|
elif k == "q":
|
||||||
@ -107,19 +109,6 @@ class Window(urwid.Frame):
|
|||||||
),
|
),
|
||||||
callback = self.master.stop_server_playback_prompt,
|
callback = self.master.stop_server_playback_prompt,
|
||||||
)
|
)
|
||||||
elif k == "o":
|
|
||||||
signals.status_prompt_onekey.send(
|
|
||||||
prompt = "Options",
|
|
||||||
keys = (
|
|
||||||
("anticache", "a"),
|
|
||||||
("anticomp", "c"),
|
|
||||||
("showhost", "h"),
|
|
||||||
("killextra", "k"),
|
|
||||||
("norefresh", "n"),
|
|
||||||
("no-upstream-certs", "u"),
|
|
||||||
),
|
|
||||||
callback = self.master._change_options
|
|
||||||
)
|
|
||||||
elif k == "t":
|
elif k == "t":
|
||||||
signals.status_prompt.send(
|
signals.status_prompt.send(
|
||||||
prompt = "Sticky cookie filter",
|
prompt = "Sticky cookie filter",
|
||||||
|
Loading…
Reference in New Issue
Block a user