summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Eastwood <erice@element.io>2022-07-07 11:52:45 -0500
committerGitHub <noreply@github.com>2022-07-07 11:52:45 -0500
commita962c5a56de69c03848646f25991fabe6e4c39d1 (patch)
tree4bf64255651e66f62114a4f03b235dd88299c844
parentAdd --build-only option to complement.sh to prevent actually running Compleme... (diff)
downloadsynapse-a962c5a56de69c03848646f25991fabe6e4c39d1.tar.xz
Fix exception when using MSC3030 to look for remote federated events before room creation (#13197)
Complement tests: https://github.com/matrix-org/complement/pull/405

This happens when you have some messages imported before the room is created.
Then use MSC3030 to look backwards before the room creation from a remote
federated server. The server won't find anything locally, but will ask over
federation which will have the remote event. The previous logic would
choke on not having the local event assigned.

```
Failed to fetch /timestamp_to_event from hs2 because of exception(UnboundLocalError) local variable 'local_event' referenced before assignment args=("local variable 'local_event' referenced before assignment",)
```
-rw-r--r--changelog.d/13197.bugfix1
-rw-r--r--synapse/handlers/room.py6
2 files changed, 6 insertions, 1 deletions
diff --git a/changelog.d/13197.bugfix b/changelog.d/13197.bugfix
new file mode 100644
index 0000000000..8417241523
--- /dev/null
+++ b/changelog.d/13197.bugfix
@@ -0,0 +1 @@
+Fix exception when using experimental [MSC3030](https://github.com/matrix-org/matrix-spec-proposals/pull/3030) `/timestamp_to_event` endpoint to look for remote federated imported events before room creation.
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index 75c0be8c36..44f8084579 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -1375,6 +1375,7 @@ class TimestampLookupHandler:
         # the timestamp given and the event we were able to find locally
         is_event_next_to_backward_gap = False
         is_event_next_to_forward_gap = False
+        local_event = None
         if local_event_id:
             local_event = await self.store.get_event(
                 local_event_id, allow_none=False, allow_rejected=False
@@ -1461,7 +1462,10 @@ class TimestampLookupHandler:
                         ex.args,
                     )
 
-        if not local_event_id:
+        # To appease mypy, we have to add both of these conditions to check for
+        # `None`. We only expect `local_event` to be `None` when
+        # `local_event_id` is `None` but mypy isn't as smart and assuming as us.
+        if not local_event_id or not local_event:
             raise SynapseError(
                 404,
                 "Unable to find event from %s in direction %s" % (timestamp, direction),