diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index e31482cfaa..8a3455ec54 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -98,7 +98,16 @@ class Auth(object):
defer.returnValue(member)
@defer.inlineCallbacks
- def check_host_in_room(self, room_id, host):
+ def check_host_in_room(self, room_id, host, context=None):
+ if context:
+ # XXX: check_host_in_room should really return True for a new
+ # room created by this home server. There are no m.room.member
+ # join events yet so we need to check for the m.room.create event
+ # instead.
+ if (u"m.room.create", u"") in context.auth_events:
+ defer.returnValue(True)
+ return
+
curr_state = yield self.state.get_current_state(room_id)
for event in curr_state:
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index d26975a88a..d0de6fd04d 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -617,8 +617,8 @@ class FederationHandler(BaseHandler):
@defer.inlineCallbacks
@log_function
- def on_backfill_request(self, origin, context, pdu_list, limit):
- in_room = yield self.auth.check_host_in_room(context, origin)
+ def on_backfill_request(self, origin, room_id, pdu_list, limit):
+ in_room = yield self.auth.check_host_in_room(room_id, origin)
if not in_room:
raise AuthError(403, "Host not in room.")
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 59719a1fae..3cb7e324fc 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -423,12 +423,13 @@ class RoomMemberHandler(BaseHandler):
is_host_in_room = yield self.auth.check_host_in_room(
event.room_id,
- self.hs.hostname
+ self.hs.hostname,
+ context=context
)
if is_host_in_room:
should_do_dance = False
- elif room_host:
+ elif room_host: # TODO: Shouldn't this be remote_room_host?
should_do_dance = True
else:
# TODO(markjh): get prev_state from snapshot
@@ -442,7 +443,8 @@ class RoomMemberHandler(BaseHandler):
should_do_dance = not self.hs.is_mine(inviter)
room_host = inviter.domain
else:
- should_do_dance = False
+ # return the same error as join_room_alias does
+ raise SynapseError(404, "No known servers")
if should_do_dance:
handler = self.hs.get_handlers().federation_handler
|