mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-28 07:00:51 +03:00
Updates to the federation_client script (#5447)
* py3 fixes for federation_client * .well-known support for federation_client
This commit is contained in:
parent
5c15039e06
commit
b59a4eba64
2 changed files with 39 additions and 5 deletions
1
changelog.d/5447.misc
Normal file
1
changelog.d/5447.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Update federation_client dev script to support `.well-known` and work with python3.
|
|
@ -21,7 +21,8 @@ import argparse
|
||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
import sys
|
import sys
|
||||||
from urlparse import urlparse, urlunparse
|
|
||||||
|
from six.moves.urllib import parse as urlparse
|
||||||
|
|
||||||
import nacl.signing
|
import nacl.signing
|
||||||
import requests
|
import requests
|
||||||
|
@ -145,7 +146,7 @@ def request_json(method, origin_name, origin_key, destination, path, content):
|
||||||
|
|
||||||
for key, sig in signed_json["signatures"][origin_name].items():
|
for key, sig in signed_json["signatures"][origin_name].items():
|
||||||
header = "X-Matrix origin=%s,key=\"%s\",sig=\"%s\"" % (origin_name, key, sig)
|
header = "X-Matrix origin=%s,key=\"%s\",sig=\"%s\"" % (origin_name, key, sig)
|
||||||
authorization_headers.append(bytes(header))
|
authorization_headers.append(header.encode("ascii"))
|
||||||
print("Authorization: %s" % header, file=sys.stderr)
|
print("Authorization: %s" % header, file=sys.stderr)
|
||||||
|
|
||||||
dest = "matrix://%s%s" % (destination, path)
|
dest = "matrix://%s%s" % (destination, path)
|
||||||
|
@ -250,7 +251,7 @@ def read_args_from_config(args):
|
||||||
|
|
||||||
class MatrixConnectionAdapter(HTTPAdapter):
|
class MatrixConnectionAdapter(HTTPAdapter):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def lookup(s):
|
def lookup(s, skip_well_known=False):
|
||||||
if s[-1] == ']':
|
if s[-1] == ']':
|
||||||
# ipv6 literal (with no port)
|
# ipv6 literal (with no port)
|
||||||
return s, 8448
|
return s, 8448
|
||||||
|
@ -263,19 +264,51 @@ class MatrixConnectionAdapter(HTTPAdapter):
|
||||||
raise ValueError("Invalid host:port '%s'" % s)
|
raise ValueError("Invalid host:port '%s'" % s)
|
||||||
return out[0], port
|
return out[0], port
|
||||||
|
|
||||||
|
# try a .well-known lookup
|
||||||
|
if not skip_well_known:
|
||||||
|
well_known = MatrixConnectionAdapter.get_well_known(s)
|
||||||
|
if well_known:
|
||||||
|
return MatrixConnectionAdapter.lookup(
|
||||||
|
well_known, skip_well_known=True
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
srv = srvlookup.lookup("matrix", "tcp", s)[0]
|
srv = srvlookup.lookup("matrix", "tcp", s)[0]
|
||||||
return srv.host, srv.port
|
return srv.host, srv.port
|
||||||
except Exception:
|
except Exception:
|
||||||
return s, 8448
|
return s, 8448
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_well_known(server_name):
|
||||||
|
uri = "https://%s/.well-known/matrix/server" % (server_name, )
|
||||||
|
print("fetching %s" % (uri, ), file=sys.stderr)
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = requests.get(uri)
|
||||||
|
if resp.status_code != 200:
|
||||||
|
print("%s gave %i" % (uri, resp.status_code), file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
parsed_well_known = resp.json()
|
||||||
|
if not isinstance(parsed_well_known, dict):
|
||||||
|
raise Exception("not a dict")
|
||||||
|
if "m.server" not in parsed_well_known:
|
||||||
|
raise Exception("Missing key 'm.server'")
|
||||||
|
new_name = parsed_well_known['m.server']
|
||||||
|
print("well-known lookup gave %s" % (new_name, ), file=sys.stderr)
|
||||||
|
return new_name
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("Invalid response from %s: %s" % (uri, e, ), file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
def get_connection(self, url, proxies=None):
|
def get_connection(self, url, proxies=None):
|
||||||
parsed = urlparse(url)
|
parsed = urlparse.urlparse(url)
|
||||||
|
|
||||||
(host, port) = self.lookup(parsed.netloc)
|
(host, port) = self.lookup(parsed.netloc)
|
||||||
netloc = "%s:%d" % (host, port)
|
netloc = "%s:%d" % (host, port)
|
||||||
print("Connecting to %s" % (netloc,), file=sys.stderr)
|
print("Connecting to %s" % (netloc,), file=sys.stderr)
|
||||||
url = urlunparse(
|
url = urlparse.urlunparse(
|
||||||
("https", netloc, parsed.path, parsed.params, parsed.query, parsed.fragment)
|
("https", netloc, parsed.path, parsed.params, parsed.query, parsed.fragment)
|
||||||
)
|
)
|
||||||
return super(MatrixConnectionAdapter, self).get_connection(url, proxies)
|
return super(MatrixConnectionAdapter, self).get_connection(url, proxies)
|
||||||
|
|
Loading…
Reference in a new issue