From 23c0908fd18cf3475e1c569a6af1183208d038c9 Mon Sep 17 00:00:00 2001 From: Ryan Miguel Date: Fri, 21 Oct 2022 10:48:08 -0700 Subject: [PATCH 1/2] Return NOT_JSON if decode fails and defer set_timeline_upper_limit call until after check_valid_filter. Fixes #13661. Signed-off-by: Ryan Miguel . --- changelog.d/14262.misc | 1 + synapse/rest/client/sync.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 changelog.d/14262.misc diff --git a/changelog.d/14262.misc b/changelog.d/14262.misc new file mode 100644 index 000000000000..a0c11c5a232e --- /dev/null +++ b/changelog.d/14262.misc @@ -0,0 +1 @@ +Return M_NOT_JSON rather than M_UNKNOWN when decode fails. diff --git a/synapse/rest/client/sync.py b/synapse/rest/client/sync.py index 8a16459105f3..f2013faeb206 100644 --- a/synapse/rest/client/sync.py +++ b/synapse/rest/client/sync.py @@ -146,12 +146,12 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: elif filter_id.startswith("{"): try: filter_object = json_decoder.decode(filter_id) - set_timeline_upper_limit( - filter_object, self.hs.config.server.filter_timeline_limit - ) except Exception: - raise SynapseError(400, "Invalid filter JSON") + raise SynapseError(400, "Invalid filter JSON", errcode=Codes.NOT_JSON) self.filtering.check_valid_filter(filter_object) + set_timeline_upper_limit( + filter_object, self.hs.config.server.filter_timeline_limit + ) filter_collection = FilterCollection(self.hs, filter_object) else: try: From 291e446208a0bde2c427b705f2dcc2ff2983f679 Mon Sep 17 00:00:00 2001 From: David Robertson Date: Mon, 24 Oct 2022 16:54:50 +0100 Subject: [PATCH 2/2] Reword changelog --- changelog.d/14262.misc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/14262.misc b/changelog.d/14262.misc index a0c11c5a232e..c1d23bc67de9 100644 --- a/changelog.d/14262.misc +++ b/changelog.d/14262.misc @@ -1 +1 @@ -Return M_NOT_JSON rather than M_UNKNOWN when decode fails. +Provide a specific error code when a `/sync` request provides a filter which doesn't represent a JSON object.