You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 regels
4.6 KiB

  1. # Copyright 2018-2021 The Matrix.org Foundation C.I.C.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import logging
  15. from typing import TYPE_CHECKING, List, Optional, Tuple
  16. from synapse.handlers.room_member import NoKnownServersError, RoomMemberHandler
  17. from synapse.replication.http.membership import (
  18. ReplicationRemoteJoinRestServlet as ReplRemoteJoin,
  19. ReplicationRemoteKnockRestServlet as ReplRemoteKnock,
  20. ReplicationRemoteRejectInviteRestServlet as ReplRejectInvite,
  21. ReplicationRemoteRescindKnockRestServlet as ReplRescindKnock,
  22. ReplicationUserJoinedLeftRoomRestServlet as ReplJoinedLeft,
  23. )
  24. from synapse.types import JsonDict, Requester, UserID
  25. if TYPE_CHECKING:
  26. from synapse.server import HomeServer
  27. logger = logging.getLogger(__name__)
  28. class RoomMemberWorkerHandler(RoomMemberHandler):
  29. def __init__(self, hs: "HomeServer"):
  30. super().__init__(hs)
  31. self._remote_join_client = ReplRemoteJoin.make_client(hs)
  32. self._remote_knock_client = ReplRemoteKnock.make_client(hs)
  33. self._remote_reject_client = ReplRejectInvite.make_client(hs)
  34. self._remote_rescind_client = ReplRescindKnock.make_client(hs)
  35. self._notify_change_client = ReplJoinedLeft.make_client(hs)
  36. async def _remote_join(
  37. self,
  38. requester: Requester,
  39. remote_room_hosts: List[str],
  40. room_id: str,
  41. user: UserID,
  42. content: dict,
  43. ) -> Tuple[str, int]:
  44. """Implements RoomMemberHandler._remote_join"""
  45. if len(remote_room_hosts) == 0:
  46. raise NoKnownServersError()
  47. ret = await self._remote_join_client(
  48. requester=requester,
  49. remote_room_hosts=remote_room_hosts,
  50. room_id=room_id,
  51. user_id=user.to_string(),
  52. content=content,
  53. )
  54. return ret["event_id"], ret["stream_id"]
  55. async def remote_reject_invite(
  56. self,
  57. invite_event_id: str,
  58. txn_id: Optional[str],
  59. requester: Requester,
  60. content: dict,
  61. ) -> Tuple[str, int]:
  62. """
  63. Rejects an out-of-band invite received from a remote user
  64. Implements RoomMemberHandler.remote_reject_invite
  65. """
  66. ret = await self._remote_reject_client(
  67. invite_event_id=invite_event_id,
  68. txn_id=txn_id,
  69. requester=requester,
  70. content=content,
  71. )
  72. return ret["event_id"], ret["stream_id"]
  73. async def remote_rescind_knock(
  74. self,
  75. knock_event_id: str,
  76. txn_id: Optional[str],
  77. requester: Requester,
  78. content: JsonDict,
  79. ) -> Tuple[str, int]:
  80. """
  81. Rescinds a local knock made on a remote room
  82. Args:
  83. knock_event_id: the knock event
  84. txn_id: optional transaction ID supplied by the client
  85. requester: user making the request, according to the access token
  86. content: additional content to include in the leave event.
  87. Normally an empty dict.
  88. Returns:
  89. A tuple containing (event_id, stream_id of the leave event)
  90. """
  91. ret = await self._remote_rescind_client(
  92. knock_event_id=knock_event_id,
  93. txn_id=txn_id,
  94. requester=requester,
  95. content=content,
  96. )
  97. return ret["event_id"], ret["stream_id"]
  98. async def remote_knock(
  99. self,
  100. requester: Requester,
  101. remote_room_hosts: List[str],
  102. room_id: str,
  103. user: UserID,
  104. content: dict,
  105. ) -> Tuple[str, int]:
  106. """Sends a knock to a room.
  107. Implements RoomMemberHandler.remote_knock
  108. """
  109. ret = await self._remote_knock_client(
  110. requester=requester,
  111. remote_room_hosts=remote_room_hosts,
  112. room_id=room_id,
  113. user_id=user.to_string(),
  114. content=content,
  115. )
  116. return ret["event_id"], ret["stream_id"]
  117. async def _user_left_room(self, target: UserID, room_id: str) -> None:
  118. """Implements RoomMemberHandler._user_left_room"""
  119. await self._notify_change_client(
  120. user_id=target.to_string(), room_id=room_id, change="left"
  121. )