aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy/options.py
blob: 2467b9dda385e86e97bc5d7df1ce1127f9446e78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
from typing import Tuple, Optional, Sequence, Union

from mitmproxy import optmanager

APP_HOST = "mitm.it"
APP_PORT = 80
CA_DIR = "~/.mitmproxy"
LISTEN_PORT = 8080

# We manually need to specify this, otherwise OpenSSL may select a non-HTTP2 cipher by default.
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=apache-2.2.15&openssl=1.0.2&hsts=yes&profile=old
DEFAULT_CLIENT_CIPHERS = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:" \
    "ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:" \
    "ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:" \
    "ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:" \
    "DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:" \
    "DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:" \
    "AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:" \
    "HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:" \
    "!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"


class Options(optmanager.OptManager):
    def __init__(
        self,
        *,  # all args are keyword-only.
        onboarding: bool = True,
        onboarding_host: str = APP_HOST,
        onboarding_port: int = APP_PORT,
        anticache: bool = False,
        anticomp: bool = False,
        client_replay: Sequence[str] = [],
        replay_kill_extra: bool = False,
        keepserving: bool = True,
        no_server: bool = False,
        server_replay_nopop: bool = False,
        refresh_server_playback: bool = True,
        rfile: Optional[str] = None,
        scripts: Sequence[str] = [],
        showhost: bool = False,
        replacements: Sequence[Union[Tuple[str, str, str], str]] = [],
        replacement_files: Sequence[Union[Tuple[str, str, str], str]] = [],
        server_replay_use_headers: Sequence[str] = [],
        setheaders: Sequence[Union[Tuple[str, str, str], str]] = [],
        server_replay: Sequence[str] = [],
        stickycookie: Optional[str] = None,
        stickyauth: Optional[str] = None,
        stream_large_bodies: Optional[int] = None,
        verbosity: int = 2,
        default_contentview: str = "auto",
        streamfile: Optional[str] = None,
        streamfile_append: bool = False,
        server_replay_ignore_content: bool = False,
        server_replay_ignore_params: Sequence[str] = [],
        server_replay_ignore_payload_params: Sequence[str] = [],
        server_replay_ignore_host: bool = False,

        # Proxy options
        auth_nonanonymous: bool = False,
        auth_singleuser: Optional[str] = None,
        auth_htpasswd: Optional[str] = None,
        add_upstream_certs_to_client_chain: bool = False,
        body_size_limit: Optional[int] = None,
        cadir: str = CA_DIR,
        certs: Sequence[Tuple[str, str]] = [],
        ciphers_client: str=DEFAULT_CLIENT_CIPHERS,
        ciphers_server: Optional[str]=None,
        clientcerts: Optional[str] = None,
        ignore_hosts: Sequence[str] = [],
        listen_host: str = "",
        listen_port: int = LISTEN_PORT,
        upstream_bind_address: str = "",
        mode: str = "regular",
        no_upstream_cert: bool = False,

        http2: bool = True,
        http2_priority: bool = False,
        websocket: bool = True,
        rawtcp: bool = False,

        spoof_source_address: bool = False,
        upstream_server: Optional[str] = None,
        upstream_auth: Optional[str] = None,
        ssl_version_client: str = "secure",
        ssl_version_server: str = "secure",
        ssl_insecure: bool = False,
        ssl_verify_upstream_trusted_cadir: Optional[str] = None,
        ssl_verify_upstream_trusted_ca: Optional[str] = None,
        tcp_hosts: Sequence[str] = [],

        intercept: Optional[str] = None,

        # Console options
        console_eventlog: bool = False,
        console_focus_follow: bool = False,
        console_palette: Optional[str] = "dark",
        console_palette_transparent: bool = False,
        console_no_mouse: bool = False,
        console_order: Optional[str] = None,
        console_order_reversed: bool = False,

        filter: Optional[str] = None,

        # Web options
        web_open_browser: bool = True,
        web_debug: bool = False,
        web_port: int = 8081,
        web_iface: str = "127.0.0.1",

        # Dump options
        filtstr: Optional[str] = None,
        flow_detail: int = 1
    ) -> None:
        # We could replace all assignments with clever metaprogramming,
        # but type hints are a much more valueable asset.

        self.onboarding = onboarding
        self.onboarding_host = onboarding_host
        self.onboarding_port = onboarding_port
        self.anticache = anticache
        self.anticomp = anticomp
        self.client_replay = client_replay
        self.keepserving = keepserving
        self.replay_kill_extra = replay_kill_extra
        self.no_server = no_server
        self.server_replay_nopop = server_replay_nopop
        self.refresh_server_playback = refresh_server_playback
        self.rfile = rfile
        self.scripts = scripts
        self.showhost = showhost
        self.replacements = replacements
        self.replacement_files = replacement_files
        self.server_replay_use_headers = server_replay_use_headers
        self.setheaders = setheaders
        self.server_replay = server_replay
        self.stickycookie = stickycookie
        self.stickyauth = stickyauth
        self.stream_large_bodies = stream_large_bodies
        self.verbosity = verbosity
        self.default_contentview = default_contentview
        self.streamfile = streamfile
        self.streamfile_append = streamfile_append
        self.server_replay_ignore_content = server_replay_ignore_content
        self.server_replay_ignore_params = server_replay_ignore_params
        self.server_replay_ignore_payload_params = server_replay_ignore_payload_params
        self.server_replay_ignore_host = server_replay_ignore_host

        # Proxy options
        self.auth_nonanonymous = auth_nonanonymous
        self.auth_singleuser = auth_singleuser
        self.auth_htpasswd = auth_htpasswd
        self.add_upstream_certs_to_client_chain = add_upstream_certs_to_client_chain
        self.body_size_limit = body_size_limit
        self.cadir = cadir
        self.certs = certs
        self.ciphers_client = ciphers_client
        self.ciphers_server = ciphers_server
        self.clientcerts = clientcerts
        self.ignore_hosts = ignore_hosts
        self.listen_host = listen_host
        self.listen_port = listen_port
        self.upstream_bind_address = upstream_bind_address
        self.mode = mode
        self.no_upstream_cert = no_upstream_cert

        self.http2 = http2
        self.http2_priority = http2_priority
        self.websocket = websocket
        self.rawtcp = rawtcp

        self.spoof_source_address = spoof_source_address
        self.upstream_server = upstream_server
        self.upstream_auth = upstream_auth
        self.ssl_version_client = ssl_version_client
        self.ssl_version_server = ssl_version_server
        self.ssl_insecure = ssl_insecure
        self.ssl_verify_upstream_trusted_cadir = ssl_verify_upstream_trusted_cadir
        self.ssl_verify_upstream_trusted_ca = ssl_verify_upstream_trusted_ca
        self.tcp_hosts = tcp_hosts

        self.intercept = intercept

        # Console options
        self.console_eventlog = console_eventlog
        self.console_focus_follow = console_focus_follow
        self.console_palette = console_palette
        self.console_palette_transparent = console_palette_transparent
        self.console_no_mouse = console_no_mouse
        self.console_order = console_order
        self.console_order_reversed = console_order_reversed

        self.filter = filter

        # Web options
        self.web_open_browser = web_open_browser
        self.web_debug = web_debug
        self.web_port = web_port
        self.web_iface = web_iface

        # Dump options
        self.filtstr = filtstr
        self.flow_detail = flow_detail

        super().__init__()