Correctly create power level event during initial room creation (#14361)
This commit is contained in:
parent
2193513346
commit
7894251bce
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug introduced in v1.71.0rc1 where the power level event was incorrectly created during initial room creation.
|
|
@ -1080,6 +1080,19 @@ class RoomCreationHandler:
|
||||||
for_batch: bool,
|
for_batch: bool,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
|
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
|
||||||
|
"""
|
||||||
|
Creates an event and associated event context.
|
||||||
|
Args:
|
||||||
|
etype: the type of event to be created
|
||||||
|
content: content of the event
|
||||||
|
for_batch: whether the event is being created for batch persisting. If
|
||||||
|
bool for_batch is true, this will create an event using the prev_event_ids,
|
||||||
|
and will create an event context for the event using the parameters state_map
|
||||||
|
and current_state_group, thus these parameters must be provided in this
|
||||||
|
case if for_batch is True. The subsequently created event and context
|
||||||
|
are suitable for being batched up and bulk persisted to the database
|
||||||
|
with other similarly created events.
|
||||||
|
"""
|
||||||
nonlocal depth
|
nonlocal depth
|
||||||
nonlocal prev_event
|
nonlocal prev_event
|
||||||
|
|
||||||
|
@ -1139,13 +1152,21 @@ class RoomCreationHandler:
|
||||||
depth += 1
|
depth += 1
|
||||||
state_map[(EventTypes.Member, creator.user.to_string())] = member_event_id
|
state_map[(EventTypes.Member, creator.user.to_string())] = member_event_id
|
||||||
|
|
||||||
|
# we need the state group of the membership event as it is the current state group
|
||||||
|
event_to_state = (
|
||||||
|
await self._storage_controllers.state.get_state_group_for_events(
|
||||||
|
[member_event_id]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
current_state_group = event_to_state[member_event_id]
|
||||||
|
|
||||||
events_to_send = []
|
events_to_send = []
|
||||||
# We treat the power levels override specially as this needs to be one
|
# We treat the power levels override specially as this needs to be one
|
||||||
# of the first events that get sent into a room.
|
# of the first events that get sent into a room.
|
||||||
pl_content = initial_state.pop((EventTypes.PowerLevels, ""), None)
|
pl_content = initial_state.pop((EventTypes.PowerLevels, ""), None)
|
||||||
if pl_content is not None:
|
if pl_content is not None:
|
||||||
power_event, power_context = await create_event(
|
power_event, power_context = await create_event(
|
||||||
EventTypes.PowerLevels, pl_content, False
|
EventTypes.PowerLevels, pl_content, True
|
||||||
)
|
)
|
||||||
current_state_group = power_context._state_group
|
current_state_group = power_context._state_group
|
||||||
events_to_send.append((power_event, power_context))
|
events_to_send.append((power_event, power_context))
|
||||||
|
@ -1194,7 +1215,7 @@ class RoomCreationHandler:
|
||||||
pl_event, pl_context = await create_event(
|
pl_event, pl_context = await create_event(
|
||||||
EventTypes.PowerLevels,
|
EventTypes.PowerLevels,
|
||||||
power_level_content,
|
power_level_content,
|
||||||
False,
|
True,
|
||||||
)
|
)
|
||||||
current_state_group = pl_context._state_group
|
current_state_group = pl_context._state_group
|
||||||
events_to_send.append((pl_event, pl_context))
|
events_to_send.append((pl_event, pl_context))
|
||||||
|
|
|
@ -715,7 +715,7 @@ class RoomsCreateTestCase(RoomBase):
|
||||||
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
|
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
|
||||||
self.assertTrue("room_id" in channel.json_body)
|
self.assertTrue("room_id" in channel.json_body)
|
||||||
assert channel.resource_usage is not None
|
assert channel.resource_usage is not None
|
||||||
self.assertEqual(34, channel.resource_usage.db_txn_count)
|
self.assertEqual(33, channel.resource_usage.db_txn_count)
|
||||||
|
|
||||||
def test_post_room_initial_state(self) -> None:
|
def test_post_room_initial_state(self) -> None:
|
||||||
# POST with initial_state config key, expect new room id
|
# POST with initial_state config key, expect new room id
|
||||||
|
@ -728,7 +728,7 @@ class RoomsCreateTestCase(RoomBase):
|
||||||
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
|
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
|
||||||
self.assertTrue("room_id" in channel.json_body)
|
self.assertTrue("room_id" in channel.json_body)
|
||||||
assert channel.resource_usage is not None
|
assert channel.resource_usage is not None
|
||||||
self.assertEqual(37, channel.resource_usage.db_txn_count)
|
self.assertEqual(36, channel.resource_usage.db_txn_count)
|
||||||
|
|
||||||
def test_post_room_visibility_key(self) -> None:
|
def test_post_room_visibility_key(self) -> None:
|
||||||
# POST with visibility config key, expect new room id
|
# POST with visibility config key, expect new room id
|
||||||
|
|
Loading…
Reference in New Issue