diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index 6720c6a728..21cdd6cdbe 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -258,20 +258,29 @@ class MessageHandler(BaseHandler):
@defer.inlineCallbacks
def _check_in_room_or_world_readable(self, room_id, user_id, is_guest):
- if is_guest:
- visibility = yield self.state_handler.get_current_state(
- room_id, EventTypes.RoomHistoryVisibility, ""
- )
- if visibility.content["history_visibility"] == "world_readable":
- defer.returnValue((Membership.JOIN, None))
- return
- else:
- raise AuthError(
- 403, "Guest access not allowed", errcode=Codes.GUEST_ACCESS_FORBIDDEN
- )
- else:
+ try:
+ # check_user_was_in_room will return the most recent membership
+ # event for the user if:
+ # * The user is a non-guest user, and was ever in the room
+ # * The user is a guest user, and has joined the room
+ # else it will throw.
member_event = yield self.auth.check_user_was_in_room(room_id, user_id)
defer.returnValue((member_event.membership, member_event.event_id))
+ return
+ except AuthError:
+ if not is_guest:
+ raise
+
+ visibility = yield self.state_handler.get_current_state(
+ room_id, EventTypes.RoomHistoryVisibility, ""
+ )
+ if visibility.content["history_visibility"] == "world_readable":
+ defer.returnValue((Membership.JOIN, None))
+ return
+ else:
+ raise AuthError(
+ 403, "Guest access not allowed", errcode=Codes.GUEST_ACCESS_FORBIDDEN
+ )
@defer.inlineCallbacks
def get_state_events(self, user_id, room_id, is_guest=False):
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 7d18218cd9..0266926fc7 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -765,7 +765,7 @@ class RoomListHandler(BaseHandler):
class RoomContextHandler(BaseHandler):
@defer.inlineCallbacks
- def get_event_context(self, user, room_id, event_id, limit):
+ def get_event_context(self, user, room_id, event_id, limit, is_guest):
"""Retrieves events, pagination tokens and state around a given event
in a room.
@@ -789,11 +789,17 @@ class RoomContextHandler(BaseHandler):
)
results["events_before"] = yield self._filter_events_for_client(
- user.to_string(), results["events_before"]
+ user.to_string(),
+ results["events_before"],
+ is_guest=is_guest,
+ require_all_visible_for_guests=False
)
results["events_after"] = yield self._filter_events_for_client(
- user.to_string(), results["events_after"]
+ user.to_string(),
+ results["events_after"],
+ is_guest=is_guest,
+ require_all_visible_for_guests=False
)
if results["events_after"]:
|