diff --git a/synapse/rest/admin/users.py b/synapse/rest/admin/users.py
index d14fafbbc9..db678da4cf 100644
--- a/synapse/rest/admin/users.py
+++ b/synapse/rest/admin/users.py
@@ -66,7 +66,6 @@ class UsersRestServletV2(RestServlet):
"""
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
self.admin_handler = hs.get_admin_handler()
@@ -79,14 +78,14 @@ class UsersRestServletV2(RestServlet):
if start < 0:
raise SynapseError(
- 400,
+ HTTPStatus.BAD_REQUEST,
"Query parameter from must be a string representing a positive integer.",
errcode=Codes.INVALID_PARAM,
)
if limit < 0:
raise SynapseError(
- 400,
+ HTTPStatus.BAD_REQUEST,
"Query parameter limit must be a string representing a positive integer.",
errcode=Codes.INVALID_PARAM,
)
@@ -122,11 +121,11 @@ class UsersRestServletV2(RestServlet):
if (start + limit) < total:
ret["next_token"] = str(start + len(users))
- return 200, ret
+ return HTTPStatus.OK, ret
class UserRestServletV2(RestServlet):
- PATTERNS = admin_patterns("/users/(?P<user_id>[^/]+)$", "v2")
+ PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)$", "v2")
"""Get request to list user details.
This needs user to have administrator access in Synapse.
@@ -172,14 +171,14 @@ class UserRestServletV2(RestServlet):
target_user = UserID.from_string(user_id)
if not self.hs.is_mine(target_user):
- raise SynapseError(400, "Can only look up local users")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Can only look up local users")
ret = await self.admin_handler.get_user(target_user)
if not ret:
raise NotFoundError("User not found")
- return 200, ret
+ return HTTPStatus.OK, ret
async def on_PUT(
self, request: SynapseRequest, user_id: str
@@ -191,7 +190,10 @@ class UserRestServletV2(RestServlet):
body = parse_json_object_from_request(request)
if not self.hs.is_mine(target_user):
- raise SynapseError(400, "This endpoint can only be used with local users")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST,
+ "This endpoint can only be used with local users",
+ )
user = await self.admin_handler.get_user(target_user)
user_id = target_user.to_string()
@@ -210,7 +212,7 @@ class UserRestServletV2(RestServlet):
user_type = body.get("user_type", None)
if user_type is not None and user_type not in UserTypes.ALL_USER_TYPES:
- raise SynapseError(400, "Invalid user type")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid user type")
set_admin_to = body.get("admin", False)
if not isinstance(set_admin_to, bool):
@@ -223,11 +225,13 @@ class UserRestServletV2(RestServlet):
password = body.get("password", None)
if password is not None:
if not isinstance(password, str) or len(password) > 512:
- raise SynapseError(400, "Invalid password")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid password")
deactivate = body.get("deactivated", False)
if not isinstance(deactivate, bool):
- raise SynapseError(400, "'deactivated' parameter is not of type boolean")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "'deactivated' parameter is not of type boolean"
+ )
# convert List[Dict[str, str]] into List[Tuple[str, str]]
if external_ids is not None:
@@ -282,7 +286,9 @@ class UserRestServletV2(RestServlet):
user_id,
)
except ExternalIDReuseException:
- raise SynapseError(409, "External id is already in use.")
+ raise SynapseError(
+ HTTPStatus.CONFLICT, "External id is already in use."
+ )
if "avatar_url" in body and isinstance(body["avatar_url"], str):
await self.profile_handler.set_avatar_url(
@@ -293,7 +299,9 @@ class UserRestServletV2(RestServlet):
if set_admin_to != user["admin"]:
auth_user = requester.user
if target_user == auth_user and not set_admin_to:
- raise SynapseError(400, "You may not demote yourself.")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "You may not demote yourself."
+ )
await self.store.set_server_admin(target_user, set_admin_to)
@@ -319,7 +327,8 @@ class UserRestServletV2(RestServlet):
and self.auth_handler.can_change_password()
):
raise SynapseError(
- 400, "Must provide a password to re-activate an account."
+ HTTPStatus.BAD_REQUEST,
+ "Must provide a password to re-activate an account.",
)
await self.deactivate_account_handler.activate_account(
@@ -332,7 +341,7 @@ class UserRestServletV2(RestServlet):
user = await self.admin_handler.get_user(target_user)
assert user is not None
- return 200, user
+ return HTTPStatus.OK, user
else: # create user
displayname = body.get("displayname", None)
@@ -381,7 +390,9 @@ class UserRestServletV2(RestServlet):
user_id,
)
except ExternalIDReuseException:
- raise SynapseError(409, "External id is already in use.")
+ raise SynapseError(
+ HTTPStatus.CONFLICT, "External id is already in use."
+ )
if "avatar_url" in body and isinstance(body["avatar_url"], str):
await self.profile_handler.set_avatar_url(
@@ -402,7 +413,7 @@ class UserRegisterServlet(RestServlet):
nonce to the time it was generated, in int seconds.
"""
- PATTERNS = admin_patterns("/register")
+ PATTERNS = admin_patterns("/register$")
NONCE_TIMEOUT = 60
def __init__(self, hs: "HomeServer"):
@@ -429,51 +440,61 @@ class UserRegisterServlet(RestServlet):
nonce = secrets.token_hex(64)
self.nonces[nonce] = int(self.reactor.seconds())
- return 200, {"nonce": nonce}
+ return HTTPStatus.OK, {"nonce": nonce}
async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
self._clear_old_nonces()
if not self.hs.config.registration.registration_shared_secret:
- raise SynapseError(400, "Shared secret registration is not enabled")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Shared secret registration is not enabled"
+ )
body = parse_json_object_from_request(request)
if "nonce" not in body:
- raise SynapseError(400, "nonce must be specified", errcode=Codes.BAD_JSON)
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST,
+ "nonce must be specified",
+ errcode=Codes.BAD_JSON,
+ )
nonce = body["nonce"]
if nonce not in self.nonces:
- raise SynapseError(400, "unrecognised nonce")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "unrecognised nonce")
# Delete the nonce, so it can't be reused, even if it's invalid
del self.nonces[nonce]
if "username" not in body:
raise SynapseError(
- 400, "username must be specified", errcode=Codes.BAD_JSON
+ HTTPStatus.BAD_REQUEST,
+ "username must be specified",
+ errcode=Codes.BAD_JSON,
)
else:
if not isinstance(body["username"], str) or len(body["username"]) > 512:
- raise SynapseError(400, "Invalid username")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid username")
username = body["username"].encode("utf-8")
if b"\x00" in username:
- raise SynapseError(400, "Invalid username")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid username")
if "password" not in body:
raise SynapseError(
- 400, "password must be specified", errcode=Codes.BAD_JSON
+ HTTPStatus.BAD_REQUEST,
+ "password must be specified",
+ errcode=Codes.BAD_JSON,
)
else:
password = body["password"]
if not isinstance(password, str) or len(password) > 512:
- raise SynapseError(400, "Invalid password")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid password")
password_bytes = password.encode("utf-8")
if b"\x00" in password_bytes:
- raise SynapseError(400, "Invalid password")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid password")
password_hash = await self.auth_handler.hash(password)
@@ -482,10 +503,12 @@ class UserRegisterServlet(RestServlet):
displayname = body.get("displayname", None)
if user_type is not None and user_type not in UserTypes.ALL_USER_TYPES:
- raise SynapseError(400, "Invalid user type")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Invalid user type")
if "mac" not in body:
- raise SynapseError(400, "mac must be specified", errcode=Codes.BAD_JSON)
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "mac must be specified", errcode=Codes.BAD_JSON
+ )
got_mac = body["mac"]
@@ -507,7 +530,7 @@ class UserRegisterServlet(RestServlet):
want_mac = want_mac_builder.hexdigest()
if not hmac.compare_digest(want_mac.encode("ascii"), got_mac.encode("ascii")):
- raise SynapseError(403, "HMAC incorrect")
+ raise SynapseError(HTTPStatus.FORBIDDEN, "HMAC incorrect")
# Reuse the parts of RegisterRestServlet to reduce code duplication
from synapse.rest.client.register import RegisterRestServlet
@@ -524,7 +547,7 @@ class UserRegisterServlet(RestServlet):
)
result = await register._create_registration_details(user_id, body)
- return 200, result
+ return HTTPStatus.OK, result
class WhoisRestServlet(RestServlet):
@@ -537,9 +560,9 @@ class WhoisRestServlet(RestServlet):
]
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.auth = hs.get_auth()
self.admin_handler = hs.get_admin_handler()
+ self.is_mine = hs.is_mine
async def on_GET(
self, request: SynapseRequest, user_id: str
@@ -551,16 +574,16 @@ class WhoisRestServlet(RestServlet):
if target_user != auth_user:
await assert_user_is_admin(self.auth, auth_user)
- if not self.hs.is_mine(target_user):
- raise SynapseError(400, "Can only whois a local user")
+ if not self.is_mine(target_user):
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Can only whois a local user")
ret = await self.admin_handler.get_whois(target_user)
- return 200, ret
+ return HTTPStatus.OK, ret
class DeactivateAccountRestServlet(RestServlet):
- PATTERNS = admin_patterns("/deactivate/(?P<target_user_id>[^/]*)")
+ PATTERNS = admin_patterns("/deactivate/(?P<target_user_id>[^/]*)$")
def __init__(self, hs: "HomeServer"):
self._deactivate_account_handler = hs.get_deactivate_account_handler()
@@ -575,7 +598,9 @@ class DeactivateAccountRestServlet(RestServlet):
await assert_user_is_admin(self.auth, requester.user)
if not self.is_mine(UserID.from_string(target_user_id)):
- raise SynapseError(400, "Can only deactivate local users")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Can only deactivate local users"
+ )
if not await self.store.get_user_by_id(target_user_id):
raise NotFoundError("User not found")
@@ -597,14 +622,13 @@ class DeactivateAccountRestServlet(RestServlet):
else:
id_server_unbind_result = "no-support"
- return 200, {"id_server_unbind_result": id_server_unbind_result}
+ return HTTPStatus.OK, {"id_server_unbind_result": id_server_unbind_result}
class AccountValidityRenewServlet(RestServlet):
PATTERNS = admin_patterns("/account_validity/validity$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.account_activity_handler = hs.get_account_validity_handler()
self.auth = hs.get_auth()
@@ -620,7 +644,7 @@ class AccountValidityRenewServlet(RestServlet):
if "user_id" not in body:
raise SynapseError(
- 400,
+ HTTPStatus.BAD_REQUEST,
"Missing property 'user_id' in the request body",
)
@@ -631,7 +655,7 @@ class AccountValidityRenewServlet(RestServlet):
)
res = {"expiration_ts": expiration_ts}
- return 200, res
+ return HTTPStatus.OK, res
class ResetPasswordRestServlet(RestServlet):
@@ -648,11 +672,10 @@ class ResetPasswordRestServlet(RestServlet):
200 OK with empty object if success otherwise an error.
"""
- PATTERNS = admin_patterns("/reset_password/(?P<target_user_id>[^/]*)")
+ PATTERNS = admin_patterns("/reset_password/(?P<target_user_id>[^/]*)$")
def __init__(self, hs: "HomeServer"):
self.store = hs.get_datastore()
- self.hs = hs
self.auth = hs.get_auth()
self.auth_handler = hs.get_auth_handler()
self._set_password_handler = hs.get_set_password_handler()
@@ -678,7 +701,7 @@ class ResetPasswordRestServlet(RestServlet):
await self._set_password_handler.set_password(
target_user_id, new_password_hash, logout_devices, requester
)
- return 200, {}
+ return HTTPStatus.OK, {}
class SearchUsersRestServlet(RestServlet):
@@ -692,12 +715,12 @@ class SearchUsersRestServlet(RestServlet):
200 OK with json object {list[dict[str, Any]], count} or empty object.
"""
- PATTERNS = admin_patterns("/search_users/(?P<target_user_id>[^/]*)")
+ PATTERNS = admin_patterns("/search_users/(?P<target_user_id>[^/]*)$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
+ self.is_mine = hs.is_mine
async def on_GET(
self, request: SynapseRequest, target_user_id: str
@@ -712,16 +735,16 @@ class SearchUsersRestServlet(RestServlet):
# To allow all users to get the users list
# if not is_admin and target_user != auth_user:
- # raise AuthError(403, "You are not a server admin")
+ # raise AuthError(HTTPStatus.FORBIDDEN, "You are not a server admin")
- if not self.hs.is_mine(target_user):
- raise SynapseError(400, "Can only users a local user")
+ if not self.is_mine(target_user):
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Can only users a local user")
term = parse_string(request, "term", required=True)
logger.info("term: %s ", term)
ret = await self.store.search_users(term)
- return 200, ret
+ return HTTPStatus.OK, ret
class UserAdminServlet(RestServlet):
@@ -753,9 +776,9 @@ class UserAdminServlet(RestServlet):
PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/admin$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
+ self.is_mine = hs.is_mine
async def on_GET(
self, request: SynapseRequest, user_id: str
@@ -764,12 +787,15 @@ class UserAdminServlet(RestServlet):
target_user = UserID.from_string(user_id)
- if not self.hs.is_mine(target_user):
- raise SynapseError(400, "Only local users can be admins of this homeserver")
+ if not self.is_mine(target_user):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST,
+ "Only local users can be admins of this homeserver",
+ )
is_admin = await self.store.is_server_admin(target_user)
- return 200, {"admin": is_admin}
+ return HTTPStatus.OK, {"admin": is_admin}
async def on_PUT(
self, request: SynapseRequest, user_id: str
@@ -784,17 +810,20 @@ class UserAdminServlet(RestServlet):
assert_params_in_dict(body, ["admin"])
- if not self.hs.is_mine(target_user):
- raise SynapseError(400, "Only local users can be admins of this homeserver")
+ if not self.is_mine(target_user):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST,
+ "Only local users can be admins of this homeserver",
+ )
set_admin_to = bool(body["admin"])
if target_user == auth_user and not set_admin_to:
- raise SynapseError(400, "You may not demote yourself.")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "You may not demote yourself.")
await self.store.set_server_admin(target_user, set_admin_to)
- return 200, {}
+ return HTTPStatus.OK, {}
class UserMembershipRestServlet(RestServlet):
@@ -802,7 +831,7 @@ class UserMembershipRestServlet(RestServlet):
Get room list of an user.
"""
- PATTERNS = admin_patterns("/users/(?P<user_id>[^/]+)/joined_rooms$")
+ PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/joined_rooms$")
def __init__(self, hs: "HomeServer"):
self.is_mine = hs.is_mine
@@ -816,7 +845,7 @@ class UserMembershipRestServlet(RestServlet):
room_ids = await self.store.get_rooms_for_user(user_id)
ret = {"joined_rooms": list(room_ids), "total": len(room_ids)}
- return 200, ret
+ return HTTPStatus.OK, ret
class PushersRestServlet(RestServlet):
@@ -845,7 +874,7 @@ class PushersRestServlet(RestServlet):
await assert_requester_is_admin(self.auth, request)
if not self.is_mine(UserID.from_string(user_id)):
- raise SynapseError(400, "Can only look up local users")
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Can only look up local users")
if not await self.store.get_user_by_id(user_id):
raise NotFoundError("User not found")
@@ -854,7 +883,10 @@ class PushersRestServlet(RestServlet):
filtered_pushers = [p.as_dict() for p in pushers]
- return 200, {"pushers": filtered_pushers, "total": len(filtered_pushers)}
+ return HTTPStatus.OK, {
+ "pushers": filtered_pushers,
+ "total": len(filtered_pushers),
+ }
class UserTokenRestServlet(RestServlet):
@@ -874,10 +906,10 @@ class UserTokenRestServlet(RestServlet):
PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/login$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
self.auth_handler = hs.get_auth_handler()
+ self.is_mine_id = hs.is_mine_id
async def on_POST(
self, request: SynapseRequest, user_id: str
@@ -886,30 +918,36 @@ class UserTokenRestServlet(RestServlet):
await assert_user_is_admin(self.auth, requester.user)
auth_user = requester.user
- if not self.hs.is_mine_id(user_id):
- raise SynapseError(400, "Only local users can be logged in as")
+ if not self.is_mine_id(user_id):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Only local users can be logged in as"
+ )
body = parse_json_object_from_request(request, allow_empty_body=True)
valid_until_ms = body.get("valid_until_ms")
if valid_until_ms and not isinstance(valid_until_ms, int):
- raise SynapseError(400, "'valid_until_ms' parameter must be an int")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "'valid_until_ms' parameter must be an int"
+ )
if auth_user.to_string() == user_id:
- raise SynapseError(400, "Cannot use admin API to login as self")
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Cannot use admin API to login as self"
+ )
- token = await self.auth_handler.get_access_token_for_user_id(
+ token = await self.auth_handler.create_access_token_for_user_id(
user_id=auth_user.to_string(),
device_id=None,
valid_until_ms=valid_until_ms,
puppets_user_id=user_id,
)
- return 200, {"access_token": token}
+ return HTTPStatus.OK, {"access_token": token}
class ShadowBanRestServlet(RestServlet):
- """An admin API for shadow-banning a user.
+ """An admin API for controlling whether a user is shadow-banned.
A shadow-banned users receives successful responses to their client-server
API requests, but the events are not propagated into rooms.
@@ -917,33 +955,57 @@ class ShadowBanRestServlet(RestServlet):
Shadow-banning a user should be used as a tool of last resort and may lead
to confusing or broken behaviour for the client.
- Example:
+ Example of shadow-banning a user:
POST /_synapse/admin/v1/users/@test:example.com/shadow_ban
{}
200 OK
{}
+
+ Example of removing a user from being shadow-banned:
+
+ DELETE /_synapse/admin/v1/users/@test:example.com/shadow_ban
+ {}
+
+ 200 OK
+ {}
"""
- PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/shadow_ban")
+ PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/shadow_ban$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
+ self.is_mine_id = hs.is_mine_id
async def on_POST(
self, request: SynapseRequest, user_id: str
) -> Tuple[int, JsonDict]:
await assert_requester_is_admin(self.auth, request)
- if not self.hs.is_mine_id(user_id):
- raise SynapseError(400, "Only local users can be shadow-banned")
+ if not self.is_mine_id(user_id):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Only local users can be shadow-banned"
+ )
await self.store.set_shadow_banned(UserID.from_string(user_id), True)
- return 200, {}
+ return HTTPStatus.OK, {}
+
+ async def on_DELETE(
+ self, request: SynapseRequest, user_id: str
+ ) -> Tuple[int, JsonDict]:
+ await assert_requester_is_admin(self.auth, request)
+
+ if not self.is_mine_id(user_id):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Only local users can be shadow-banned"
+ )
+
+ await self.store.set_shadow_banned(UserID.from_string(user_id), False)
+
+ return HTTPStatus.OK, {}
class RateLimitRestServlet(RestServlet):
@@ -962,20 +1024,20 @@ class RateLimitRestServlet(RestServlet):
}
"""
- PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/override_ratelimit")
+ PATTERNS = admin_patterns("/users/(?P<user_id>[^/]*)/override_ratelimit$")
def __init__(self, hs: "HomeServer"):
- self.hs = hs
self.store = hs.get_datastore()
self.auth = hs.get_auth()
+ self.is_mine_id = hs.is_mine_id
async def on_GET(
self, request: SynapseRequest, user_id: str
) -> Tuple[int, JsonDict]:
await assert_requester_is_admin(self.auth, request)
- if not self.hs.is_mine_id(user_id):
- raise SynapseError(400, "Can only look up local users")
+ if not self.is_mine_id(user_id):
+ raise SynapseError(HTTPStatus.BAD_REQUEST, "Can only look up local users")
if not await self.store.get_user_by_id(user_id):
raise NotFoundError("User not found")
@@ -996,15 +1058,17 @@ class RateLimitRestServlet(RestServlet):
else:
ret = {}
- return 200, ret
+ return HTTPStatus.OK, ret
async def on_POST(
self, request: SynapseRequest, user_id: str
) -> Tuple[int, JsonDict]:
await assert_requester_is_admin(self.auth, request)
- if not self.hs.is_mine_id(user_id):
- raise SynapseError(400, "Only local users can be ratelimited")
+ if not self.is_mine_id(user_id):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Only local users can be ratelimited"
+ )
if not await self.store.get_user_by_id(user_id):
raise NotFoundError("User not found")
@@ -1016,14 +1080,14 @@ class RateLimitRestServlet(RestServlet):
if not isinstance(messages_per_second, int) or messages_per_second < 0:
raise SynapseError(
- 400,
+ HTTPStatus.BAD_REQUEST,
"%r parameter must be a positive int" % (messages_per_second,),
errcode=Codes.INVALID_PARAM,
)
if not isinstance(burst_count, int) or burst_count < 0:
raise SynapseError(
- 400,
+ HTTPStatus.BAD_REQUEST,
"%r parameter must be a positive int" % (burst_count,),
errcode=Codes.INVALID_PARAM,
)
@@ -1039,19 +1103,21 @@ class RateLimitRestServlet(RestServlet):
"burst_count": ratelimit.burst_count,
}
- return 200, ret
+ return HTTPStatus.OK, ret
async def on_DELETE(
self, request: SynapseRequest, user_id: str
) -> Tuple[int, JsonDict]:
await assert_requester_is_admin(self.auth, request)
- if not self.hs.is_mine_id(user_id):
- raise SynapseError(400, "Only local users can be ratelimited")
+ if not self.is_mine_id(user_id):
+ raise SynapseError(
+ HTTPStatus.BAD_REQUEST, "Only local users can be ratelimited"
+ )
if not await self.store.get_user_by_id(user_id):
raise NotFoundError("User not found")
await self.store.delete_ratelimit_for_user(user_id)
- return 200, {}
+ return HTTPStatus.OK, {}
|