Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #6145 from matrix-org/erikj/fix_censored_redactions
Browse files Browse the repository at this point in the history
Fix fetching censored redactions from DB
  • Loading branch information
erikjohnston authored Oct 2, 2019
2 parents dfe7009 + 33d4ebd commit 35f392b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelog.d/6145.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix fetching censored redactions from DB, which caused APIs like initial sync to fail if it tried to include the censored redaction.
14 changes: 14 additions & 0 deletions synapse/storage/events_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,20 @@ def get_events_as_list(
# we have to recheck auth now.

if not allow_rejected and entry.event.type == EventTypes.Redaction:
if not hasattr(entry.event, "redacts"):
# A redacted redaction doesn't have a `redacts` key, in
# which case lets just withhold the event.
#
# Note: Most of the time if the redactions has been
# redacted we still have the un-redacted event in the DB
# and so we'll still see the `redacts` key. However, this
# isn't always true e.g. if we have censored the event.
logger.debug(
"Withholding redaction event %s as we don't have redacts key",
event_id,
)
continue

redacted_event_id = entry.event.redacts
event_map = yield self._get_events_from_cache_or_db([redacted_event_id])
original_event_entry = event_map.get(redacted_event_id)
Expand Down
36 changes: 36 additions & 0 deletions tests/storage/test_redaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ def inject_redaction(self, room, event_id, user, reason):

self.get_success(self.store.persist_event(event, context))

return event

def test_redact(self):
self.get_success(
self.inject_room_member(self.room1, self.u_alice, Membership.JOIN)
Expand Down Expand Up @@ -361,3 +363,37 @@ def test_redact_censor(self):
)

self.assert_dict({"content": {}}, json.loads(event_json))

def test_redact_redaction(self):
"""Tests that we can redact a redaction and can fetch it again.
"""

self.get_success(
self.inject_room_member(self.room1, self.u_alice, Membership.JOIN)
)

msg_event = self.get_success(self.inject_message(self.room1, self.u_alice, "t"))

first_redact_event = self.get_success(
self.inject_redaction(
self.room1, msg_event.event_id, self.u_alice, "Redacting message"
)
)

self.get_success(
self.inject_redaction(
self.room1,
first_redact_event.event_id,
self.u_alice,
"Redacting redaction",
)
)

# Now lets jump to the future where we have censored the redaction event
# in the DB.
self.reactor.advance(60 * 60 * 24 * 31)

# We just want to check that fetching the event doesn't raise an exception.
self.get_success(
self.store.get_event(first_redact_event.event_id, allow_none=True)
)

0 comments on commit 35f392b

Please sign in to comment.