mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
Add support for named constants in the --ssl-version flag
Fixes #1114 Co-Authored-By: Brett Randall <javabrett@gmail.com> Signed-off-by: Brett Randall <javabrett@gmail.com>
This commit is contained in:
parent
3627c1cff5
commit
c66957bbe9
1
THANKS
1
THANKS
@ -31,6 +31,7 @@ Berker Peksag <berker.peksag@gmail.com>
|
|||||||
bninja <andrew@poundpay.com>
|
bninja <andrew@poundpay.com>
|
||||||
Bob Hagemann <bob+code@twilio.com>
|
Bob Hagemann <bob+code@twilio.com>
|
||||||
Bobby Beckmann <bobby@macs-MacBook-Pro.local>
|
Bobby Beckmann <bobby@macs-MacBook-Pro.local>
|
||||||
|
Brett Randall <javabrett@gmail.com>
|
||||||
Brian Rosner <brosner@gmail.com>
|
Brian Rosner <brosner@gmail.com>
|
||||||
Bruno Bigras <bigras.bruno@gmail.com>
|
Bruno Bigras <bigras.bruno@gmail.com>
|
||||||
Caleb Brown <git@calebbrown.id.au>
|
Caleb Brown <git@calebbrown.id.au>
|
||||||
|
|||||||
@ -344,6 +344,28 @@ def validate_pos_int(val):
|
|||||||
return val
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def validate_ssl_version(val):
|
||||||
|
ssl_versions = {}
|
||||||
|
for protocol in [p for p in dir(ssl) if p.startswith("PROTOCOL_")]:
|
||||||
|
ssl_versions[protocol[9:]] = getattr(ssl, protocol)
|
||||||
|
if val in ssl_versions:
|
||||||
|
# string matching PROTOCOL_...
|
||||||
|
return ssl_versions[val]
|
||||||
|
|
||||||
|
try:
|
||||||
|
intval = validate_pos_int(val)
|
||||||
|
if intval in ssl_versions.values():
|
||||||
|
# positive int matching a protocol int constant
|
||||||
|
return intval
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
# negative integer or not an integer
|
||||||
|
# drop this in favour of the more descriptive ValueError below
|
||||||
|
pass
|
||||||
|
|
||||||
|
raise ValueError("Invalid ssl_version: %s. Valid options: %s"
|
||||||
|
% (val, ', '.join(ssl_versions)))
|
||||||
|
|
||||||
|
|
||||||
def validate_string(val):
|
def validate_string(val):
|
||||||
if val is None:
|
if val is None:
|
||||||
return None
|
return None
|
||||||
@ -1861,14 +1883,31 @@ class SSLVersion(Setting):
|
|||||||
name = "ssl_version"
|
name = "ssl_version"
|
||||||
section = "SSL"
|
section = "SSL"
|
||||||
cli = ["--ssl-version"]
|
cli = ["--ssl-version"]
|
||||||
validator = validate_pos_int
|
validator = validate_ssl_version
|
||||||
default = ssl.PROTOCOL_SSLv23
|
default = ssl.PROTOCOL_SSLv23
|
||||||
desc = """\
|
desc = """\
|
||||||
SSL version to use (see stdlib ssl module's)
|
SSL version to use.
|
||||||
|
|
||||||
|
============= ============
|
||||||
|
--ssl-version Description
|
||||||
|
============= ============
|
||||||
|
SSLv3 SSLv3 is not-secure and is strongly discouraged.
|
||||||
|
SSLv23 Alias for TLS. Deprecated in Python 3.6, use TLS.
|
||||||
|
TLS Negotiate highest possible version between client/server.
|
||||||
|
Can yield SSL. (Python 3.6+)
|
||||||
|
TLSv1 TLS 1.0
|
||||||
|
TLSv1_1 TLS 1.1 (Python 3.4+)
|
||||||
|
TLSv2 TLS 1.2 (Python 3.4+)
|
||||||
|
TLS_SERVER Auto-negotiate the highest protocol version like TLS,
|
||||||
|
but only support server-side SSLSocket connections.
|
||||||
|
(Python 3.6+)
|
||||||
|
|
||||||
.. versionchanged:: 19.7
|
.. versionchanged:: 19.7
|
||||||
The default value has been changed from ``ssl.PROTOCOL_TLSv1`` to
|
The default value has been changed from ``ssl.PROTOCOL_TLSv1`` to
|
||||||
``ssl.PROTOCOL_SSLv23``.
|
``ssl.PROTOCOL_SSLv23``.
|
||||||
|
.. versionchanged:: 20.0
|
||||||
|
This setting now accepts string names based on ``ssl.PROTOCOL_``
|
||||||
|
constants.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class CertReqs(Setting):
|
class CertReqs(Setting):
|
||||||
|
|||||||
@ -386,3 +386,46 @@ def test_umask_config(options, expected):
|
|||||||
with AltArgs(cmdline):
|
with AltArgs(cmdline):
|
||||||
app = NoConfigApp()
|
app = NoConfigApp()
|
||||||
assert app.cfg.umask == expected
|
assert app.cfg.umask == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("options, expected", [
|
||||||
|
(["--ssl-version", "SSLv23"], 2),
|
||||||
|
(["--ssl-version", "TLSv1"], 3),
|
||||||
|
(["--ssl-version", "2"], 2),
|
||||||
|
(["--ssl-version", "3"], 3),
|
||||||
|
])
|
||||||
|
def test_ssl_version_named_constants_python3(options, expected):
|
||||||
|
_test_ssl_version(options, expected)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(sys.version_info < (3, 6),
|
||||||
|
reason="requires python3.6+")
|
||||||
|
@pytest.mark.parametrize("options, expected", [
|
||||||
|
(["--ssl-version", "TLS"], 2),
|
||||||
|
(["--ssl-version", "TLSv1_1"], 4),
|
||||||
|
(["--ssl-version", "TLSv1_2"], 5),
|
||||||
|
(["--ssl-version", "TLS_SERVER"], 17),
|
||||||
|
])
|
||||||
|
def test_ssl_version_named_constants_python36(options, expected):
|
||||||
|
_test_ssl_version(options, expected)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("ssl_version", [
|
||||||
|
"FOO",
|
||||||
|
"-99",
|
||||||
|
"99991234"
|
||||||
|
])
|
||||||
|
def test_ssl_version_bad(ssl_version):
|
||||||
|
c = config.Config()
|
||||||
|
with pytest.raises(ValueError) as exc:
|
||||||
|
c.set("ssl_version", ssl_version)
|
||||||
|
assert 'Valid options' in str(exc.value)
|
||||||
|
assert "TLSv" in str(exc.value)
|
||||||
|
|
||||||
|
|
||||||
|
def _test_ssl_version(options, expected):
|
||||||
|
cmdline = ["prog_name"]
|
||||||
|
cmdline.extend(options)
|
||||||
|
with AltArgs(cmdline):
|
||||||
|
app = NoConfigApp()
|
||||||
|
assert app.cfg.ssl_version == expected
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user