dataviewer: disable (broken) edit

The edit functionality was previously broken due to
encoding issues, so we just replace the column type
with a generic read-only variant.
This commit is contained in:
Maximilian Hils 2018-01-01 18:12:07 +01:00
parent eb53cc7ed2
commit 11429bf229
4 changed files with 52 additions and 75 deletions

View File

@ -1,67 +0,0 @@
import typing
import urwid
from mitmproxy.tools.console import signals
from mitmproxy.tools.console.grideditor import base
from mitmproxy.utils import strutils
strbytes = typing.Union[str, bytes]
class Column(base.Column):
def Display(self, data):
return Display(data)
def Edit(self, data):
return Edit(data)
def blank(self):
return ""
def keypress(self, key, editor):
if key in ["m_select"]:
editor.walker.start_edit()
else:
return key
class Display(base.Cell):
def __init__(self, data: strbytes) -> None:
self.data = data
if isinstance(data, bytes):
escaped = strutils.bytes_to_escaped_str(data)
else:
escaped = data.encode()
w = urwid.Text(escaped, wrap="any")
super().__init__(w)
def get_data(self) -> strbytes:
return self.data
class Edit(base.Cell):
def __init__(self, data: strbytes) -> None:
if isinstance(data, bytes):
escaped = strutils.bytes_to_escaped_str(data)
else:
escaped = data.encode()
self.type = type(data) # type: typing.Type
w = urwid.Edit(edit_text=escaped, wrap="any", multiline=True)
w = urwid.AttrWrap(w, "editfield")
super().__init__(w)
def get_data(self) -> strbytes:
txt = self._w.get_text()[0].strip()
try:
if self.type == bytes:
return strutils.escaped_str_to_bytes(txt)
else:
return txt.decode()
except ValueError:
signals.status_message.send(
self,
message="Invalid Python-style string encoding.",
expire=1000
)
raise

View File

@ -21,7 +21,7 @@ class Column(col_bytes.Column):
return TEdit(data, self.encoding_args) return TEdit(data, self.encoding_args)
def blank(self): def blank(self):
return u"" return ""
# This is the same for both edit and display. # This is the same for both edit and display.

View File

@ -0,0 +1,33 @@
"""
A display-only column that displays any data type.
"""
import typing
import urwid
from mitmproxy.tools.console.grideditor import base
from mitmproxy.utils import strutils
class Column(base.Column):
def Display(self, data):
return Display(data)
Edit = Display
def blank(self):
return ""
class Display(base.Cell):
def __init__(self, data: typing.Any) -> None:
self.data = data
if isinstance(data, bytes):
data = strutils.bytes_to_escaped_str(data)
if not isinstance(data, str):
data = repr(data)
w = urwid.Text(data, wrap="any")
super().__init__(w)
def get_data(self) -> typing.Any:
return self.data

View File

@ -1,13 +1,14 @@
import typing
from mitmproxy import exceptions from mitmproxy import exceptions
from mitmproxy.net.http import Headers
from mitmproxy.tools.console import layoutwidget from mitmproxy.tools.console import layoutwidget
from mitmproxy.tools.console import signals
from mitmproxy.tools.console.grideditor import base from mitmproxy.tools.console.grideditor import base
from mitmproxy.tools.console.grideditor import col
from mitmproxy.tools.console.grideditor import col_text
from mitmproxy.tools.console.grideditor import col_bytes from mitmproxy.tools.console.grideditor import col_bytes
from mitmproxy.tools.console.grideditor import col_subgrid from mitmproxy.tools.console.grideditor import col_subgrid
from mitmproxy.tools.console import signals from mitmproxy.tools.console.grideditor import col_text
from mitmproxy.net.http import Headers from mitmproxy.tools.console.grideditor import col_viewany
class QueryEditor(base.FocusEditor): class QueryEditor(base.FocusEditor):
@ -67,7 +68,6 @@ class RequestFormEditor(base.FocusEditor):
class PathEditor(base.FocusEditor): class PathEditor(base.FocusEditor):
# TODO: Next row on enter? # TODO: Next row on enter?
title = "Edit Path Components" title = "Edit Path Components"
columns = [ columns = [
col_text.Column("Component"), col_text.Column("Component"),
@ -175,11 +175,22 @@ class OptionsEditor(base.GridEditor, layoutwidget.LayoutWidget):
class DataViewer(base.GridEditor, layoutwidget.LayoutWidget): class DataViewer(base.GridEditor, layoutwidget.LayoutWidget):
title = None # type: str title = None # type: str
def __init__(self, master, vals): def __init__(
self,
master,
vals: typing.Union[
typing.List[typing.List[typing.Any]],
typing.List[typing.Any],
str,
]) -> None:
if vals: if vals:
# Whatever vals is, make it a list of rows containing lists of column values.
if isinstance(vals, str):
vals = [vals]
if not isinstance(vals[0], list): if not isinstance(vals[0], list):
vals = [[i] for i in vals] vals = [[i] for i in vals]
self.columns = [col.Column("")] * len(vals[0])
self.columns = [col_viewany.Column("")] * len(vals[0])
super().__init__(master, vals, self.callback) super().__init__(master, vals, self.callback)
def callback(self, vals): def callback(self, vals):