diff --git a/synapse/federation/federation_client.py b/synapse/federation/federation_client.py
index f5e346cdbc..bf22913d4f 100644
--- a/synapse/federation/federation_client.py
+++ b/synapse/federation/federation_client.py
@@ -25,6 +25,7 @@ from synapse.api.errors import (
from synapse.util import unwrapFirstError
from synapse.util.caches.expiringcache import ExpiringCache
from synapse.util.logutils import log_function
+from synapse.util.thirdpartyinvites import ThirdPartyInvites
from synapse.events import FrozenEvent
import synapse.metrics
@@ -356,18 +357,22 @@ class FederationClient(FederationBase):
defer.returnValue(signed_auth)
@defer.inlineCallbacks
- def make_join(self, destinations, room_id, user_id):
+ def make_join(self, destinations, room_id, user_id, content):
for destination in destinations:
if destination == self.server_name:
continue
+ args = {}
+ if ThirdPartyInvites.has_join_keys(content):
+ ThirdPartyInvites.copy_join_keys(content, args)
try:
ret = yield self.transport_layer.make_join(
- destination, room_id, user_id
+ destination, room_id, user_id, args
)
pdu_dict = ret["event"]
+
logger.debug("Got response to make_join: %s", pdu_dict)
defer.returnValue(
diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py
index 725c6f3fa5..d71ab44271 100644
--- a/synapse/federation/federation_server.py
+++ b/synapse/federation/federation_server.py
@@ -23,10 +23,12 @@ from synapse.util.logutils import log_function
from synapse.events import FrozenEvent
import synapse.metrics
-from synapse.api.errors import FederationError, SynapseError
+from synapse.api.errors import FederationError, SynapseError, Codes
from synapse.crypto.event_signing import compute_event_signature
+from synapse.util.thirdpartyinvites import ThirdPartyInvites
+
import simplejson as json
import logging
@@ -228,8 +230,19 @@ class FederationServer(FederationBase):
)
@defer.inlineCallbacks
- def on_make_join_request(self, room_id, user_id):
- pdu = yield self.handler.on_make_join_request(room_id, user_id)
+ def on_make_join_request(self, room_id, user_id, query):
+ threepid_details = {}
+ if ThirdPartyInvites.has_join_keys(query):
+ for k in ThirdPartyInvites.JOIN_KEYS:
+ if not isinstance(query[k], list) or len(query[k]) != 1:
+ raise FederationError(
+ "FATAL",
+ Codes.MISSING_PARAM,
+ "key %s value %s" % (k, query[k],),
+ None
+ )
+ threepid_details[k] = query[k][0]
+ pdu = yield self.handler.on_make_join_request(room_id, user_id, threepid_details)
time_now = self._clock.time_msec()
defer.returnValue({"event": pdu.get_pdu_json(time_now)})
diff --git a/synapse/federation/transport/client.py b/synapse/federation/transport/client.py
index ced703364b..ae4195e83a 100644
--- a/synapse/federation/transport/client.py
+++ b/synapse/federation/transport/client.py
@@ -160,13 +160,14 @@ class TransportLayerClient(object):
@defer.inlineCallbacks
@log_function
- def make_join(self, destination, room_id, user_id, retry_on_dns_fail=True):
+ def make_join(self, destination, room_id, user_id, args={}):
path = PREFIX + "/make_join/%s/%s" % (room_id, user_id)
content = yield self.client.get_json(
destination=destination,
path=path,
- retry_on_dns_fail=retry_on_dns_fail,
+ args=args,
+ retry_on_dns_fail=True,
)
defer.returnValue(content)
diff --git a/synapse/federation/transport/server.py b/synapse/federation/transport/server.py
index 36f250e1a3..6e394f039e 100644
--- a/synapse/federation/transport/server.py
+++ b/synapse/federation/transport/server.py
@@ -292,7 +292,7 @@ class FederationMakeJoinServlet(BaseFederationServlet):
@defer.inlineCallbacks
def on_GET(self, origin, content, query, context, user_id):
- content = yield self.handler.on_make_join_request(context, user_id)
+ content = yield self.handler.on_make_join_request(context, user_id, query)
defer.returnValue((200, content))
|