diff options
Diffstat (limited to 'libmproxy/console/flowdetailview.py')
| -rw-r--r-- | libmproxy/console/flowdetailview.py | 233 | 
1 files changed, 137 insertions, 96 deletions
diff --git a/libmproxy/console/flowdetailview.py b/libmproxy/console/flowdetailview.py index f351bff1..48845a62 100644 --- a/libmproxy/console/flowdetailview.py +++ b/libmproxy/console/flowdetailview.py @@ -1,113 +1,154 @@  from __future__ import absolute_import  import urwid -from . import common +from . import common, searchable  from .. import utils -footer = [ -    ('heading_key', "q"), ":back ", -] -class FlowDetailsView(urwid.ListBox): -    def __init__(self, master, flow, state): -        self.master, self.flow, self.state = master, flow, state -        urwid.ListBox.__init__( -            self, -            self.flowtext() -        ) +def maybe_timestamp(base, attr): +    if base and getattr(base, attr): +        return utils.format_timestamp_with_milli(getattr(base, attr)) +    else: +        return "active" +    pass -    def keypress(self, size, key): -        key = common.shortcuts(key) -        if key == "q": -            self.master.statusbar = self.state[0] -            self.master.body = self.state[1] -            self.master.header = self.state[2] -            self.master.loop.widget = self.master.make_view() -            return None -        elif key == "?": -            key = None -        return urwid.ListBox.keypress(self, size, key) - -    def flowtext(self): -        text = [] - -        title = urwid.Text("Flow details") -        title = urwid.Padding(title, align="left", width=("relative", 100)) -        title = urwid.AttrWrap(title, "heading") -        text.append(title) - -        cc = self.flow.client_conn -        sc = self.flow.server_conn -        req = self.flow.request -        resp = self.flow.response - -        if sc: -            text.append(urwid.Text([("head", "Server Connection:")])) -            parts = [ -                ["Address", "%s:%s" % sc.address()], -            ] -            text.extend(common.format_keyvals(parts, key="key", val="text", indent=4)) - -            c = sc.cert -            if c: -                text.append(urwid.Text([("head", "Server Certificate:")])) -                parts = [ -                    ["Type", "%s, %s bits"%c.keyinfo], -                    ["SHA1 digest", c.digest("sha1")], -                    ["Valid to", str(c.notafter)], -                    ["Valid from", str(c.notbefore)], -                    ["Serial", str(c.serial)], -                    [ -                        "Subject", -                        urwid.BoxAdapter( -                            urwid.ListBox(common.format_keyvals(c.subject, key="highlight", val="text")), -                            len(c.subject) -                        ) -                    ], -                    [ -                        "Issuer", -                        urwid.BoxAdapter( -                            urwid.ListBox(common.format_keyvals(c.issuer, key="highlight", val="text")), -                            len(c.issuer) -                        ) -                    ] -                ] +def flowdetails(state, flow): +    text = [] -                if c.altnames: -                    parts.append( -                        [ -                            "Alt names", -                            ", ".join(c.altnames) -                        ] -                    ) -                text.extend(common.format_keyvals(parts, key="key", val="text", indent=4)) +    cc = flow.client_conn +    sc = flow.server_conn +    req = flow.request +    resp = flow.response -        if cc: -            text.append(urwid.Text([("head", "Client Connection:")])) +    if sc: +        text.append(urwid.Text([("head", "Server Connection:")])) +        parts = [ +            ["Address", "%s:%s" % sc.address()], +        ] + +        text.extend( +            common.format_keyvals(parts, key="key", val="text", indent=4) +        ) +        c = sc.cert +        if c: +            text.append(urwid.Text([("head", "Server Certificate:")]))              parts = [ -                ["Address", "%s:%s" % cc.address()], -                # ["Requests", "%s"%cc.requestcount], +                ["Type", "%s, %s bits"%c.keyinfo], +                ["SHA1 digest", c.digest("sha1")], +                ["Valid to", str(c.notafter)], +                ["Valid from", str(c.notbefore)], +                ["Serial", str(c.serial)], +                [ +                    "Subject", +                    urwid.BoxAdapter( +                        urwid.ListBox( +                            common.format_keyvals( +                                c.subject, +                                key="highlight", +                                val="text" +                            ) +                        ), +                        len(c.subject) +                    ) +                ], +                [ +                    "Issuer", +                    urwid.BoxAdapter( +                        urwid.ListBox( +                            common.format_keyvals( +                                c.issuer, key="highlight", val="text" +                            ) +                        ), +                        len(c.issuer) +                    ) +                ]              ] -            text.extend(common.format_keyvals(parts, key="key", val="text", indent=4)) +            if c.altnames: +                parts.append( +                    [ +                        "Alt names", +                        ", ".join(c.altnames) +                    ] +                ) +            text.extend( +                common.format_keyvals(parts, key="key", val="text", indent=4) +            ) -        parts = [] +    if cc: +        text.append(urwid.Text([("head", "Client Connection:")])) -        parts.append(["Client conn. established", utils.format_timestamp_with_milli(cc.timestamp_start) if (cc and cc.timestamp_start) else "active"]) -        parts.append(["Server conn. initiated", utils.format_timestamp_with_milli(sc.timestamp_start) if sc else "active" ]) -        parts.append(["Server conn. TCP handshake", utils.format_timestamp_with_milli(sc.timestamp_tcp_setup) if (sc and sc.timestamp_tcp_setup) else "active"]) -        if sc.ssl_established: -            parts.append(["Server conn. SSL handshake", utils.format_timestamp_with_milli(sc.timestamp_ssl_setup) if sc.timestamp_ssl_setup else "active"]) -            parts.append(["Client conn. SSL handshake", utils.format_timestamp_with_milli(cc.timestamp_ssl_setup) if (cc and cc.timestamp_ssl_setup) else "active"]) -        parts.append(["First request byte", utils.format_timestamp_with_milli(req.timestamp_start)]) -        parts.append(["Request complete", utils.format_timestamp_with_milli(req.timestamp_end) if req.timestamp_end else "active"]) -        parts.append(["First response byte", utils.format_timestamp_with_milli(resp.timestamp_start) if resp else "active"]) -        parts.append(["Response complete", utils.format_timestamp_with_milli(resp.timestamp_end) if (resp and resp.timestamp_end) else "active"]) +        parts = [ +            ["Address", "%s:%s" % cc.address()], +            # ["Requests", "%s"%cc.requestcount], +        ] -        # sort operations by timestamp -        parts = sorted(parts, key=lambda p: p[1]) +        text.extend( +            common.format_keyvals(parts, key="key", val="text", indent=4) +        ) -        text.append(urwid.Text([("head", "Timing:")])) -        text.extend(common.format_keyvals(parts, key="key", val="text", indent=4)) -        return text +    parts = [] + +    parts.append( +        [ +            "Client conn. established", +            maybe_timestamp(cc, "timestamp_start") +        ] +    ) +    parts.append( +        [ +            "Server conn. initiated", +            maybe_timestamp(sc, "timestamp_start") +        ] +    ) +    parts.append( +        [ +            "Server conn. TCP handshake", +            maybe_timestamp(sc, "timestamp_tcp_setup") +        ] +    ) +    if sc.ssl_established: +        parts.append( +            [ +                "Server conn. SSL handshake", +                maybe_timestamp(sc, "timestamp_ssl_setup") +            ] +        ) +        parts.append( +            [ +                "Client conn. SSL handshake", +                maybe_timestamp(cc, "timestamp_ssl_setup") +            ] +        ) +    parts.append( +        [ +            "First request byte", +            maybe_timestamp(req, "timestamp_start") +        ] +    ) +    parts.append( +        [ +            "Request complete", +            maybe_timestamp(req, "timestamp_end") +        ] +    ) +    parts.append( +        [ +            "First response byte", +            maybe_timestamp(resp, "timestamp_start") +        ] +    ) +    parts.append( +        [ +            "Response complete", +            maybe_timestamp(resp, "timestamp_end") +        ] +    ) + +    # sort operations by timestamp +    parts = sorted(parts, key=lambda p: p[1]) + +    text.append(urwid.Text([("head", "Timing:")])) +    text.extend(common.format_keyvals(parts, key="key", val="text", indent=4)) +    return searchable.Searchable(state, text)  | 
