summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrendan Abolivier <babolivier@matrix.org>2020-10-14 12:00:52 +0100
committerGitHub <noreply@github.com>2020-10-14 12:00:52 +0100
commit3ee97a2748f64a772878b6e4d4775aed2e0534a2 (patch)
tree3fe7153c9d0a9f3795dfe0de93854e6ee61310e8
parentAdd correct M_BAD_JSON error code to /profile/{userId}/displayname (#8517) (diff)
downloadsynapse-3ee97a2748f64a772878b6e4d4775aed2e0534a2.tar.xz
Make sure a retention policy is a state event (#8527)
* Make sure a retention policy is a state event

* Changelog
-rw-r--r--changelog.d/8527.bugfix1
-rw-r--r--synapse/events/validator.py3
-rw-r--r--synapse/storage/databases/main/events.py4
3 files changed, 8 insertions, 0 deletions
diff --git a/changelog.d/8527.bugfix b/changelog.d/8527.bugfix
new file mode 100644
index 0000000000..727e0ba299
--- /dev/null
+++ b/changelog.d/8527.bugfix
@@ -0,0 +1 @@
+Fix a bug introduced in v1.7.0 that could cause Synapse to insert values from non-state `m.room.retention` events into the `room_retention` database table.
diff --git a/synapse/events/validator.py b/synapse/events/validator.py
index 9df35b54ba..5f9af8529b 100644
--- a/synapse/events/validator.py
+++ b/synapse/events/validator.py
@@ -83,6 +83,9 @@ class EventValidator:
         Args:
             event (FrozenEvent): The event to validate.
         """
+        if not event.is_state():
+            raise SynapseError(code=400, msg="must be a state event")
+
         min_lifetime = event.content.get("min_lifetime")
         max_lifetime = event.content.get("max_lifetime")
 
diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py
index fdb17745f6..ba3b1769b0 100644
--- a/synapse/storage/databases/main/events.py
+++ b/synapse/storage/databases/main/events.py
@@ -1270,6 +1270,10 @@ class PersistEventsStore:
             )
 
     def _store_retention_policy_for_room_txn(self, txn, event):
+        if not event.is_state():
+            logger.debug("Ignoring non-state m.room.retention event")
+            return
+
         if hasattr(event, "content") and (
             "min_lifetime" in event.content or "max_lifetime" in event.content
         ):