diff --git a/synapse/config/server.py b/synapse/config/server.py index 6b299836176..3b2947d29e1 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -794,6 +794,8 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: else: self.max_event_delay_ms = None + self.account_data_defaults = config.get("account_data_defaults", {}) + def has_tls_listener(self) -> bool: return any(listener.is_tls() for listener in self.listeners) diff --git a/synapse/rest/client/account_data.py b/synapse/rest/client/account_data.py index 734c9e992f5..5088b73d378 100644 --- a/synapse/rest/client/account_data.py +++ b/synapse/rest/client/account_data.py @@ -116,9 +116,6 @@ async def on_GET( user_id, account_data_type ) - if account_data is None: - raise NotFoundError("Account data not found") - # If experimental support for MSC3391 is enabled, then this endpoint should # return a 404 if the content for an account data type is an empty dict. if self._hs.config.experimental.msc3391_enabled and account_data == {}: diff --git a/synapse/storage/databases/main/account_data.py b/synapse/storage/databases/main/account_data.py index e583c182bad..557e0b61d08 100644 --- a/synapse/storage/databases/main/account_data.py +++ b/synapse/storage/databases/main/account_data.py @@ -102,6 +102,8 @@ def __init__( self._delete_account_data_for_deactivated_users, ) + self.defaults = hs.config.server.account_data_defaults + def get_max_account_data_stream_id(self) -> int: """Get the current max stream ID for account data stream @@ -149,11 +151,17 @@ def get_global_account_data_for_user( txn.execute(sql, (user_id,)) - return { + user_account_data = { account_data_type: db_to_json(content) for account_data_type, content in txn } + for type, content in self.defaults.items(): + if user_account_data.get(type) is None: + user_account_data[type] = content + + return user_account_data + return await self.db_pool.runInteraction( "get_global_account_data_for_user", get_global_account_data_for_user ) @@ -225,7 +233,7 @@ async def get_global_account_data_by_type_for_user( if result: return db_to_json(result) else: - return None + return self.defaults.get(data_type) async def get_latest_stream_id_for_global_account_data_by_type_for_user( self, user_id: str, data_type: str