Merge pull request #6145 from matrix-org/erikj/fix_censored_redactions
Fix fetching censored redactions from DB
This commit is contained in:
commit
35f392bb29
|
@ -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.
|
# we have to recheck auth now.
|
||||||
|
|
||||||
if not allow_rejected and entry.event.type == EventTypes.Redaction:
|
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
|
redacted_event_id = entry.event.redacts
|
||||||
event_map = yield self._get_events_from_cache_or_db([redacted_event_id])
|
event_map = yield self._get_events_from_cache_or_db([redacted_event_id])
|
||||||
original_event_entry = event_map.get(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))
|
self.get_success(self.store.persist_event(event, context))
|
||||||
|
|
||||||
|
return event
|
||||||
|
|
||||||
def test_redact(self):
|
def test_redact(self):
|
||||||
self.get_success(
|
self.get_success(
|
||||||
self.inject_room_member(self.room1, self.u_alice, Membership.JOIN)
|
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))
|
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 New Issue