Block attempts to annotate the same event twice

This commit is contained in:
Erik Johnston 2019-05-20 17:39:05 +01:00
parent 24b93b9c76
commit c7ec06e8a6
3 changed files with 86 additions and 5 deletions

View file

@ -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,