@@ -258,20 +258,30 @@ def get_room_data(self, user_id=None, room_id=None,
258258
259259 @defer .inlineCallbacks
260260 def _check_in_room_or_world_readable (self , room_id , user_id , is_guest ):
261- if is_guest :
261+ try :
262+ # check_user_was_in_room will return the most recent membership
263+ # event for the user if:
264+ # * The user is a non-guest user, and was ever in the room
265+ # * The user is a guest user, and has joined the room
266+ # else it will throw.
267+ member_event = yield self .auth .check_user_was_in_room (room_id , user_id )
268+ defer .returnValue ((member_event .membership , member_event .event_id ))
269+ return
270+ except AuthError , auth_error :
262271 visibility = yield self .state_handler .get_current_state (
263272 room_id , EventTypes .RoomHistoryVisibility , ""
264273 )
265- if visibility .content ["history_visibility" ] == "world_readable" :
274+ if (
275+ visibility and
276+ visibility .content ["history_visibility" ] == "world_readable"
277+ ):
266278 defer .returnValue ((Membership .JOIN , None ))
267279 return
268- else :
269- raise AuthError (
270- 403 , "Guest access not allowed" , errcode = Codes .GUEST_ACCESS_FORBIDDEN
271- )
272- else :
273- member_event = yield self .auth .check_user_was_in_room (room_id , user_id )
274- defer .returnValue ((member_event .membership , member_event .event_id ))
280+ if not is_guest :
281+ raise auth_error
282+ raise AuthError (
283+ 403 , "Guest access not allowed" , errcode = Codes .GUEST_ACCESS_FORBIDDEN
284+ )
275285
276286 @defer .inlineCallbacks
277287 def get_state_events (self , user_id , room_id , is_guest = False ):
@@ -456,7 +466,7 @@ def handle_room(event):
456466 defer .returnValue (ret )
457467
458468 @defer .inlineCallbacks
459- def room_initial_sync (self , user_id , room_id , pagin_config = None ):
469+ def room_initial_sync (self , user_id , room_id , pagin_config = None , is_guest = False ):
460470 """Capture the a snapshot of a room. If user is currently a member of
461471 the room this will be what is currently in the room. If the user left
462472 the room this will be what was in the room when they left.
@@ -473,15 +483,19 @@ def room_initial_sync(self, user_id, room_id, pagin_config=None):
473483 A JSON serialisable dict with the snapshot of the room.
474484 """
475485
476- member_event = yield self .auth .check_user_was_in_room (room_id , user_id )
486+ membership , member_event_id = yield self ._check_in_room_or_world_readable (
487+ room_id ,
488+ user_id ,
489+ is_guest
490+ )
477491
478- if member_event . membership == Membership .JOIN :
492+ if membership == Membership .JOIN :
479493 result = yield self ._room_initial_sync_joined (
480- user_id , room_id , pagin_config , member_event
494+ user_id , room_id , pagin_config , membership , is_guest
481495 )
482- elif member_event . membership == Membership .LEAVE :
496+ elif membership == Membership .LEAVE :
483497 result = yield self ._room_initial_sync_parted (
484- user_id , room_id , pagin_config , member_event
498+ user_id , room_id , pagin_config , membership , member_event_id , is_guest
485499 )
486500
487501 private_user_data = []
@@ -497,19 +511,19 @@ def room_initial_sync(self, user_id, room_id, pagin_config=None):
497511
498512 @defer .inlineCallbacks
499513 def _room_initial_sync_parted (self , user_id , room_id , pagin_config ,
500- member_event ):
514+ membership , member_event_id , is_guest ):
501515 room_state = yield self .store .get_state_for_events (
502- [member_event . event_id ], None
516+ [member_event_id ], None
503517 )
504518
505- room_state = room_state [member_event . event_id ]
519+ room_state = room_state [member_event_id ]
506520
507521 limit = pagin_config .limit if pagin_config else None
508522 if limit is None :
509523 limit = 10
510524
511525 stream_token = yield self .store .get_stream_token_for_event (
512- member_event . event_id
526+ member_event_id
513527 )
514528
515529 messages , token = yield self .store .get_recent_events_for_room (
@@ -519,7 +533,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
519533 )
520534
521535 messages = yield self ._filter_events_for_client (
522- user_id , messages
536+ user_id , messages , is_guest = is_guest
523537 )
524538
525539 start_token = StreamToken (token [0 ], 0 , 0 , 0 , 0 )
@@ -528,7 +542,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
528542 time_now = self .clock .time_msec ()
529543
530544 defer .returnValue ({
531- "membership" : member_event . membership ,
545+ "membership" : membership ,
532546 "room_id" : room_id ,
533547 "messages" : {
534548 "chunk" : [serialize_event (m , time_now ) for m in messages ],
@@ -542,7 +556,7 @@ def _room_initial_sync_parted(self, user_id, room_id, pagin_config,
542556
543557 @defer .inlineCallbacks
544558 def _room_initial_sync_joined (self , user_id , room_id , pagin_config ,
545- member_event ):
559+ membership , is_guest ):
546560 current_state = yield self .state .get_current_state (
547561 room_id = room_id ,
548562 )
@@ -574,12 +588,14 @@ def _room_initial_sync_joined(self, user_id, room_id, pagin_config,
574588
575589 @defer .inlineCallbacks
576590 def get_presence ():
577- states = yield presence_handler .get_states (
578- target_users = [UserID .from_string (m .user_id ) for m in room_members ],
579- auth_user = auth_user ,
580- as_event = True ,
581- check_auth = False ,
582- )
591+ states = {}
592+ if not is_guest :
593+ states = yield presence_handler .get_states (
594+ target_users = [UserID .from_string (m .user_id ) for m in room_members ],
595+ auth_user = auth_user ,
596+ as_event = True ,
597+ check_auth = False ,
598+ )
583599
584600 defer .returnValue (states .values ())
585601
@@ -599,16 +615,15 @@ def get_presence():
599615 ).addErrback (unwrapFirstError )
600616
601617 messages = yield self ._filter_events_for_client (
602- user_id , messages
618+ user_id , messages , is_guest = is_guest , require_all_visible_for_guests = False
603619 )
604620
605621 start_token = now_token .copy_and_replace ("room_key" , token [0 ])
606622 end_token = now_token .copy_and_replace ("room_key" , token [1 ])
607623
608624 time_now = self .clock .time_msec ()
609625
610- defer .returnValue ({
611- "membership" : member_event .membership ,
626+ ret = {
612627 "room_id" : room_id ,
613628 "messages" : {
614629 "chunk" : [serialize_event (m , time_now ) for m in messages ],
@@ -618,4 +633,8 @@ def get_presence():
618633 "state" : state ,
619634 "presence" : presence ,
620635 "receipts" : receipts ,
621- })
636+ }
637+ if not is_guest :
638+ ret ["membership" ] = membership
639+
640+ defer .returnValue (ret )
0 commit comments