Compare commits

...

2 Commits

Author SHA1 Message Date
Erik Johnston
78d0ab0382 Newsfile 2025-04-22 10:39:58 +01:00
Erik Johnston
fc639b4a61 Move GET /devices/ off main process
We can't move PUT/DELETE as they do need to happen on main process (due
to notification of device changes).
2025-04-22 10:38:54 +01:00
3 changed files with 16 additions and 2 deletions

View File

@@ -0,0 +1 @@
Add support for handling `GET /devices/` on workers.

View File

@@ -280,6 +280,7 @@ Additionally, the following REST endpoints can be handled for GET requests:
^/_matrix/client/(api/v1|r0|v3|unstable)/pushrules/ ^/_matrix/client/(api/v1|r0|v3|unstable)/pushrules/
^/_matrix/client/unstable/org.matrix.msc4140/delayed_events ^/_matrix/client/unstable/org.matrix.msc4140/delayed_events
^/_matrix/client/(api/v1|r0|v3|unstable)/devices/
# Account data requests # Account data requests
^/_matrix/client/(r0|v3|unstable)/.*/tags ^/_matrix/client/(r0|v3|unstable)/.*/tags

View File

@@ -143,11 +143,11 @@ class DeviceRestServlet(RestServlet):
self.hs = hs self.hs = hs
self.auth = hs.get_auth() self.auth = hs.get_auth()
handler = hs.get_device_handler() handler = hs.get_device_handler()
assert isinstance(handler, DeviceHandler)
self.device_handler = handler self.device_handler = handler
self.auth_handler = hs.get_auth_handler() self.auth_handler = hs.get_auth_handler()
self._msc3852_enabled = hs.config.experimental.msc3852_enabled self._msc3852_enabled = hs.config.experimental.msc3852_enabled
self._msc3861_oauth_delegation_enabled = hs.config.experimental.msc3861.enabled self._msc3861_oauth_delegation_enabled = hs.config.experimental.msc3861.enabled
self._is_main_process = hs.config.worker.worker_app is None
async def on_GET( async def on_GET(
self, request: SynapseRequest, device_id: str self, request: SynapseRequest, device_id: str
@@ -179,6 +179,12 @@ class DeviceRestServlet(RestServlet):
async def on_DELETE( async def on_DELETE(
self, request: SynapseRequest, device_id: str self, request: SynapseRequest, device_id: str
) -> Tuple[int, JsonDict]: ) -> Tuple[int, JsonDict]:
# Can only be run on main process
if not self._is_main_process:
logger.error("DELETE on /devices/ must be routed to main process")
raise SynapseError(500, "Server misconfigured")
assert isinstance(self.device_handler, DeviceHandler)
requester = await self.auth.get_user_by_req(request) requester = await self.auth.get_user_by_req(request)
try: try:
@@ -223,6 +229,12 @@ class DeviceRestServlet(RestServlet):
async def on_PUT( async def on_PUT(
self, request: SynapseRequest, device_id: str self, request: SynapseRequest, device_id: str
) -> Tuple[int, JsonDict]: ) -> Tuple[int, JsonDict]:
# Can only be run on main process
if not self._is_main_process:
logger.error("PUT on /devices/ must be routed to main process")
raise SynapseError(500, "Server misconfigured")
assert isinstance(self.device_handler, DeviceHandler)
requester = await self.auth.get_user_by_req(request, allow_guest=True) requester = await self.auth.get_user_by_req(request, allow_guest=True)
body = parse_and_validate_json_object_from_request(request, self.PutBody) body = parse_and_validate_json_object_from_request(request, self.PutBody)
@@ -585,9 +597,9 @@ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
): ):
DeleteDevicesRestServlet(hs).register(http_server) DeleteDevicesRestServlet(hs).register(http_server)
DevicesRestServlet(hs).register(http_server) DevicesRestServlet(hs).register(http_server)
DeviceRestServlet(hs).register(http_server)
if hs.config.worker.worker_app is None: if hs.config.worker.worker_app is None:
DeviceRestServlet(hs).register(http_server)
if hs.config.experimental.msc2697_enabled: if hs.config.experimental.msc2697_enabled:
DehydratedDeviceServlet(hs).register(http_server) DehydratedDeviceServlet(hs).register(http_server)
ClaimDehydratedDeviceServlet(hs).register(http_server) ClaimDehydratedDeviceServlet(hs).register(http_server)