Merge pull request #6145 from matrix-org/erikj/fix_censored_redactions
Fix fetching censored redactions from DBpull/6158/head
						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.
 | 
			
		||||
 | 
			
		||||
            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 New Issue