summary refs log tree commit diff
path: root/synapse/handlers
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2019-05-20 17:39:05 +0100
committerErik Johnston <erik@matrix.org>2019-05-20 17:39:05 +0100
commitc7ec06e8a6909343f5860a5eecbe3aa69f03c151 (patch)
tree882896b66d611a3415253dc18f14d80d44c6ad4a /synapse/handlers
parentRevert "expose SlavedProfileStore to ClientReaderSlavedStore (#5200)" (diff)
downloadsynapse-c7ec06e8a6909343f5860a5eecbe3aa69f03c151.tar.xz
Block attempts to annotate the same event twice
Diffstat (limited to 'synapse/handlers')
-rw-r--r--synapse/handlers/message.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index 7b2c33a922..0c892c8dba 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -22,7 +22,7 @@ from canonicaljson import encode_canonical_json, json
 from twisted.internet import defer
 from twisted.internet.defer import succeed
 
-from synapse.api.constants import EventTypes, Membership
+from synapse.api.constants import EventTypes, Membership, RelationTypes
 from synapse.api.errors import (
     AuthError,
     Codes,
@@ -601,6 +601,20 @@ class EventCreationHandler(object):
 
         self.validator.validate_new(event)
 
+        # We now check that if this event is an annotation that the can't
+        # annotate the same way twice (e.g. stops users from liking an event
+        # multiple times).
+        relation = event.content.get("m.relates_to", {})
+        if relation.get("rel_type") == RelationTypes.ANNOTATION:
+            relates_to = relation["event_id"]
+            aggregation_key = relation["key"]
+
+            already_exists = yield self.store.has_user_annotated_event(
+                relates_to, event.type, aggregation_key, event.sender,
+            )
+            if already_exists:
+                raise SynapseError(400, "Can't send same reaction twice")
+
         logger.debug(
             "Created event %s",
             event.event_id,