From 4c84c9c4ad0d3a1e30b5384604e49f8569c0e015 Mon Sep 17 00:00:00 2001
From: Erik Johnston <erikj@element.io>
Date: Mon, 10 Feb 2025 16:27:46 +0100
Subject: [PATCH] Don't log exceptions for obviously incorrect stream tokens
 (#18139)

We log incorrect ones as we want to catch bugs where Synapse returns bad
tokens. However, sometimes clients just send tokens that are e.g. empty.

---------

Co-authored-by: Eric Eastwood <erice@element.io>
---
 changelog.d/18139.misc    | 1 +
 synapse/types/__init__.py | 5 +++++
 2 files changed, 6 insertions(+)
 create mode 100644 changelog.d/18139.misc

diff --git a/changelog.d/18139.misc b/changelog.d/18139.misc
new file mode 100644
index 0000000000..f753033b8e
--- /dev/null
+++ b/changelog.d/18139.misc
@@ -0,0 +1 @@
+Do not log at the exception-level when clients provide empty `since` token to `/sync` API.
diff --git a/synapse/types/__init__.py b/synapse/types/__init__.py
index 26783c5622..3d15c04faa 100644
--- a/synapse/types/__init__.py
+++ b/synapse/types/__init__.py
@@ -664,6 +664,11 @@ class RoomStreamToken(AbstractMultiWriterStreamToken):
 
     @classmethod
     async def parse(cls, store: "PurgeEventsStore", string: str) -> "RoomStreamToken":
+        # Check that it looks like a Synapse token first. We do this so that
+        # we don't log at the exception-level for obviously incorrect tokens.
+        if not string or string[0] not in ("s", "t", "m"):
+            raise SynapseError(400, f"Invalid room stream token {string:!r}")
+
         try:
             if string[0] == "s":
                 return cls(topological=None, stream=int(string[1:]))
-- 
GitLab