diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 7072bca1fc..cf01d58ea1 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -465,17 +465,35 @@ class RoomCreationHandler:
# the room has been created
# Calculate the minimum power level needed to clone the room
event_power_levels = power_levels.get("events", {})
+ if not isinstance(event_power_levels, dict):
+ event_power_levels = {}
state_default = power_levels.get("state_default", 50)
+ try:
+ state_default_int = int(state_default) # type: ignore[arg-type]
+ except (TypeError, ValueError):
+ state_default_int = 50
ban = power_levels.get("ban", 50)
- needed_power_level = max(state_default, ban, max(event_power_levels.values()))
+ try:
+ ban = int(ban) # type: ignore[arg-type]
+ except (TypeError, ValueError):
+ ban = 50
+ needed_power_level = max(
+ state_default_int, ban, max(event_power_levels.values())
+ )
# Get the user's current power level, this matches the logic in get_user_power_level,
# but without the entire state map.
user_power_levels = power_levels.setdefault("users", {})
+ if not isinstance(user_power_levels, dict):
+ user_power_levels = {}
users_default = power_levels.get("users_default", 0)
current_power_level = user_power_levels.get(user_id, users_default)
+ try:
+ current_power_level_int = int(current_power_level) # type: ignore[arg-type]
+ except (TypeError, ValueError):
+ current_power_level_int = 0
# Raise the requester's power level in the new room if necessary
- if current_power_level < needed_power_level:
+ if current_power_level_int < needed_power_level:
user_power_levels[user_id] = needed_power_level
await self._send_events_for_new_room(
@@ -755,6 +773,15 @@ class RoomCreationHandler:
if not allowed_by_third_party_rules:
raise SynapseError(403, "Room visibility value not allowed.")
+ if is_public:
+ if not self.config.roomdirectory.is_publishing_room_allowed(
+ user_id, room_id, room_alias
+ ):
+ # Let's just return a generic message, as there may be all sorts of
+ # reasons why we said no. TODO: Allow configurable error messages
+ # per alias creation rule?
+ raise SynapseError(403, "Not allowed to publish room")
+
directory_handler = self.hs.get_directory_handler()
if room_alias:
await directory_handler.create_association(
@@ -765,15 +792,6 @@ class RoomCreationHandler:
check_membership=False,
)
- if is_public:
- if not self.config.roomdirectory.is_publishing_room_allowed(
- user_id, room_id, room_alias
- ):
- # Lets just return a generic message, as there may be all sorts of
- # reasons why we said no. TODO: Allow configurable error messages
- # per alias creation rule?
- raise SynapseError(403, "Not allowed to publish room")
-
preset_config = config.get(
"preset",
RoomCreationPreset.PRIVATE_CHAT
|