diff options
Diffstat (limited to 'libmproxy/console/grideditor.py')
-rw-r--r-- | libmproxy/console/grideditor.py | 117 |
1 files changed, 76 insertions, 41 deletions
diff --git a/libmproxy/console/grideditor.py b/libmproxy/console/grideditor.py index 438d0ad7..4bcc0171 100644 --- a/libmproxy/console/grideditor.py +++ b/libmproxy/console/grideditor.py @@ -1,21 +1,25 @@ from __future__ import absolute_import -import copy, re, os + +import copy +import re +import os import urwid -from . import common + +from . import common, signals from .. import utils, filt, script from netlib import http_uastrings -footer = [ +FOOTER = [ ('heading_key', "enter"), ":edit ", ('heading_key', "q"), ":back ", ] -footer_editing = [ +FOOTER_EDITING = [ ('heading_key', "esc"), ":stop editing ", ] -class SText(common.WWrap): +class SText(urwid.WidgetWrap): def __init__(self, txt, focused, error): txt = txt.encode("string-escape") w = urwid.Text(txt, wrap="any") @@ -26,10 +30,10 @@ class SText(common.WWrap): w = urwid.AttrWrap(w, "focusfield") elif error: w = urwid.AttrWrap(w, "field_error") - common.WWrap.__init__(self, w) + urwid.WidgetWrap.__init__(self, w) def get_text(self): - return self.w.get_text()[0] + return self._w.get_text()[0] def keypress(self, size, key): return key @@ -38,21 +42,21 @@ class SText(common.WWrap): return True -class SEdit(common.WWrap): +class SEdit(urwid.WidgetWrap): def __init__(self, txt): txt = txt.encode("string-escape") w = urwid.Edit(edit_text=txt, wrap="any", multiline=True) w = urwid.AttrWrap(w, "editfield") - common.WWrap.__init__(self, w) + urwid.WidgetWrap.__init__(self, w) def get_text(self): - return self.w.get_text()[0] + return self._w.get_text()[0] def selectable(self): return True -class GridRow(common.WWrap): +class GridRow(urwid.WidgetWrap): def __init__(self, focused, editing, editor, values): self.focused, self.editing, self.editor = focused, editing, editor @@ -76,14 +80,14 @@ class GridRow(common.WWrap): ) if focused is not None: w.set_focus_column(focused) - common.WWrap.__init__(self, w) + urwid.WidgetWrap.__init__(self, w) def get_edit_value(self): return self.editing.get_text() def keypress(self, s, k): if self.editing: - w = self.w.column_widths(s)[self.focused] + w = self._w.column_widths(s)[self.focused] k = self.editing.keypress((w,), k) return k @@ -121,12 +125,14 @@ class GridWalker(urwid.ListWalker): try: val = val.decode("string-escape") except ValueError: - self.editor.master.statusbar.message("Invalid Python-style string encoding.", 1000) + signals.status_message.send( + self, message = "Invalid Python-style string encoding.", expure = 1000 + ) return errors = self.lst[self.focus][1] emsg = self.editor.is_error(self.focus_col, val) if emsg: - self.editor.master.statusbar.message(emsg, 1000) + signals.status_message.send(message = emsg, expire = 1) errors.add(self.focus_col) else: errors.discard(self.focus_col) @@ -155,13 +161,15 @@ class GridWalker(urwid.ListWalker): def start_edit(self): if self.lst: - self.editing = GridRow(self.focus_col, True, self.editor, self.lst[self.focus]) - self.editor.master.statusbar.update(footer_editing) + self.editing = GridRow( + self.focus_col, True, self.editor, self.lst[self.focus] + ) + self.editor.master.loop.widget.footer.update(FOOTER_EDITING) self._modified() def stop_edit(self): if self.editing: - self.editor.master.statusbar.update(footer) + self.editor.master.loop.widget.footer.update(FOOTER) self.set_current_value(self.editing.get_edit_value(), False) self.editing = False self._modified() @@ -187,7 +195,12 @@ class GridWalker(urwid.ListWalker): if self.editing: return self.editing, self.focus elif self.lst: - return GridRow(self.focus_col, False, self.editor, self.lst[self.focus]), self.focus + return GridRow( + self.focus_col, + False, + self.editor, + self.lst[self.focus] + ), self.focus else: return None, None @@ -213,10 +226,13 @@ class GridListBox(urwid.ListBox): FIRST_WIDTH_MAX = 40 FIRST_WIDTH_MIN = 20 -class GridEditor(common.WWrap): + + +class GridEditor(urwid.WidgetWrap): title = None columns = None headings = None + def __init__(self, master, value, callback, *cb_args, **cb_kwargs): value = copy.deepcopy(value) self.master, self.value, self.callback = master, value, callback @@ -248,18 +264,18 @@ class GridEditor(common.WWrap): self.walker = GridWalker(self.value, self) self.lb = GridListBox(self.walker) - self.w = urwid.Frame( + self._w = urwid.Frame( self.lb, header = urwid.Pile([title, h]) ) - self.master.statusbar.update("") + self.master.loop.widget.footer.update("") self.show_empty_msg() def show_empty_msg(self): if self.walker.lst: - self.w.set_footer(None) + self._w.set_footer(None) else: - self.w.set_footer( + self._w.set_footer( urwid.Text( [ ("highlight", "No values. Press "), @@ -297,7 +313,7 @@ class GridEditor(common.WWrap): if self.walker.focus == pf and self.walker.focus_col != pfc: self.walker.start_edit() else: - self.w.keypress(size, key) + self._w.keypress(size, key) return None key = common.shortcuts(key) @@ -307,7 +323,7 @@ class GridEditor(common.WWrap): if not i[1] and any([x.strip() for x in i[0]]): res.append(i[0]) self.callback(res, *self.cb_args, **self.cb_kwargs) - self.master.pop_view() + signals.pop_view_state.send(self) elif key in ["h", "left"]: self.walker.left() elif key in ["l", "right"]: @@ -322,10 +338,19 @@ class GridEditor(common.WWrap): self.walker.delete_focus() elif key == "r": if self.walker.get_current_value() is not None: - self.master.path_prompt("Read file: ", "", self.read_file) + signals.status_prompt_path.send( + self, + prompt = "Read file", + callback = self.read_file + ) elif key == "R": if self.walker.get_current_value() is not None: - self.master.path_prompt("Read unescaped file: ", "", self.read_file, True) + signals.status_prompt_path.send( + self, + prompt = "Read unescaped file", + callback = self.read_file, + args = (True,) + ) elif key == "e": o = self.walker.get_current_value() if o is not None: @@ -336,7 +361,7 @@ class GridEditor(common.WWrap): elif key in ["enter"]: self.walker.start_edit() elif not self.handle_key(key): - return self.w.keypress(size, key) + return self._w.keypress(size, key) def is_error(self, col, val): """ @@ -362,7 +387,9 @@ class GridEditor(common.WWrap): ("tab", "next field"), ("enter", "edit field"), ] - text.extend(common.format_keyvals(keys, key="key", val="text", indent=4)) + text.extend( + common.format_keyvals(keys, key="key", val="text", indent=4) + ) text.append( urwid.Text( [ @@ -384,6 +411,7 @@ class HeaderEditor(GridEditor): title = "Editing headers" columns = 2 headings = ("Key", "Value") + def make_help(self): h = GridEditor.make_help(self) text = [] @@ -391,7 +419,9 @@ class HeaderEditor(GridEditor): keys = [ ("U", "add User-Agent header"), ] - text.extend(common.format_keyvals(keys, key="key", val="text", indent=4)) + text.extend( + common.format_keyvals(keys, key="key", val="text", indent=4) + ) text.append(urwid.Text([("text", "\n")])) text.extend(h) return text @@ -408,10 +438,10 @@ class HeaderEditor(GridEditor): def handle_key(self, key): if key == "U": - self.master.prompt_onekey( - "Add User-Agent header:", - [(i[0], i[1]) for i in http_uastrings.UASTRINGS], - self.set_user_agent, + signals.status_prompt_onekey.send( + prompt = "Add User-Agent header:", + keys = [(i[0], i[1]) for i in http_uastrings.UASTRINGS], + callback = self.set_user_agent, ) return True @@ -426,6 +456,7 @@ class ReplaceEditor(GridEditor): title = "Editing replacement patterns" columns = 3 headings = ("Filter", "Regex", "Replacement") + def is_error(self, col, val): if col == 0: if not filt.parse(val): @@ -442,6 +473,7 @@ class SetHeadersEditor(GridEditor): title = "Editing header set patterns" columns = 3 headings = ("Filter", "Header", "Value") + def is_error(self, col, val): if col == 0: if not filt.parse(val): @@ -455,7 +487,9 @@ class SetHeadersEditor(GridEditor): keys = [ ("U", "add User-Agent header"), ] - text.extend(common.format_keyvals(keys, key="key", val="text", indent=4)) + text.extend( + common.format_keyvals(keys, key="key", val="text", indent=4) + ) text.append(urwid.Text([("text", "\n")])) text.extend(h) return text @@ -473,10 +507,10 @@ class SetHeadersEditor(GridEditor): def handle_key(self, key): if key == "U": - self.master.prompt_onekey( - "Add User-Agent header:", - [(i[0], i[1]) for i in http_uastrings.UASTRINGS], - self.set_user_agent, + signals.status_prompt_onekey.send( + prompt = "Add User-Agent header:", + keys = [(i[0], i[1]) for i in http_uastrings.UASTRINGS], + callback = self.set_user_agent, ) return True @@ -491,6 +525,7 @@ class ScriptEditor(GridEditor): title = "Editing scripts" columns = 1 headings = ("Command",) + def is_error(self, col, val): try: script.Script.parse_command(val) @@ -507,4 +542,4 @@ class HostPatternEditor(GridEditor): try: re.compile(val, re.IGNORECASE) except re.error as e: - return "Invalid regex: %s" % str(e)
\ No newline at end of file + return "Invalid regex: %s" % str(e) |