Skip to content
Snippets Groups Projects
Unverified Commit b59a4eba authored by Richard van der Hoff's avatar Richard van der Hoff Committed by GitHub
Browse files

Updates to the federation_client script (#5447)

* py3 fixes for federation_client
* .well-known support for federation_client
parent 5c15039e
No related branches found
No related tags found
No related merge requests found
Update federation_client dev script to support `.well-known` and work with python3.
...@@ -21,7 +21,8 @@ import argparse ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment