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

Fix fetching censored redactions from DB #6145

Merged
merged 2 commits into from
Oct 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
)