def _handle_request(self, request, room_id, user_id, change): logger.info("user membership change: %s in %s", user_id, room_id) user = UserID.from_string(user_id) if change == "joined": user_joined_room(self.distributor, user, room_id) elif change == "left": user_left_room(self.distributor, user, room_id) else: raise Exception("Unrecognized change: %r", change) return 200, {}
def _handle_request(self, request, room_id, user_id, change): logger.info("user membership change: %s in %s", user_id, room_id) user = UserID.from_string(user_id) if change == "joined": user_joined_room(self.distributor, user, room_id) elif change == "left": user_left_room(self.distributor, user, room_id) else: raise Exception("Unrecognized change: %r", change) return (200, {})
def on_POST(self, request, change): content = parse_json_object_from_request(request) user_id = content["user_id"] room_id = content["room_id"] logger.info("user membership change: %s in %s", user_id, room_id) user = UserID.from_string(user_id) if change == "joined": user_joined_room(self.distributor, user, room_id) elif change == "left": user_left_room(self.distributor, user, room_id) else: raise Exception("Unrecognized change: %r", change) return (200, {})
def _local_membership_update( self, requester, target, room_id, membership, prev_event_ids, txn_id=None, ratelimit=True, ): msg_handler = self.hs.get_handlers().message_handler content = {"membership": membership} if requester.is_guest: content["kind"] = "guest" event, context = yield msg_handler.create_event( { "type": EventTypes.Member, "content": content, "room_id": room_id, "sender": requester.user.to_string(), "state_key": target.to_string(), # For backwards compatibility: "membership": membership, }, token_id=requester.access_token_id, txn_id=txn_id, prev_event_ids=prev_event_ids, ) yield msg_handler.handle_new_client_event( requester, event, context, extra_users=[target], ratelimit=ratelimit, ) prev_member_event = context.current_state.get( (EventTypes.Member, target.to_string()), None) if event.membership == Membership.JOIN: if not prev_member_event or prev_member_event.membership != Membership.JOIN: # Only fire user_joined_room if the user has acutally joined the # room. Don't bother if the user is just changing their profile # info. yield user_joined_room(self.distributor, target, room_id) elif event.membership == Membership.LEAVE: if prev_member_event and prev_member_event.membership == Membership.JOIN: user_left_room(self.distributor, target, room_id)
def _local_membership_update( self, requester, target, room_id, membership, prev_event_ids, txn_id=None, ratelimit=True, ): msg_handler = self.hs.get_handlers().message_handler content = {"membership": membership} if requester.is_guest: content["kind"] = "guest" event, context = yield msg_handler.create_event( { "type": EventTypes.Member, "content": content, "room_id": room_id, "sender": requester.user.to_string(), "state_key": target.to_string(), # For backwards compatibility: "membership": membership, }, token_id=requester.access_token_id, txn_id=txn_id, prev_event_ids=prev_event_ids, ) yield msg_handler.handle_new_client_event( requester, event, context, extra_users=[target], ratelimit=ratelimit, ) prev_member_event = context.current_state.get( (EventTypes.Member, target.to_string()), None ) if event.membership == Membership.JOIN: if not prev_member_event or prev_member_event.membership != Membership.JOIN: # Only fire user_joined_room if the user has acutally joined the # room. Don't bother if the user is just changing their profile # info. yield user_joined_room(self.distributor, target, room_id) elif event.membership == Membership.LEAVE: if prev_member_event and prev_member_event.membership == Membership.JOIN: user_left_room(self.distributor, target, room_id)
def remote_join(self, remote_room_hosts, room_id, user, content): if len(remote_room_hosts) == 0: raise SynapseError(404, "No known servers") # We don't do an auth check if we are doing an invite # join dance for now, since we're kinda implicitly checking # that we are allowed to join when we decide whether or not we # need to do the invite/join dance. yield self.hs.get_handlers().federation_handler.do_invite_join( remote_room_hosts, room_id, user.to_string(), content, ) yield user_joined_room(self.distributor, user, room_id)
def send_membership_event( self, requester, event, context, remote_room_hosts=None, ratelimit=True, ): """ Change the membership status of a user in a room. Args: requester (Requester): The local user who requested the membership event. If None, certain checks, like whether this homeserver can act as the sender, will be skipped. event (SynapseEvent): The membership event. context: The context of the event. is_guest (bool): Whether the sender is a guest. room_hosts ([str]): Homeservers which are likely to already be in the room, and could be danced with in order to join this homeserver for the first time. ratelimit (bool): Whether to rate limit this request. Raises: SynapseError if there was a problem changing the membership. """ remote_room_hosts = remote_room_hosts or [] target_user = UserID.from_string(event.state_key) room_id = event.room_id if requester is not None: sender = UserID.from_string(event.sender) assert sender == requester.user, ( "Sender (%s) must be same as requester (%s)" % (sender, requester.user)) assert self.hs.is_mine( sender), "Sender must be our own: %s" % (sender, ) else: requester = Requester(target_user, None, False) message_handler = self.hs.get_handlers().message_handler prev_event = message_handler.deduplicate_state_event(event, context) if prev_event is not None: return if event.membership == Membership.JOIN: if requester.is_guest and not self._can_guest_join( context.current_state): # This should be an auth check, but guests are a local concept, # so don't really fit into the general auth process. raise AuthError(403, "Guest access not allowed") yield message_handler.handle_new_client_event( requester, event, context, extra_users=[target_user], ratelimit=ratelimit, ) prev_member_event = context.current_state.get( (EventTypes.Member, target_user.to_string()), None) if event.membership == Membership.JOIN: if not prev_member_event or prev_member_event.membership != Membership.JOIN: # Only fire user_joined_room if the user has acutally joined the # room. Don't bother if the user is just changing their profile # info. yield user_joined_room(self.distributor, target_user, room_id) elif event.membership == Membership.LEAVE: if prev_member_event and prev_member_event.membership == Membership.JOIN: user_left_room(self.distributor, target_user, room_id)
def _user_joined_room(self, target, room_id): """Implements RoomMemberHandler._user_joined_room """ return user_joined_room(self.distributor, target, room_id)
def send_membership_event( self, requester, event, context, remote_room_hosts=None, ratelimit=True, ): """ Change the membership status of a user in a room. Args: requester (Requester): The local user who requested the membership event. If None, certain checks, like whether this homeserver can act as the sender, will be skipped. event (SynapseEvent): The membership event. context: The context of the event. is_guest (bool): Whether the sender is a guest. room_hosts ([str]): Homeservers which are likely to already be in the room, and could be danced with in order to join this homeserver for the first time. ratelimit (bool): Whether to rate limit this request. Raises: SynapseError if there was a problem changing the membership. """ remote_room_hosts = remote_room_hosts or [] target_user = UserID.from_string(event.state_key) room_id = event.room_id if requester is not None: sender = UserID.from_string(event.sender) assert sender == requester.user, ( "Sender (%s) must be same as requester (%s)" % (sender, requester.user) ) assert self.hs.is_mine(sender), "Sender must be our own: %s" % (sender,) else: requester = Requester(target_user, None, False) message_handler = self.hs.get_handlers().message_handler prev_event = message_handler.deduplicate_state_event(event, context) if prev_event is not None: return if event.membership == Membership.JOIN: if requester.is_guest and not self._can_guest_join(context.current_state): # This should be an auth check, but guests are a local concept, # so don't really fit into the general auth process. raise AuthError(403, "Guest access not allowed") yield message_handler.handle_new_client_event( requester, event, context, extra_users=[target_user], ratelimit=ratelimit, ) prev_member_event = context.current_state.get( (EventTypes.Member, target_user.to_string()), None ) if event.membership == Membership.JOIN: if not prev_member_event or prev_member_event.membership != Membership.JOIN: # Only fire user_joined_room if the user has acutally joined the # room. Don't bother if the user is just changing their profile # info. yield user_joined_room(self.distributor, target_user, room_id) elif event.membership == Membership.LEAVE: if prev_member_event and prev_member_event.membership == Membership.JOIN: user_left_room(self.distributor, target_user, room_id)
def _local_membership_update( self, requester, target, room_id, membership, prev_event_ids, txn_id=None, ratelimit=True, content=None, ): if content is None: content = {} msg_handler = self.hs.get_handlers().message_handler content["membership"] = membership if requester.is_guest: content["kind"] = "guest" event, context = yield msg_handler.create_event( { "type": EventTypes.Member, "content": content, "room_id": room_id, "sender": requester.user.to_string(), "state_key": target.to_string(), # For backwards compatibility: "membership": membership, }, token_id=requester.access_token_id, txn_id=txn_id, prev_event_ids=prev_event_ids, ) # Check if this event matches the previous membership event for the user. duplicate = yield msg_handler.deduplicate_state_event(event, context) if duplicate is not None: # Discard the new event since this membership change is a no-op. return yield msg_handler.handle_new_client_event( requester, event, context, extra_users=[target], ratelimit=ratelimit, ) prev_member_event_id = context.prev_state_ids.get( (EventTypes.Member, target.to_string()), None) if event.membership == Membership.JOIN: # Only fire user_joined_room if the user has acutally joined the # room. Don't bother if the user is just changing their profile # info. newly_joined = True if prev_member_event_id: prev_member_event = yield self.store.get_event( prev_member_event_id) newly_joined = prev_member_event.membership != Membership.JOIN if newly_joined: yield user_joined_room(self.distributor, target, room_id) elif event.membership == Membership.LEAVE: if prev_member_event_id: prev_member_event = yield self.store.get_event( prev_member_event_id) if prev_member_event.membership == Membership.JOIN: user_left_room(self.distributor, target, room_id)
async def _user_joined_room(self, target: UserID, room_id: str) -> None: """Implements RoomMemberHandler._user_joined_room """ user_joined_room(self.distributor, target, room_id)