mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2024-12-17 06:44:22 -05:00
Mutual rooms: Remove dependency on user directory (#12836)
This commit is contained in:
parent
bda4600399
commit
6be4953b99
1
changelog.d/12836.misc
Normal file
1
changelog.d/12836.misc
Normal file
@ -0,0 +1 @@
|
|||||||
|
Remove Mutual Rooms ([MSC2666](https://github.com/matrix-org/matrix-spec-proposals/pull/2666)) endpoint dependency on the User Directory.
|
@ -42,21 +42,10 @@ class UserMutualRoomsServlet(RestServlet):
|
|||||||
super().__init__()
|
super().__init__()
|
||||||
self.auth = hs.get_auth()
|
self.auth = hs.get_auth()
|
||||||
self.store = hs.get_datastores().main
|
self.store = hs.get_datastores().main
|
||||||
self.user_directory_search_enabled = (
|
|
||||||
hs.config.userdirectory.user_directory_search_enabled
|
|
||||||
)
|
|
||||||
|
|
||||||
async def on_GET(
|
async def on_GET(
|
||||||
self, request: SynapseRequest, user_id: str
|
self, request: SynapseRequest, user_id: str
|
||||||
) -> Tuple[int, JsonDict]:
|
) -> Tuple[int, JsonDict]:
|
||||||
|
|
||||||
if not self.user_directory_search_enabled:
|
|
||||||
raise SynapseError(
|
|
||||||
code=400,
|
|
||||||
msg="User directory searching is disabled. Cannot determine shared rooms.",
|
|
||||||
errcode=Codes.UNKNOWN,
|
|
||||||
)
|
|
||||||
|
|
||||||
UserID.from_string(user_id)
|
UserID.from_string(user_id)
|
||||||
|
|
||||||
requester = await self.auth.get_user_by_req(request)
|
requester = await self.auth.get_user_by_req(request)
|
||||||
@ -67,8 +56,8 @@ class UserMutualRoomsServlet(RestServlet):
|
|||||||
errcode=Codes.FORBIDDEN,
|
errcode=Codes.FORBIDDEN,
|
||||||
)
|
)
|
||||||
|
|
||||||
rooms = await self.store.get_mutual_rooms_for_users(
|
rooms = await self.store.get_mutual_rooms_between_users(
|
||||||
requester.user.to_string(), user_id
|
frozenset((requester.user.to_string(), user_id))
|
||||||
)
|
)
|
||||||
|
|
||||||
return 200, {"joined": list(rooms)}
|
return 200, {"joined": list(rooms)}
|
||||||
|
@ -670,6 +670,30 @@ class RoomMemberWorkerStore(EventsWorkerStore):
|
|||||||
|
|
||||||
return user_who_share_room
|
return user_who_share_room
|
||||||
|
|
||||||
|
@cached(cache_context=True, iterable=True)
|
||||||
|
async def get_mutual_rooms_between_users(
|
||||||
|
self, user_ids: FrozenSet[str], cache_context: _CacheContext
|
||||||
|
) -> FrozenSet[str]:
|
||||||
|
"""
|
||||||
|
Returns the set of rooms that all users in `user_ids` share.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user_ids: A frozen set of all users to investigate and return
|
||||||
|
overlapping joined rooms for.
|
||||||
|
cache_context
|
||||||
|
"""
|
||||||
|
shared_room_ids: Optional[FrozenSet[str]] = None
|
||||||
|
for user_id in user_ids:
|
||||||
|
room_ids = await self.get_rooms_for_user(
|
||||||
|
user_id, on_invalidate=cache_context.invalidate
|
||||||
|
)
|
||||||
|
if shared_room_ids is not None:
|
||||||
|
shared_room_ids &= room_ids
|
||||||
|
else:
|
||||||
|
shared_room_ids = room_ids
|
||||||
|
|
||||||
|
return shared_room_ids or frozenset()
|
||||||
|
|
||||||
async def get_joined_users_from_context(
|
async def get_joined_users_from_context(
|
||||||
self, event: EventBase, context: EventContext
|
self, event: EventBase, context: EventContext
|
||||||
) -> Dict[str, ProfileInfo]:
|
) -> Dict[str, ProfileInfo]:
|
||||||
|
@ -729,49 +729,6 @@ class UserDirectoryStore(UserDirectoryBackgroundUpdateStore):
|
|||||||
users.update(rows)
|
users.update(rows)
|
||||||
return list(users)
|
return list(users)
|
||||||
|
|
||||||
async def get_mutual_rooms_for_users(
|
|
||||||
self, user_id: str, other_user_id: str
|
|
||||||
) -> Set[str]:
|
|
||||||
"""
|
|
||||||
Returns the rooms that a local user shares with another local or remote user.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
user_id: The MXID of a local user
|
|
||||||
other_user_id: The MXID of the other user
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
A set of room ID's that the users share.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def _get_mutual_rooms_for_users_txn(
|
|
||||||
txn: LoggingTransaction,
|
|
||||||
) -> List[Dict[str, str]]:
|
|
||||||
txn.execute(
|
|
||||||
"""
|
|
||||||
SELECT p1.room_id
|
|
||||||
FROM users_in_public_rooms as p1
|
|
||||||
INNER JOIN users_in_public_rooms as p2
|
|
||||||
ON p1.room_id = p2.room_id
|
|
||||||
AND p1.user_id = ?
|
|
||||||
AND p2.user_id = ?
|
|
||||||
UNION
|
|
||||||
SELECT room_id
|
|
||||||
FROM users_who_share_private_rooms
|
|
||||||
WHERE
|
|
||||||
user_id = ?
|
|
||||||
AND other_user_id = ?
|
|
||||||
""",
|
|
||||||
(user_id, other_user_id, user_id, other_user_id),
|
|
||||||
)
|
|
||||||
rows = self.db_pool.cursor_to_dict(txn)
|
|
||||||
return rows
|
|
||||||
|
|
||||||
rows = await self.db_pool.runInteraction(
|
|
||||||
"get_mutual_rooms_for_users", _get_mutual_rooms_for_users_txn
|
|
||||||
)
|
|
||||||
|
|
||||||
return {row["room_id"] for row in rows}
|
|
||||||
|
|
||||||
async def get_user_directory_stream_pos(self) -> Optional[int]:
|
async def get_user_directory_stream_pos(self) -> Optional[int]:
|
||||||
"""
|
"""
|
||||||
Get the stream ID of the user directory stream.
|
Get the stream ID of the user directory stream.
|
||||||
|
@ -36,12 +36,10 @@ class UserMutualRoomsTest(unittest.HomeserverTestCase):
|
|||||||
|
|
||||||
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
|
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
|
||||||
config = self.default_config()
|
config = self.default_config()
|
||||||
config["update_user_directory"] = True
|
|
||||||
return self.setup_test_homeserver(config=config)
|
return self.setup_test_homeserver(config=config)
|
||||||
|
|
||||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||||
self.store = hs.get_datastores().main
|
self.store = hs.get_datastores().main
|
||||||
self.handler = hs.get_user_directory_handler()
|
|
||||||
|
|
||||||
def _get_mutual_rooms(self, token: str, other_user: str) -> FakeChannel:
|
def _get_mutual_rooms(self, token: str, other_user: str) -> FakeChannel:
|
||||||
return self.make_request(
|
return self.make_request(
|
||||||
|
Loading…
Reference in New Issue
Block a user