Fix bug with creating public rooms on workers (#17177)

If room publication is disabled then creating public rooms on workers
would not work.

Introduced in #16811.
This commit is contained in:
Erik Johnston 2024-05-13 12:12:26 +01:00 committed by GitHub
parent 4cf4a8281b
commit a2e6f43f11
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 52 additions and 65 deletions

1
changelog.d/17177.bugfix Normal file
View file

@ -0,0 +1 @@
Fix bug where disabling room publication prevented public rooms being created on workers.

View file

@ -21,13 +21,11 @@
# #
import logging import logging
from abc import abstractmethod
from enum import Enum from enum import Enum
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
AbstractSet, AbstractSet,
Any, Any,
Awaitable,
Collection, Collection,
Dict, Dict,
List, List,
@ -1935,13 +1933,57 @@ class RoomBackgroundUpdateStore(SQLBaseStore):
return len(rooms) return len(rooms)
@abstractmethod async def set_room_is_public(self, room_id: str, is_public: bool) -> None:
def set_room_is_public(self, room_id: str, is_public: bool) -> Awaitable[None]: await self.db_pool.simple_update_one(
# this will need to be implemented if a background update is performed with table="rooms",
# existing (tombstoned, public) rooms in the database. keyvalues={"room_id": room_id},
# updatevalues={"is_public": is_public},
# It's overridden by RoomStore for the synapse master. desc="set_room_is_public",
raise NotImplementedError() )
async def set_room_is_public_appservice(
self, room_id: str, appservice_id: str, network_id: str, is_public: bool
) -> None:
"""Edit the appservice/network specific public room list.
Each appservice can have a number of published room lists associated
with them, keyed off of an appservice defined `network_id`, which
basically represents a single instance of a bridge to a third party
network.
Args:
room_id
appservice_id
network_id
is_public: Whether to publish or unpublish the room from the list.
"""
if is_public:
await self.db_pool.simple_upsert(
table="appservice_room_list",
keyvalues={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
values={},
insertion_values={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
desc="set_room_is_public_appservice_true",
)
else:
await self.db_pool.simple_delete(
table="appservice_room_list",
keyvalues={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
desc="set_room_is_public_appservice_false",
)
async def has_auth_chain_index(self, room_id: str) -> bool: async def has_auth_chain_index(self, room_id: str) -> bool:
"""Check if the room has (or can have) a chain cover index. """Check if the room has (or can have) a chain cover index.
@ -2349,62 +2391,6 @@ class RoomStore(RoomBackgroundUpdateStore, RoomWorkerStore):
}, },
) )
async def set_room_is_public(self, room_id: str, is_public: bool) -> None:
await self.db_pool.simple_update_one(
table="rooms",
keyvalues={"room_id": room_id},
updatevalues={"is_public": is_public},
desc="set_room_is_public",
)
self.hs.get_notifier().on_new_replication_data()
async def set_room_is_public_appservice(
self, room_id: str, appservice_id: str, network_id: str, is_public: bool
) -> None:
"""Edit the appservice/network specific public room list.
Each appservice can have a number of published room lists associated
with them, keyed off of an appservice defined `network_id`, which
basically represents a single instance of a bridge to a third party
network.
Args:
room_id
appservice_id
network_id
is_public: Whether to publish or unpublish the room from the list.
"""
if is_public:
await self.db_pool.simple_upsert(
table="appservice_room_list",
keyvalues={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
values={},
insertion_values={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
desc="set_room_is_public_appservice_true",
)
else:
await self.db_pool.simple_delete(
table="appservice_room_list",
keyvalues={
"appservice_id": appservice_id,
"network_id": network_id,
"room_id": room_id,
},
desc="set_room_is_public_appservice_false",
)
self.hs.get_notifier().on_new_replication_data()
async def add_event_report( async def add_event_report(
self, self,
room_id: str, room_id: str,