summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/api/auth.py11
-rw-r--r--synapse/handlers/federation.py4
-rw-r--r--synapse/handlers/room.py8
3 files changed, 17 insertions, 6 deletions
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