forked from MirrorHub/synapse
Merge pull request #6145 from matrix-org/erikj/fix_censored_redactions
Fix fetching censored redactions from DB
This commit is contained in:
commit
35f392bb29
3 changed files with 51 additions and 0 deletions
1
changelog.d/6145.bugfix
Normal file
1
changelog.d/6145.bugfix
Normal file
|
@ -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.
|
|
@ -238,6 +238,20 @@ class EventsWorkerStore(SQLBaseStore):
|
|||
# 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)
|
||||
|
|
|
@ -118,6 +118,8 @@ class RedactionTestCase(unittest.HomeserverTestCase):
|
|||
|
||||
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)
|
||||
|
@ -361,3 +363,37 @@ class RedactionTestCase(unittest.HomeserverTestCase):
|
|||
)
|
||||
|
||||
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)
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue