diff --git a/changelog.d/16365.misc b/changelog.d/16365.misc new file mode 100644 index 000000000000..f423d4dd9897 --- /dev/null +++ b/changelog.d/16365.misc @@ -0,0 +1 @@ +Add warning when `/forget` is used without a request body, as this is against the specification. \ No newline at end of file diff --git a/synapse/rest/client/room.py b/synapse/rest/client/room.py index 553938ce9d13..8ca22c799150 100644 --- a/synapse/rest/client/room.py +++ b/synapse/rest/client/room.py @@ -47,6 +47,7 @@ parse_enum, parse_integer, parse_json_object_from_request, + parse_json_value_from_request, parse_string, parse_strings_from_args, ) @@ -960,6 +961,17 @@ async def on_POST( self, request: SynapseRequest, room_id: str ) -> Tuple[int, JsonDict]: requester = await self.auth.get_user_by_req(request, allow_guest=False) + + content = parse_json_value_from_request(request, allow_empty_body=True) + if content is None: + logger.warning( + "No JSON body supplied to POST /forget. " + "This is not spec-compliant and will not be accepted in a future release!" + ) + elif not isinstance(content, dict): + message = "Content must be a JSON object." + raise SynapseError(HTTPStatus.BAD_REQUEST, message, errcode=Codes.BAD_JSON) + return await self._do(requester, room_id) async def on_PUT( @@ -968,6 +980,16 @@ async def on_PUT( requester = await self.auth.get_user_by_req(request, allow_guest=False) set_tag("txn_id", txn_id) + content = parse_json_value_from_request(request, allow_empty_body=True) + if content is None: + logger.warning( + "No JSON body supplied to PUT /forget. " + "This is not spec-compliant and will not be accepted in a future release!" + ) + elif not isinstance(content, dict): + message = "Content must be a JSON object." + raise SynapseError(HTTPStatus.BAD_REQUEST, message, errcode=Codes.BAD_JSON) + return await self.txns.fetch_or_execute_request( request, requester, self._do, requester, room_id )