mirror of
https://github.com/element-hq/synapse.git
synced 2024-12-15 17:51:10 +00:00
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:
parent
4cf4a8281b
commit
a2e6f43f11
2 changed files with 52 additions and 65 deletions
1
changelog.d/17177.bugfix
Normal file
1
changelog.d/17177.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix bug where disabling room publication prevented public rooms being created on workers.
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue