Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit b939251

Browse files
authored
Fix errors when updating the user directory with invalid data (#8223)
1 parent b5133dd commit b939251

File tree

4 files changed

+19
-1
lines changed

4 files changed

+19
-1
lines changed

changelog.d/8223.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixes a longstanding bug where user directory updates could break when unexpected profile data was included in events.

synapse/handlers/profile.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ async def set_displayname(
161161
Codes.FORBIDDEN,
162162
)
163163

164+
if not isinstance(new_displayname, str):
165+
raise SynapseError(400, "Invalid displayname")
166+
164167
if len(new_displayname) > MAX_DISPLAYNAME_LEN:
165168
raise SynapseError(
166169
400, "Displayname is too long (max %i)" % (MAX_DISPLAYNAME_LEN,)
@@ -235,6 +238,9 @@ async def set_avatar_url(
235238
400, "Changing avatar is disabled on this server", Codes.FORBIDDEN
236239
)
237240

241+
if not isinstance(new_avatar_url, str):
242+
raise SynapseError(400, "Invalid displayname")
243+
238244
if len(new_avatar_url) > MAX_AVATAR_URL_LEN:
239245
raise SynapseError(
240246
400, "Avatar URL is too long (max %i)" % (MAX_AVATAR_URL_LEN,)

synapse/handlers/user_directory.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ async def _handle_deltas(self, deltas):
234234
async def _handle_room_publicity_change(
235235
self, room_id, prev_event_id, event_id, typ
236236
):
237-
"""Handle a room having potentially changed from/to world_readable/publically
237+
"""Handle a room having potentially changed from/to world_readable/publicly
238238
joinable.
239239
240240
Args:
@@ -388,9 +388,15 @@ async def _handle_profile_change(self, user_id, room_id, prev_event_id, event_id
388388

389389
prev_name = prev_event.content.get("displayname")
390390
new_name = event.content.get("displayname")
391+
# If the new name is an unexpected form, do not update the directory.
392+
if not isinstance(new_name, str):
393+
new_name = prev_name
391394

392395
prev_avatar = prev_event.content.get("avatar_url")
393396
new_avatar = event.content.get("avatar_url")
397+
# If the new avatar is an unexpected form, do not update the directory.
398+
if not isinstance(new_avatar, str):
399+
new_avatar = prev_avatar
394400

395401
if prev_name != new_name or prev_avatar != new_avatar:
396402
await self.store.update_profile_in_user_dir(user_id, new_name, new_avatar)

synapse/storage/databases/main/user_directory.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,11 @@ async def update_profile_in_user_dir(
371371
"""
372372
Update or add a user's profile in the user directory.
373373
"""
374+
# If the display name or avatar URL are unexpected types, overwrite them.
375+
if not isinstance(display_name, str):
376+
display_name = None
377+
if not isinstance(avatar_url, str):
378+
avatar_url = None
374379

375380
def _update_profile_in_user_dir_txn(txn):
376381
new_entry = self.db_pool.simple_upsert_txn(

0 commit comments

Comments
 (0)