diff --git a/synapse/api/errors.py b/synapse/api/errors.py index f52dcbf6d..e92db29f6 100644 --- a/synapse/api/errors.py +++ b/synapse/api/errors.py @@ -79,8 +79,6 @@ class Codes: UNABLE_AUTHORISE_JOIN = "M_UNABLE_TO_AUTHORISE_JOIN" UNABLE_TO_GRANT_JOIN = "M_UNABLE_TO_GRANT_JOIN" - UNREDACTED_CONTENT_DELETED = "FI.MAU.MSC2815_UNREDACTED_CONTENT_DELETED" - class CodeMessageException(RuntimeError): """An exception with integer code and message string attributes. @@ -485,22 +483,6 @@ class RequestSendFailed(RuntimeError): self.can_retry = can_retry -class UnredactedContentDeleted(SynapseError): - def __init__(self, content_keep_ms: Optional[int] = None): - super().__init__( - 404, - "The content for that event has already been erased from the database", - errcode=Codes.UNREDACTED_CONTENT_DELETED, - ) - self.content_keep_ms = content_keep_ms - - def error_dict(self) -> "JsonDict": - extra = {} - if self.content_keep_ms is not None: - extra = {"fi.mau.msc2815.content_keep_ms": self.content_keep_ms} - return cs_error(self.msg, self.errcode, **extra) - - def cs_error(msg: str, code: str = Codes.UNKNOWN, **kwargs: Any) -> "JsonDict": """Utility method for constructing an error response for client-server interactions. diff --git a/synapse/handlers/events.py b/synapse/handlers/events.py index 4f2260087..d2ccb5c5d 100644 --- a/synapse/handlers/events.py +++ b/synapse/handlers/events.py @@ -21,7 +21,6 @@ from synapse.api.errors import AuthError, SynapseError from synapse.events import EventBase from synapse.events.utils import SerializeEventConfig from synapse.handlers.presence import format_user_presence_state -from synapse.storage.databases.main.events_worker import EventRedactBehaviour from synapse.streams.config import PaginationConfig from synapse.types import JsonDict, UserID from synapse.visibility import filter_events_for_client @@ -140,11 +139,7 @@ class EventHandler: self.storage = hs.get_storage() async def get_event( - self, - user: UserID, - room_id: Optional[str], - event_id: str, - show_redacted: bool = False, + self, user: UserID, room_id: Optional[str], event_id: str ) -> Optional[EventBase]: """Retrieve a single specified event. @@ -153,7 +148,6 @@ class EventHandler: room_id: The expected room id. We'll return None if the event's room does not match. event_id: The event ID to obtain. - show_redacted: Should the full content of redacted events be returned? Returns: An event, or None if there is no event matching this ID. Raises: @@ -161,12 +155,7 @@ class EventHandler: AuthError if the user does not have the rights to inspect this event. """ - redact_behaviour = ( - EventRedactBehaviour.AS_IS if show_redacted else EventRedactBehaviour.REDACT - ) - event = await self.store.get_event( - event_id, check_room_id=room_id, redact_behaviour=redact_behaviour - ) + event = await self.store.get_event(event_id, check_room_id=room_id) if not event: return None diff --git a/synapse/rest/client/room.py b/synapse/rest/client/room.py index 82c64da79..fa60440a9 100644 --- a/synapse/rest/client/room.py +++ b/synapse/rest/client/room.py @@ -21,7 +21,6 @@ from urllib import parse as urlparse from twisted.web.server import Request -from synapse import event_auth from synapse.api.constants import EventTypes, Membership from synapse.api.errors import ( AuthError, @@ -30,7 +29,6 @@ from synapse.api.errors import ( MissingClientTokenError, ShadowBanError, SynapseError, - UnredactedContentDeleted, ) from synapse.api.filtering import Filter from synapse.events.utils import format_event_for_client_v2 @@ -649,54 +647,18 @@ class RoomEventServlet(RestServlet): super().__init__() self.clock = hs.get_clock() self._store = hs.get_datastores().main - self._state = hs.get_state_handler() self.event_handler = hs.get_event_handler() self._event_serializer = hs.get_event_client_serializer() self._relations_handler = hs.get_relations_handler() self.auth = hs.get_auth() - self.content_keep_ms = hs.config.server.redaction_retention_period async def on_GET( self, request: SynapseRequest, room_id: str, event_id: str ) -> Tuple[int, JsonDict]: requester = await self.auth.get_user_by_req(request, allow_guest=True) - - include_unredacted_content = ( - parse_string( - request, - "fi.mau.msc2815.include_unredacted_content", - allowed_values=("true", "false"), - ) - == "true" - ) - if include_unredacted_content and not await self.auth.is_server_admin( - requester.user - ): - power_level_event = await self._state.get_current_state( - room_id, EventTypes.PowerLevels, "" - ) - - auth_events = {} - if power_level_event: - auth_events[(EventTypes.PowerLevels, "")] = power_level_event - - redact_level = event_auth.get_named_level(auth_events, "redact", 50) - user_level = event_auth.get_user_power_level( - requester.user.to_string(), auth_events - ) - if user_level < redact_level: - raise SynapseError( - 403, - "You don't have permission to view redacted events in this room.", - errcode=Codes.FORBIDDEN, - ) - try: event = await self.event_handler.get_event( - requester.user, - room_id, - event_id, - show_redacted=include_unredacted_content, + requester.user, room_id, event_id ) except AuthError: # This endpoint is supposed to return a 404 when the requester does @@ -705,11 +667,6 @@ class RoomEventServlet(RestServlet): raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND) if event: - if include_unredacted_content and await self._store.have_censored_event( - event_id - ): - raise UnredactedContentDeleted(self.content_keep_ms) - # Ensure there are bundled aggregations available. aggregations = await self._relations_handler.get_bundled_aggregations( [event], requester.user.to_string() diff --git a/synapse/storage/databases/main/events_worker.py b/synapse/storage/databases/main/events_worker.py index 6d6dd07b6..a60e3f4fd 100644 --- a/synapse/storage/databases/main/events_worker.py +++ b/synapse/storage/databases/main/events_worker.py @@ -303,15 +303,6 @@ class EventsWorkerStore(SQLBaseStore): desc="get_received_ts", ) - async def have_censored_event(self, event_id: str) -> Optional[bool]: - return await self.db_pool.simple_select_one_onecol( - table="redactions", - keyvalues={"redacts": event_id}, - retcol="have_censored", - desc="get_have_censored", - allow_none=True, - ) - # Inform mypy that if allow_none is False (the default) then get_event # always returns an EventBase. @overload