diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2018-07-03 14:36:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-03 14:36:14 +0100 |
commit | 508196e08a834496daa1bfc5f561e69a430e270c (patch) | |
tree | 50db8e7af5ced37cc7bc06c2f4c2f1a35a4ad3f6 /synapse/http | |
parent | Merge pull request #3470 from matrix-org/matthew/fix-utf8-logging (diff) | |
download | synapse-508196e08a834496daa1bfc5f561e69a430e270c.tar.xz |
Reject invalid server names (#3480)
Make sure that server_names used in auth headers are sane, and reject them with a sensible error code, before they disappear off into the depths of the system.
Diffstat (limited to 'synapse/http')
-rw-r--r-- | synapse/http/endpoint.py | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/synapse/http/endpoint.py b/synapse/http/endpoint.py index 80da870584..5a9cbb3324 100644 --- a/synapse/http/endpoint.py +++ b/synapse/http/endpoint.py @@ -38,6 +38,36 @@ _Server = collections.namedtuple( ) +def parse_server_name(server_name): + """Split a server name into host/port parts. + + Does some basic sanity checking of the + + Args: + server_name (str): server name to parse + + Returns: + Tuple[str, int|None]: host/port parts. + + Raises: + ValueError if the server name could not be parsed. + """ + try: + if server_name[-1] == ']': + # ipv6 literal, hopefully + if server_name[0] != '[': + raise Exception() + + return server_name, None + + domain_port = server_name.rsplit(":", 1) + domain = domain_port[0] + port = int(domain_port[1]) if domain_port[1:] else None + return domain, port + except Exception: + raise ValueError("Invalid server name '%s'" % server_name) + + def matrix_federation_endpoint(reactor, destination, ssl_context_factory=None, timeout=None): """Construct an endpoint for the given matrix destination. @@ -50,9 +80,7 @@ def matrix_federation_endpoint(reactor, destination, ssl_context_factory=None, timeout (int): connection timeout in seconds """ - domain_port = destination.split(":") - domain = domain_port[0] - port = int(domain_port[1]) if domain_port[1:] else None + domain, port = parse_server_name(destination) endpoint_kw_args = {} |