diff --git a/synapse/rest/client/account.py b/synapse/rest/client/account.py
index efe299e698..5802de5b7c 100644
--- a/synapse/rest/client/account.py
+++ b/synapse/rest/client/account.py
@@ -896,6 +896,36 @@ class WhoamiRestServlet(RestServlet):
return 200, response
+class AccountStatusRestServlet(RestServlet):
+ PATTERNS = client_patterns(
+ "/org.matrix.msc3720/account_status$", unstable=True, releases=()
+ )
+
+ def __init__(self, hs: "HomeServer"):
+ super().__init__()
+ self._auth = hs.get_auth()
+ self._store = hs.get_datastore()
+ self._is_mine = hs.is_mine
+ self._federation_client = hs.get_federation_client()
+ self._account_handler = hs.get_account_handler()
+
+ async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
+ await self._auth.get_user_by_req(request)
+
+ body = parse_json_object_from_request(request)
+ if "user_ids" not in body:
+ raise SynapseError(
+ 400, "Required parameter 'user_ids' is missing", Codes.MISSING_PARAM
+ )
+
+ statuses, failures = await self._account_handler.get_account_statuses(
+ body["user_ids"],
+ allow_remote=True,
+ )
+
+ return 200, {"account_statuses": statuses, "failures": failures}
+
+
def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
EmailPasswordRequestTokenRestServlet(hs).register(http_server)
PasswordRestServlet(hs).register(http_server)
@@ -910,3 +940,6 @@ def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None:
ThreepidUnbindRestServlet(hs).register(http_server)
ThreepidDeleteRestServlet(hs).register(http_server)
WhoamiRestServlet(hs).register(http_server)
+
+ if hs.config.experimental.msc3720_enabled:
+ AccountStatusRestServlet(hs).register(http_server)
diff --git a/synapse/rest/client/capabilities.py b/synapse/rest/client/capabilities.py
index e05c926b6f..b80fdd3712 100644
--- a/synapse/rest/client/capabilities.py
+++ b/synapse/rest/client/capabilities.py
@@ -75,6 +75,11 @@ class CapabilitiesRestServlet(RestServlet):
if self.config.experimental.msc3440_enabled:
response["capabilities"]["io.element.thread"] = {"enabled": True}
+ if self.config.experimental.msc3720_enabled:
+ response["capabilities"]["org.matrix.msc3720.account_status"] = {
+ "enabled": True,
+ }
+
return HTTPStatus.OK, response
|