Skip to content

Commit

Permalink
Fix federation_client to send the right Host
Browse files Browse the repository at this point in the history
This appears to have stopped working since matrix.org moved to cloudflare. The
Host header should match the name of the server, not whatever is in the SRV
record.
  • Loading branch information
richvdh committed Jun 12, 2018
1 parent 187a546 commit 96bad44
Showing 1 changed file with 51 additions and 14 deletions.
65 changes: 51 additions & 14 deletions scripts-dev/federation_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,22 @@
from __future__ import print_function

import argparse
from urlparse import urlparse, urlunparse

import nacl.signing
import json
import base64
import requests
import sys

from requests.adapters import HTTPAdapter
import srvlookup
import yaml

# uncomment the following to enable debug logging of http requests
#from httplib import HTTPConnection
#HTTPConnection.debuglevel = 1

def encode_base64(input_bytes):
"""Encode bytes as a base64 string without any padding."""

Expand Down Expand Up @@ -113,17 +121,6 @@ def read_signing_keys(stream):
return keys


def lookup(destination, path):
if ":" in destination:
return "https://%s%s" % (destination, path)
else:
try:
srv = srvlookup.lookup("matrix", "tcp", destination)[0]
return "https://%s:%d%s" % (srv.host, srv.port, path)
except:
return "https://%s:%d%s" % (destination, 8448, path)


def request_json(method, origin_name, origin_key, destination, path, content):
if method is None:
if content is None:
Expand Down Expand Up @@ -152,13 +149,19 @@ def request_json(method, origin_name, origin_key, destination, path, content):
authorization_headers.append(bytes(header))
print ("Authorization: %s" % header, file=sys.stderr)

dest = lookup(destination, path)
dest = "matrix://%s%s" % (destination, path)
print ("Requesting %s" % dest, file=sys.stderr)

result = requests.request(
s = requests.Session()
s.mount("matrix://", MatrixConnectionAdapter())

result = s.request(
method=method,
url=dest,
headers={"Authorization": authorization_headers[0]},
headers={
"Host": destination,
"Authorization": authorization_headers[0]
},
verify=False,
data=content,
)
Expand Down Expand Up @@ -242,5 +245,39 @@ def read_args_from_config(args):
args.signing_key_path = config['signing_key_path']


class MatrixConnectionAdapter(HTTPAdapter):
@staticmethod
def lookup(s):
if s[-1] == ']':
# ipv6 literal (with no port)
return s, 8448

if ":" in s:
out = s.rsplit(":",1)
try:
port = int(out[1])
except ValueError:
raise ValueError("Invalid host:port '%s'" % s)
return out[0], port

try:
srv = srvlookup.lookup("matrix", "tcp", s)[0]
return srv.host, srv.port
except:
return s, 8448

def get_connection(self, url, proxies=None):
parsed = urlparse(url)

(host, port) = self.lookup(parsed.netloc)
netloc = "%s:%d" % (host, port)
print("Connecting to %s" % (netloc,), file=sys.stderr)
url = urlunparse((
"https", netloc, parsed.path, parsed.params, parsed.query,
parsed.fragment,
))
return super(MatrixConnectionAdapter, self).get_connection(url, proxies)


if __name__ == "__main__":
main()

0 comments on commit 96bad44

Please sign in to comment.