aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/cmdline.py282
-rw-r--r--libmproxy/main.py165
-rw-r--r--libmproxy/onboarding/app.py4
-rw-r--r--libmproxy/platform/windows.py4
-rw-r--r--libmproxy/proxy/config.py35
5 files changed, 301 insertions, 189 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py
index 4a3b5a48..b892f1fd 100644
--- a/libmproxy/cmdline.py
+++ b/libmproxy/cmdline.py
@@ -1,8 +1,9 @@
from __future__ import absolute_import
+import os
import re
-from argparse import ArgumentTypeError
+import configargparse
from netlib import http
-from . import filt, utils
+from . import filt, utils, version
from .proxy import config
APP_HOST = "mitm.it"
@@ -22,7 +23,9 @@ def _parse_hook(s):
elif len(parts) == 3:
patt, a, b = parts
else:
- raise ParseException("Malformed hook specifier - too few clauses: %s" % s)
+ raise ParseException(
+ "Malformed hook specifier - too few clauses: %s" % s
+ )
if not a:
raise ParseException("Empty clause: %s" % str(patt))
@@ -101,7 +104,9 @@ def parse_server_spec(url):
p = http.parse_url(normalized_url)
if not p or not p[1]:
- raise ArgumentTypeError("Invalid server specification: %s" % url)
+ raise configargparse.ArgumentTypeError(
+ "Invalid server specification: %s" % url
+ )
if url.lower().startswith("https2http"):
ssl = [True, False]
@@ -130,17 +135,19 @@ def get_common_options(options):
try:
p = parse_replace_hook(i)
except ParseException, e:
- raise ArgumentTypeError(e.message)
+ raise configargparse.ArgumentTypeError(e.message)
reps.append(p)
for i in options.replace_file:
try:
patt, rex, path = parse_replace_hook(i)
except ParseException, e:
- raise ArgumentTypeError(e.message)
+ raise configargparse.ArgumentTypeError(e.message)
try:
v = open(path, "rb").read()
except IOError, e:
- raise ArgumentTypeError("Could not read replace file: %s" % path)
+ raise configargparse.ArgumentTypeError(
+ "Could not read replace file: %s" % path
+ )
reps.append((patt, rex, v))
setheaders = []
@@ -148,7 +155,7 @@ def get_common_options(options):
try:
p = parse_setheader(i)
except ParseException, e:
- raise ArgumentTypeError(e.message)
+ raise configargparse.ArgumentTypeError(e.message)
setheaders.append(p)
return dict(
@@ -182,14 +189,23 @@ def get_common_options(options):
def common_options(parser):
parser.add_argument(
+ '--version',
+ action= 'version',
+ version= "%(prog)s" + " " + version.VERSION
+ )
+ parser.add_argument(
"--anticache",
action="store_true", dest="anticache", default=False,
- help="Strip out request headers that might cause the server to return 304-not-modified."
+
+ help="""
+ Strip out request headers that might cause the server to return
+ 304-not-modified.
+ """
)
parser.add_argument(
- "--confdir",
- action="store", type=str, dest="confdir", default='~/.mitmproxy',
- help="Configuration directory, contains default CA file. (~/.mitmproxy)"
+ "--cadir",
+ action="store", type=str, dest="cadir", default=config.CA_DIR,
+ help="Location of the default mitmproxy CA files. (%s)"%config.CA_DIR
)
parser.add_argument(
"--host",
@@ -197,51 +213,57 @@ def common_options(parser):
help="Use the Host header to construct URLs for display."
)
parser.add_argument(
- "-q",
+ "-q", "--quiet",
action="store_true", dest="quiet",
help="Quiet."
)
parser.add_argument(
- "-r",
+ "-r", "--read-flows",
action="store", dest="rfile", default=None,
help="Read flows from file."
)
parser.add_argument(
- "-s",
+ "-s", "--script",
action="append", type=str, dest="scripts", default=[],
metavar='"script.py --bar"',
- help="Run a script. Surround with quotes to pass script arguments. Can be passed multiple times."
+ help="""
+ Run a script. Surround with quotes to pass script arguments. Can be
+ passed multiple times.
+ """
)
parser.add_argument(
- "-t",
- action="store", dest="stickycookie_filt", default=None, metavar="FILTER",
+ "-t", "--stickycookie",
+ action="store",
+ dest="stickycookie_filt",
+ default=None,
+ metavar="FILTER",
help="Set sticky cookie filter. Matched against requests."
)
parser.add_argument(
- "-u",
+ "-u", "--stickyauth",
action="store", dest="stickyauth_filt", default=None, metavar="FILTER",
help="Set sticky auth filter. Matched against requests."
)
parser.add_argument(
- "-v",
+ "-v", "--verbose",
action="store_const", dest="verbose", default=1, const=2,
help="Increase event log verbosity."
)
parser.add_argument(
- "-w",
+ "-w", "--wfile",
action="store", dest="wfile", default=None,
help="Write flows to file."
)
parser.add_argument(
- "-z",
+ "-z", "--anticomp",
action="store_true", dest="anticomp", default=False,
help="Try to convince servers to send us un-compressed data."
)
parser.add_argument(
- "-Z",
+ "-Z", "--body-size-limit",
action="store", dest="body_size_limit", default=None,
metavar="SIZE",
- help="Byte size limit of HTTP request and response bodies." \
+ help="Byte size limit of HTTP request and response bodies."
" Understands k/m/g suffixes, i.e. 3m for 3 megabytes."
)
parser.add_argument(
@@ -249,9 +271,9 @@ def common_options(parser):
action="store", dest="stream_large_bodies", default=None,
metavar="SIZE",
help="""
- Stream data to the client if response body exceeds the given threshold.
- If streamed, the body will not be stored in any way. Understands k/m/g
- suffixes, i.e. 3m for 3 megabytes.
+ Stream data to the client if response body exceeds the given
+ threshold. If streamed, the body will not be stored in any way.
+ Understands k/m/g suffixes, i.e. 3m for 3 megabytes.
"""
)
@@ -261,7 +283,7 @@ def common_options(parser):
# it's already in a different group. - our own error messages are more
# helpful
group.add_argument(
- "-b",
+ "-b", "--bind-address",
action="store", type=str, dest="addr", default='',
help="Address to bind proxy to (defaults to all interfaces)"
)
@@ -282,23 +304,32 @@ def common_options(parser):
"--tcp",
action="append", type=str, dest="tcp_hosts", default=[],
metavar="HOST",
- help="Generic TCP SSL proxy mode for all hosts that match the pattern. Similar to --ignore,"
- "but SSL connections are intercepted. The communication contents are printed to the event log in verbose mode."
+ help="""
+ Generic TCP SSL proxy mode for all hosts that match the pattern.
+ Similar to --ignore, but SSL connections are intercepted. The
+ communication contents are printed to the event log in verbose mode.
+ """
)
group.add_argument(
- "-n",
+ "-n", "--no-server",
action="store_true", dest="no_server",
help="Don't start a proxy server."
)
group.add_argument(
- "-p",
+ "-p", "--port",
action="store", type=int, dest="port", default=8080,
help="Proxy service port."
)
group.add_argument(
- "-R",
- action="store", type=parse_server_spec, dest="reverse_proxy", default=None,
- help="Forward all requests to upstream HTTP server: http[s][2http[s]]://host[:port]"
+ "-R", "--reverse",
+ action="store",
+ type=parse_server_spec,
+ dest="reverse_proxy",
+ default=None,
+ help="""
+ Forward all requests to upstream HTTP server:
+ http[s][2http[s]]://host[:port]
+ """
)
group.add_argument(
"--socks",
@@ -306,22 +337,26 @@ def common_options(parser):
help="Set SOCKS5 proxy mode."
)
group.add_argument(
- "-T",
+ "-T", "--transparent",
action="store_true", dest="transparent_proxy", default=False,
help="Set transparent proxy mode."
)
group.add_argument(
- "-U",
- action="store", type=parse_server_spec, dest="upstream_proxy", default=None,
+ "-U", "--upstream",
+ action="store",
+ type=parse_server_spec,
+ dest="upstream_proxy",
+ default=None,
help="Forward all requests to upstream proxy server: http://host[:port]"
)
group = parser.add_argument_group(
"Advanced Proxy Options",
"""
- The following options allow a custom adjustment of the proxy behavior.
- Normally, you don't want to use these options directly and use the provided wrappers instead (-R, -U, -T).
- """.strip()
+ The following options allow a custom adjustment of the proxy
+ behavior. Normally, you don't want to use these options directly and
+ use the provided wrappers instead (-R, -U, -T).
+ """
)
group.add_argument(
"--http-form-in", dest="http_form_in", default=None,
@@ -336,38 +371,44 @@ def common_options(parser):
group = parser.add_argument_group("Onboarding App")
group.add_argument(
- "-a",
+ "-a", "--noapp",
action="store_false", dest="app", default=True,
help="Disable the mitmproxy onboarding app."
)
group.add_argument(
"--app-host",
action="store", dest="app_host", default=APP_HOST, metavar="host",
- help="Domain to serve the onboarding app from. For transparent mode, use an IP when\
- a DNS entry for the app domain is not present. Default: %s" % APP_HOST
-
+ help="""
+ Domain to serve the onboarding app from. For transparent mode, use
+ an IP when a DNS entry for the app domain is not present. Default:
+ %s
+ """ % APP_HOST
)
group.add_argument(
"--app-port",
- action="store", dest="app_port", default=APP_PORT, type=int, metavar="80",
+ action="store",
+ dest="app_port",
+ default=APP_PORT,
+ type=int,
+ metavar="80",
help="Port to serve the onboarding app from."
)
group = parser.add_argument_group("Client Replay")
group.add_argument(
- "-c",
+ "-c", "--client-replay",
action="store", dest="client_replay", default=None, metavar="PATH",
help="Replay client requests from a saved file."
)
group = parser.add_argument_group("Server Replay")
group.add_argument(
- "-S",
+ "-S", "--server-replay",
action="store", dest="server_replay", default=None, metavar="PATH",
help="Replay server responses from a saved file."
)
group.add_argument(
- "-k",
+ "-k", "--kill",
action="store_true", dest="kill", default=False,
help="Kill extra requests during replay."
)
@@ -380,8 +421,10 @@ def common_options(parser):
group.add_argument(
"--norefresh",
action="store_true", dest="norefresh", default=False,
- help="Disable response refresh, "
- "which updates times in cookies and headers for replayed responses."
+ help="""
+ Disable response refresh, which updates times in cookies and headers
+ for replayed responses.
+ """
)
group.add_argument(
"--no-pop",
@@ -392,13 +435,17 @@ def common_options(parser):
group.add_argument(
"--replay-ignore-content",
action="store_true", dest="replay_ignore_content", default=False,
- help="Ignore request's content while searching for a saved flow to replay"
+ help="""
+ Ignore request's content while searching for a saved flow to replay
+ """
)
group.add_argument(
"--replay-ignore-param",
action="append", dest="replay_ignore_params", type=str,
- help="Request's parameters to be ignored while searching for a saved flow to replay"
- "Can be passed multiple times."
+ help="""
+ Request's parameters to be ignored while searching for a saved flow
+ to replay. Can be passed multiple times.
+ """
)
group = parser.add_argument_group(
@@ -417,9 +464,12 @@ def common_options(parser):
)
group.add_argument(
"--replace-from-file",
- action="append", type=str, dest="replace_file", default=[],
- metavar="PATH",
- help="Replacement pattern, where the replacement clause is a path to a file."
+ action = "append", type=str, dest="replace_file", default=[],
+ metavar = "PATH",
+ help = """
+ Replacement pattern, where the replacement clause is a path to a
+ file.
+ """
)
group = parser.add_argument_group(
@@ -455,7 +505,10 @@ def common_options(parser):
"--singleuser",
action="store", dest="auth_singleuser", type=str,
metavar="USER",
- help="Allows access to a a single user, specified in the form username:password."
+ help="""
+ Allows access to a a single user, specified in the form
+ username:password.
+ """
)
user_specification_group.add_argument(
"--htpasswd",
@@ -465,3 +518,116 @@ def common_options(parser):
)
config.ssl_option_group(parser)
+
+
+def mitmproxy():
+ # Don't import libmproxy.console for mitmdump, urwid is not available on all
+ # platforms.
+ from .console import palettes
+
+ parser = configargparse.ArgumentParser(
+ usage="%(prog)s [options]",
+ args_for_setting_config_path = ["--conf"],
+ default_config_files = [
+ os.path.join(config.CA_DIR, "common.conf"),
+ os.path.join(config.CA_DIR, "mitmproxy.conf")
+ ],
+ add_config_file_help = True,
+ add_env_var_help = True
+ )
+ common_options(parser)
+ parser.add_argument(
+ "--palette", type=str, default="dark",
+ action="store", dest="palette",
+ help="Select color palette: " + ", ".join(palettes.palettes.keys())
+ )
+ parser.add_argument(
+ "-e", "--eventlog",
+ action="store_true", dest="eventlog",
+ help="Show event log."
+ )
+ group = parser.add_argument_group(
+ "Filters",
+ "See help in mitmproxy for filter expression syntax."
+ )
+ group.add_argument(
+ "-i", "--intercept", action="store",
+ type=str, dest="intercept", default=None,
+ help="Intercept filter expression."
+ )
+ return parser
+
+
+def mitmdump():
+ parser = configargparse.ArgumentParser(
+ usage="%(prog)s [options] [filter]",
+ args_for_setting_config_path = ["--conf"],
+ default_config_files = [
+ os.path.join(config.CA_DIR, "common.conf"),
+ os.path.join(config.CA_DIR, "mitmdump.conf")
+ ],
+ add_config_file_help = True,
+ add_env_var_help = True
+ )
+
+ common_options(parser)
+ parser.add_argument(
+ "--keepserving",
+ action= "store_true", dest="keepserving", default=False,
+ help= """
+ Continue serving after client playback or file read. We exit by
+ default.
+ """
+ )
+ parser.add_argument(
+ "-d", "--detail",
+ action="count", dest="flow_detail", default=1,
+ help="Increase flow detail display level. Can be passed multiple times."
+ )
+ parser.add_argument('args', nargs="...")
+ return parser
+
+
+def mitmweb():
+ parser = configargparse.ArgumentParser(
+ usage="%(prog)s [options]",
+ args_for_setting_config_path = ["--conf"],
+ default_config_files = [
+ os.path.join(config.CA_DIR, "common.conf"),
+ os.path.join(config.CA_DIR, "mitmweb.conf")
+ ],
+ add_config_file_help = True,
+ add_env_var_help = True
+ )
+
+ group = parser.add_argument_group("Mitmweb")
+ group.add_argument(
+ "--wport",
+ action="store", type=int, dest="wport", default=8081,
+ metavar="PORT",
+ help="Mitmweb port."
+ )
+ group.add_argument(
+ "--wiface",
+ action="store", dest="wiface", default="127.0.0.1",
+ metavar="IFACE",
+ help="Mitmweb interface."
+ )
+ group.add_argument(
+ "--wdebug",
+ action="store_true", dest="wdebug",
+ help="Turn on mitmweb debugging"
+ )
+
+ common_options(parser)
+ group = parser.add_argument_group(
+ "Filters",
+ "See help in mitmproxy for filter expression syntax."
+ )
+ group.add_argument(
+ "-i", "--intercept", action="store",
+ type=str, dest="intercept", default=None,
+ help="Intercept filter expression."
+ )
+ return parser
+
diff --git a/libmproxy/main.py b/libmproxy/main.py
index 2d6a0119..e5b7f56b 100644
--- a/libmproxy/main.py
+++ b/libmproxy/main.py
@@ -1,5 +1,4 @@
from __future__ import print_function, absolute_import
-import argparse
import os
import signal
import sys
@@ -9,27 +8,43 @@ from .proxy import process_proxy_options, ProxyServerError
from .proxy.server import DummyServer, ProxyServer
+# This file is not included in coverage analysis or tests - anything that can be
+# tested should live elsewhere.
+
def check_versions():
"""
- Having installed a wrong version of pyOpenSSL or netlib is unfortunately a very common source of error.
- Check before every start that both versions are somewhat okay.
+ Having installed a wrong version of pyOpenSSL or netlib is unfortunately a
+ very common source of error. Check before every start that both versions are
+ somewhat okay.
"""
- # We don't introduce backward-incompatible changes in patch versions. Only consider major and minor version.
+ # We don't introduce backward-incompatible changes in patch versions. Only
+ # consider major and minor version.
if netlib.version.IVERSION[:2] != version.IVERSION[:2]:
print(
"Warning: You are using mitmdump %s with netlib %s. "
- "Most likely, that doesn't work - please upgrade!" % (version.VERSION, netlib.version.VERSION),
- file=sys.stderr)
- import OpenSSL, inspect
-
+ "Most likely, that won't work - please upgrade!" % (
+ version.VERSION, netlib.version.VERSION
+ ),
+ file=sys.stderr
+ )
+ import OpenSSL
+ import inspect
v = tuple([int(x) for x in OpenSSL.__version__.split(".")][:2])
if v < (0, 14):
- print("You are using an outdated version of pyOpenSSL: mitmproxy requires pyOpenSSL 0.14 or greater.",
- file=sys.stderr)
- # Some users apparently have multiple versions of pyOpenSSL installed. Report which one we got.
+ print(
+ "You are using an outdated version of pyOpenSSL:"
+ " mitmproxy requires pyOpenSSL 0.14 or greater.",
+ file=sys.stderr
+ )
+ # Some users apparently have multiple versions of pyOpenSSL installed.
+ # Report which one we got.
pyopenssl_path = os.path.dirname(inspect.getfile(OpenSSL))
- print("Your pyOpenSSL %s installation is located at %s" % (OpenSSL.__version__, pyopenssl_path),
- file=sys.stderr)
+ print(
+ "Your pyOpenSSL %s installation is located at %s" % (
+ OpenSSL.__version__, pyopenssl_path
+ ),
+ file=sys.stderr
+ )
sys.exit(1)
@@ -38,8 +53,14 @@ def assert_utf8_env():
for i in ["LANG", "LC_CTYPE", "LC_ALL"]:
spec += os.environ.get(i, "").lower()
if "utf" not in spec:
- print("Error: mitmproxy requires a UTF console environment.", file=sys.stderr)
- print("Set your LANG enviroment variable to something like en_US.UTF-8", file=sys.stderr)
+ print(
+ "Error: mitmproxy requires a UTF console environment.",
+ file=sys.stderr
+ )
+ print(
+ "Set your LANG enviroment variable to something like en_US.UTF-8",
+ file=sys.stderr
+ )
sys.exit(1)
@@ -54,34 +75,13 @@ def get_server(dummy_server, options):
sys.exit(1)
-def mitmproxy_cmdline():
- # Don't import libmproxy.console for mitmdump, urwid is not available on all platforms.
+def mitmproxy(): # pragma: nocover
from . import console
- from .console import palettes
-
- parser = argparse.ArgumentParser(usage="%(prog)s [options]")
- parser.add_argument('--version', action='version', version=version.NAMEVERSION)
- cmdline.common_options(parser)
- parser.add_argument(
- "--palette", type=str, default="dark",
- action="store", dest="palette",
- help="Select color palette: " + ", ".join(palettes.palettes.keys())
- )
- parser.add_argument(
- "-e",
- action="store_true", dest="eventlog",
- help="Show event log."
- )
- group = parser.add_argument_group(
- "Filters",
- "See help in mitmproxy for filter expression syntax."
- )
- group.add_argument(
- "-i", "--intercept", action="store",
- type=str, dest="intercept", default=None,
- help="Intercept filter expression."
- )
+ check_versions()
+ assert_utf8_env()
+
+ parser = cmdline.mitmproxy()
options = parser.parse_args()
if options.quiet:
options.verbose = 0
@@ -92,15 +92,6 @@ def mitmproxy_cmdline():
console_options.eventlog = options.eventlog
console_options.intercept = options.intercept
- return console_options, proxy_config
-
-
-def mitmproxy(): # pragma: nocover
- from . import console
-
- check_versions()
- assert_utf8_env()
- console_options, proxy_config = mitmproxy_cmdline()
server = get_server(console_options.no_server, proxy_config)
m = console.ConsoleMaster(server, console_options)
@@ -110,24 +101,12 @@ def mitmproxy(): # pragma: nocover
pass
-def mitmdump_cmdline():
+def mitmdump(): # pragma: nocover
from . import dump
- parser = argparse.ArgumentParser(usage="%(prog)s [options] [filter]")
- parser.add_argument('--version', action='version', version="mitmdump" + " " + version.VERSION)
- cmdline.common_options(parser)
- parser.add_argument(
- "--keepserving",
- action="store_true", dest="keepserving", default=False,
- help="Continue serving after client playback or file read. We exit by default."
- )
- parser.add_argument(
- "-d",
- action="count", dest="flow_detail", default=1,
- help="Increase flow detail display level. Can be passed multiple times."
- )
- parser.add_argument('args', nargs=argparse.REMAINDER)
+ check_versions()
+ parser = cmdline.mitmdump()
options = parser.parse_args()
if options.quiet:
options.verbose = 0
@@ -139,14 +118,6 @@ def mitmdump_cmdline():
dump_options.keepserving = options.keepserving
dump_options.filtstr = " ".join(options.args) if options.args else None
- return dump_options, proxy_config
-
-
-def mitmdump(): # pragma: nocover
- from . import dump
-
- check_versions()
- dump_options, proxy_config = mitmdump_cmdline()
server = get_server(dump_options.no_server, proxy_config)
try:
@@ -164,44 +135,11 @@ def mitmdump(): # pragma: nocover
pass
-def mitmweb_cmdline():
+def mitmweb(): # pragma: nocover
from . import web
- parser = argparse.ArgumentParser(usage="%(prog)s [options]")
- parser.add_argument(
- '--version',
- action='version',
- version="mitmweb" + " " + version.VERSION
- )
-
- group = parser.add_argument_group("Mitmweb")
- group.add_argument(
- "--wport",
- action="store", type=int, dest="wport", default=8081,
- metavar="PORT",
- help="Mitmweb port."
- )
- group.add_argument(
- "--wiface",
- action="store", dest="wiface", default="127.0.0.1",
- metavar="IFACE",
- help="Mitmweb interface."
- )
- group.add_argument(
- "--wdebug",
- action="store_true", dest="wdebug",
- help="Turn on mitmweb debugging"
- )
-
- cmdline.common_options(parser)
- group = parser.add_argument_group(
- "Filters",
- "See help in mitmproxy for filter expression syntax."
- )
- group.add_argument(
- "-i", "--intercept", action="store",
- type=str, dest="intercept", default=None,
- help="Intercept filter expression."
- )
+
+ check_versions()
+ parser = cmdline.mitmweb()
options = parser.parse_args()
if options.quiet:
@@ -213,14 +151,7 @@ def mitmweb_cmdline():
web_options.wdebug = options.wdebug
web_options.wiface = options.wiface
web_options.wport = options.wport
- return web_options, proxy_config
-
-def mitmweb(): # pragma: nocover
- from . import web
-
- check_versions()
- web_options, proxy_config = mitmweb_cmdline()
server = get_server(web_options.no_server, proxy_config)
m = web.WebMaster(server, web_options)
diff --git a/libmproxy/onboarding/app.py b/libmproxy/onboarding/app.py
index 9b5db38a..4023fae2 100644
--- a/libmproxy/onboarding/app.py
+++ b/libmproxy/onboarding/app.py
@@ -18,12 +18,12 @@ def index():
@mapp.route("/cert/pem")
def certs_pem():
- p = os.path.join(master().server.config.confdir, config.CONF_BASENAME + "-ca-cert.pem")
+ p = os.path.join(master().server.config.cadir, config.CONF_BASENAME + "-ca-cert.pem")
return flask.Response(open(p, "rb").read(), mimetype='application/x-x509-ca-cert')
@mapp.route("/cert/p12")
def certs_p12():
- p = os.path.join(master().server.config.confdir, config.CONF_BASENAME + "-ca-cert.p12")
+ p = os.path.join(master().server.config.cadir, config.CONF_BASENAME + "-ca-cert.p12")
return flask.Response(open(p, "rb").read(), mimetype='application/x-pkcs12')
diff --git a/libmproxy/platform/windows.py b/libmproxy/platform/windows.py
index ddbbed52..066a377d 100644
--- a/libmproxy/platform/windows.py
+++ b/libmproxy/platform/windows.py
@@ -1,4 +1,4 @@
-import argparse
+import configargparse
import cPickle as pickle
from ctypes import byref, windll, Structure
from ctypes.wintypes import DWORD
@@ -361,7 +361,7 @@ class TransparentProxy(object):
if __name__ == "__main__":
- parser = argparse.ArgumentParser(description="Windows Transparent Proxy")
+ parser = configargparse.ArgumentParser(description="Windows Transparent Proxy")
parser.add_argument('--mode', choices=['forward', 'local', 'both'], default="both",
help='redirection operation mode: "forward" to only redirect forwarded packets, '
'"local" to only redirect packets originating from the local machine')
diff --git a/libmproxy/proxy/config.py b/libmproxy/proxy/config.py
index a228192a..3d373a28 100644
--- a/libmproxy/proxy/config.py
+++ b/libmproxy/proxy/config.py
@@ -7,7 +7,7 @@ from .primitives import RegularProxyMode, TransparentProxyMode, UpstreamProxyMod
TRANSPARENT_SSL_PORTS = [443, 8443]
CONF_BASENAME = "mitmproxy"
-CONF_DIR = "~/.mitmproxy"
+CA_DIR = "~/.mitmproxy"
class HostMatcher(object):
@@ -28,12 +28,27 @@ class HostMatcher(object):
class ProxyConfig:
- def __init__(self, host='', port=8080, server_version=version.NAMEVERSION,
- confdir=CONF_DIR, clientcerts=None,
- no_upstream_cert=False, body_size_limit=None,
- mode=None, upstream_server=None, http_form_in=None, http_form_out=None,
- authenticator=None, ignore_hosts=[], tcp_hosts=[],
- ciphers=None, certs=[], certforward=False, ssl_ports=TRANSPARENT_SSL_PORTS):
+ def __init__(
+ self,
+ host='',
+ port=8080,
+ server_version=version.NAMEVERSION,
+ cadir=CA_DIR,
+ clientcerts=None,
+ no_upstream_cert=False,
+ body_size_limit=None,
+ mode=None,
+ upstream_server=None,
+ http_form_in=None,
+ http_form_out=None,
+ authenticator=None,
+ ignore_hosts=[],
+ tcp_hosts=[],
+ ciphers=None,
+ certs=[],
+ certforward=False,
+ ssl_ports=TRANSPARENT_SSL_PORTS
+ ):
self.host = host
self.port = port
self.server_version = server_version
@@ -60,8 +75,8 @@ class ProxyConfig:
self.check_ignore = HostMatcher(ignore_hosts)
self.check_tcp = HostMatcher(tcp_hosts)
self.authenticator = authenticator
- self.confdir = os.path.expanduser(confdir)
- self.certstore = certutils.CertStore.from_store(self.confdir, CONF_BASENAME)
+ self.cadir = os.path.expanduser(cadir)
+ self.certstore = certutils.CertStore.from_store(self.cadir, CONF_BASENAME)
for spec, cert in certs:
self.certstore.add_cert_file(spec, cert)
self.certforward = certforward
@@ -136,7 +151,7 @@ def process_proxy_options(parser, options):
return ProxyConfig(
host=options.addr,
port=options.port,
- confdir=options.confdir,
+ cadir=options.cadir,
clientcerts=options.clientcerts,
no_upstream_cert=options.no_upstream_cert,
body_size_limit=body_size_limit,