|
|
|
@ -63,7 +63,7 @@ class RoomMemberHandler(object): |
|
|
|
|
self.directory_handler = hs.get_handlers().directory_handler |
|
|
|
|
self.registration_handler = hs.get_handlers().registration_handler |
|
|
|
|
self.profile_handler = hs.get_profile_handler() |
|
|
|
|
self.event_creation_hander = hs.get_event_creation_handler() |
|
|
|
|
self.event_creation_handler = hs.get_event_creation_handler() |
|
|
|
|
|
|
|
|
|
self.member_linearizer = Linearizer(name="member") |
|
|
|
|
|
|
|
|
@ -161,6 +161,8 @@ class RoomMemberHandler(object): |
|
|
|
|
ratelimit=True, |
|
|
|
|
content=None, |
|
|
|
|
): |
|
|
|
|
user_id = target.to_string() |
|
|
|
|
|
|
|
|
|
if content is None: |
|
|
|
|
content = {} |
|
|
|
|
|
|
|
|
@ -168,14 +170,14 @@ class RoomMemberHandler(object): |
|
|
|
|
if requester.is_guest: |
|
|
|
|
content["kind"] = "guest" |
|
|
|
|
|
|
|
|
|
event, context = yield self.event_creation_hander.create_event( |
|
|
|
|
event, context = yield self.event_creation_handler.create_event( |
|
|
|
|
requester, |
|
|
|
|
{ |
|
|
|
|
"type": EventTypes.Member, |
|
|
|
|
"content": content, |
|
|
|
|
"room_id": room_id, |
|
|
|
|
"sender": requester.user.to_string(), |
|
|
|
|
"state_key": target.to_string(), |
|
|
|
|
"state_key": user_id, |
|
|
|
|
|
|
|
|
|
# For backwards compatibility: |
|
|
|
|
"membership": membership, |
|
|
|
@ -186,14 +188,14 @@ class RoomMemberHandler(object): |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
# Check if this event matches the previous membership event for the user. |
|
|
|
|
duplicate = yield self.event_creation_hander.deduplicate_state_event( |
|
|
|
|
duplicate = yield self.event_creation_handler.deduplicate_state_event( |
|
|
|
|
event, context, |
|
|
|
|
) |
|
|
|
|
if duplicate is not None: |
|
|
|
|
# Discard the new event since this membership change is a no-op. |
|
|
|
|
defer.returnValue(duplicate) |
|
|
|
|
|
|
|
|
|
yield self.event_creation_hander.handle_new_client_event( |
|
|
|
|
yield self.event_creation_handler.handle_new_client_event( |
|
|
|
|
requester, |
|
|
|
|
event, |
|
|
|
|
context, |
|
|
|
@ -204,12 +206,12 @@ class RoomMemberHandler(object): |
|
|
|
|
prev_state_ids = yield context.get_prev_state_ids(self.store) |
|
|
|
|
|
|
|
|
|
prev_member_event_id = prev_state_ids.get( |
|
|
|
|
(EventTypes.Member, target.to_string()), |
|
|
|
|
(EventTypes.Member, user_id), |
|
|
|
|
None |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if event.membership == Membership.JOIN: |
|
|
|
|
# Only fire user_joined_room if the user has acutally joined the |
|
|
|
|
# Only fire user_joined_room if the user has actually joined the |
|
|
|
|
# room. Don't bother if the user is just changing their profile |
|
|
|
|
# info. |
|
|
|
|
newly_joined = True |
|
|
|
@ -218,6 +220,18 @@ class RoomMemberHandler(object): |
|
|
|
|
newly_joined = prev_member_event.membership != Membership.JOIN |
|
|
|
|
if newly_joined: |
|
|
|
|
yield self._user_joined_room(target, room_id) |
|
|
|
|
|
|
|
|
|
# Copy over direct message status and room tags if this is a join |
|
|
|
|
# on an upgraded room |
|
|
|
|
|
|
|
|
|
# Check if this is an upgraded room |
|
|
|
|
predecessor = yield self.store.get_room_predecessor(room_id) |
|
|
|
|
|
|
|
|
|
if predecessor: |
|
|
|
|
# It is an upgraded room. Copy over old tags |
|
|
|
|
self.copy_room_tags_and_direct_to_room( |
|
|
|
|
predecessor["room_id"], room_id, user_id, |
|
|
|
|
) |
|
|
|
|
elif event.membership == Membership.LEAVE: |
|
|
|
|
if prev_member_event_id: |
|
|
|
|
prev_member_event = yield self.store.get_event(prev_member_event_id) |
|
|
|
@ -226,6 +240,55 @@ class RoomMemberHandler(object): |
|
|
|
|
|
|
|
|
|
defer.returnValue(event) |
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
def copy_room_tags_and_direct_to_room( |
|
|
|
|
self, |
|
|
|
|
old_room_id, |
|
|
|
|
new_room_id, |
|
|
|
|
user_id, |
|
|
|
|
): |
|
|
|
|
"""Copies the tags and direct room state from one room to another. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
old_room_id (str) |
|
|
|
|
new_room_id (str) |
|
|
|
|
user_id (str) |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
Deferred[None] |
|
|
|
|
""" |
|
|
|
|
# Retrieve user account data for predecessor room |
|
|
|
|
user_account_data, _ = yield self.store.get_account_data_for_user( |
|
|
|
|
user_id, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
# Copy direct message state if applicable |
|
|
|
|
direct_rooms = user_account_data.get("m.direct", {}) |
|
|
|
|
|
|
|
|
|
# Check which key this room is under |
|
|
|
|
if isinstance(direct_rooms, dict): |
|
|
|
|
for key, room_id_list in direct_rooms.items(): |
|
|
|
|
if old_room_id in room_id_list and new_room_id not in room_id_list: |
|
|
|
|
# Add new room_id to this key |
|
|
|
|
direct_rooms[key].append(new_room_id) |
|
|
|
|
|
|
|
|
|
# Save back to user's m.direct account data |
|
|
|
|
yield self.store.add_account_data_for_user( |
|
|
|
|
user_id, "m.direct", direct_rooms, |
|
|
|
|
) |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
# Copy room tags if applicable |
|
|
|
|
room_tags = yield self.store.get_tags_for_room( |
|
|
|
|
user_id, old_room_id, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
# Copy each room tag to the new room |
|
|
|
|
for tag, tag_content in room_tags.items(): |
|
|
|
|
yield self.store.add_tag_to_room( |
|
|
|
|
user_id, new_room_id, tag, tag_content |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
|
def update_membership( |
|
|
|
|
self, |
|
|
|
@ -493,7 +556,7 @@ class RoomMemberHandler(object): |
|
|
|
|
else: |
|
|
|
|
requester = synapse.types.create_requester(target_user) |
|
|
|
|
|
|
|
|
|
prev_event = yield self.event_creation_hander.deduplicate_state_event( |
|
|
|
|
prev_event = yield self.event_creation_handler.deduplicate_state_event( |
|
|
|
|
event, context, |
|
|
|
|
) |
|
|
|
|
if prev_event is not None: |
|
|
|
@ -513,7 +576,7 @@ class RoomMemberHandler(object): |
|
|
|
|
if is_blocked: |
|
|
|
|
raise SynapseError(403, "This room has been blocked on this server") |
|
|
|
|
|
|
|
|
|
yield self.event_creation_hander.handle_new_client_event( |
|
|
|
|
yield self.event_creation_handler.handle_new_client_event( |
|
|
|
|
requester, |
|
|
|
|
event, |
|
|
|
|
context, |
|
|
|
@ -527,7 +590,7 @@ class RoomMemberHandler(object): |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
if event.membership == Membership.JOIN: |
|
|
|
|
# Only fire user_joined_room if the user has acutally joined the |
|
|
|
|
# Only fire user_joined_room if the user has actually joined the |
|
|
|
|
# room. Don't bother if the user is just changing their profile |
|
|
|
|
# info. |
|
|
|
|
newly_joined = True |
|
|
|
@ -755,7 +818,7 @@ class RoomMemberHandler(object): |
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
yield self.event_creation_hander.create_and_send_nonmember_event( |
|
|
|
|
yield self.event_creation_handler.create_and_send_nonmember_event( |
|
|
|
|
requester, |
|
|
|
|
{ |
|
|
|
|
"type": EventTypes.ThirdPartyInvite, |
|
|
|
|