From 1f32b90b0ff0f4f4f499f95e8150efe438388270 Mon Sep 17 00:00:00 2001
From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
Date: Tue, 29 Mar 2022 14:56:25 +0100
Subject: [PATCH] Room batch: fix up handling of unknown prev_event_ids
 (#12316)

---
 changelog.d/12316.misc            |  1 +
 synapse/rest/client/room_batch.py | 21 +++++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
 create mode 100644 changelog.d/12316.misc

diff --git a/changelog.d/12316.misc b/changelog.d/12316.misc
new file mode 100644
index 0000000000..9f333e718a
--- /dev/null
+++ b/changelog.d/12316.misc
@@ -0,0 +1 @@
+Avoid trying to calculate the state at outlier events.
diff --git a/synapse/rest/client/room_batch.py b/synapse/rest/client/room_batch.py
index 0780485322..dd91dabedd 100644
--- a/synapse/rest/client/room_batch.py
+++ b/synapse/rest/client/room_batch.py
@@ -123,6 +123,19 @@ class RoomBatchSendEventRestServlet(RestServlet):
                     errcode=Codes.INVALID_PARAM,
                 )
 
+        # Make sure that the prev_event_ids exist and aren't outliers - ie, they are
+        # regular parts of the room DAG where we know the state.
+        non_outlier_prev_events = await self.store.have_events_in_timeline(
+            prev_event_ids_from_query
+        )
+        for prev_event_id in prev_event_ids_from_query:
+            if prev_event_id not in non_outlier_prev_events:
+                raise SynapseError(
+                    HTTPStatus.BAD_REQUEST,
+                    "prev_event %s does not exist, or is an outlier" % (prev_event_id,),
+                    errcode=Codes.INVALID_PARAM,
+                )
+
         # For the event we are inserting next to (`prev_event_ids_from_query`),
         # find the most recent state events that allowed that message to be
         # sent. We will use that as a base to auth our historical messages
@@ -131,14 +144,6 @@ class RoomBatchSendEventRestServlet(RestServlet):
             prev_event_ids_from_query
         )
 
-        if not state_event_ids:
-            raise SynapseError(
-                HTTPStatus.BAD_REQUEST,
-                "No auth events found for given prev_event query parameter. The prev_event=%s probably does not exist."
-                % prev_event_ids_from_query,
-                errcode=Codes.INVALID_PARAM,
-            )
-
         state_event_ids_at_start = []
         # Create and persist all of the state events that float off on their own
         # before the batch. These will most likely be all of the invite/member
-- 
GitLab