Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit fc27ca9

Browse files
committed
Merge pull request #369 from matrix-org/daniel/guestnonevents
Return non-room events from guest /events calls
2 parents 018b504 + 468a2ed commit fc27ca9

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

synapse/notifier.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515

1616
from twisted.internet import defer
17+
from synapse.api.constants import EventTypes
18+
from synapse.api.errors import AuthError
1719

1820
from synapse.util.logutils import log_function
1921
from synapse.util.async import run_on_reactor, ObservableDeferred
@@ -346,9 +348,9 @@ def get_events_for(self, user, pagination_config, timeout,
346348

347349
room_ids = []
348350
if is_guest:
349-
# TODO(daniel): Deal with non-room events too
350-
only_room_events = True
351351
if guest_room_id:
352+
if not self._is_world_readable(guest_room_id):
353+
raise AuthError(403, "Guest access not allowed")
352354
room_ids = [guest_room_id]
353355
else:
354356
rooms = yield self.store.get_rooms_for_user(user.to_string())
@@ -361,6 +363,7 @@ def check_for_updates(before_token, after_token):
361363

362364
events = []
363365
end_token = from_token
366+
364367
for name, source in self.event_sources.sources.items():
365368
keyname = "%s_key" % name
366369
before_id = getattr(before_token, keyname)
@@ -377,7 +380,7 @@ def check_for_updates(before_token, after_token):
377380
room_ids=room_ids,
378381
)
379382

380-
if is_guest:
383+
if name == "room":
381384
room_member_handler = self.hs.get_handlers().room_member_handler
382385
new_events = yield room_member_handler._filter_events_for_client(
383386
user.to_string(),
@@ -403,6 +406,17 @@ def check_for_updates(before_token, after_token):
403406

404407
defer.returnValue(result)
405408

409+
@defer.inlineCallbacks
410+
def _is_world_readable(self, room_id):
411+
state = yield self.hs.get_state_handler().get_current_state(
412+
room_id,
413+
EventTypes.RoomHistoryVisibility
414+
)
415+
if state and "history_visibility" in state.content:
416+
defer.returnValue(state.content["history_visibility"] == "world_readable")
417+
else:
418+
defer.returnValue(False)
419+
406420
@log_function
407421
def remove_expired_streams(self):
408422
time_now_ms = self.clock.time_msec()

tests/rest/client/v1/test_presence.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,9 @@ def get_rooms_for_user(user):
321321
hs.handlers.room_member_handler.get_room_members = (
322322
lambda r: self.room_members if r == "a-room" else []
323323
)
324+
hs.handlers.room_member_handler._filter_events_for_client = (
325+
lambda user_id, events, **kwargs: events
326+
)
324327

325328
self.mock_datastore = hs.get_datastore()
326329
self.mock_datastore.get_app_service_by_token = Mock(return_value=None)

0 commit comments

Comments
 (0)