SYN-154: Tweak how the m.room.create check is done.
Don't perform the check in auth.is_host_in_room but instead do it in _do_join
and also assert that there are no m.room.members in the room before doing so.
2 files changed, 12 insertions, 12 deletions
diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 8a3455ec54..e31482cfaa 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -98,16 +98,7 @@ class Auth(object):
defer.returnValue(member)
@defer.inlineCallbacks
- 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
-
+ def check_host_in_room(self, room_id, host):
curr_state = yield self.state.get_current_state(room_id)
for event in curr_state:
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 3cb7e324fc..16c6628292 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -423,9 +423,18 @@ class RoomMemberHandler(BaseHandler):
is_host_in_room = yield self.auth.check_host_in_room(
event.room_id,
- self.hs.hostname,
- context=context
+ self.hs.hostname
)
+ if not is_host_in_room:
+ # is *anyone* in the room?
+ room_member_keys = [
+ v for (k,v) in context.current_state.keys() if k == "m.room.member"
+ ]
+ if len(room_member_keys) == 0:
+ # has the room been created so we can join it?
+ create_event = context.current_state.get(("m.room.create", ""))
+ if create_event:
+ is_host_in_room = True
if is_host_in_room:
should_do_dance = False
|