Skip to content

Commit 268f7cd

Browse files
committed
Create a new namedtuple object to store configuration for the is_media_visible() redaction bypass
1 parent 8e719e4 commit 268f7cd

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

synapse/media/media_repository.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
MediaRestrictions,
7777
RemoteMedia,
7878
)
79-
from synapse.types import JsonDict, Requester, UserID
79+
from synapse.types import JsonDict, RedactedMediaBypass, Requester, UserID
8080
from synapse.types.state import StateFilter
8181
from synapse.util import json_decoder
8282
from synapse.util.async_helpers import Linearizer
@@ -316,7 +316,7 @@ async def is_media_visible(
316316
self,
317317
requesting_user: UserID,
318318
media_info_object: Union[LocalMedia, RemoteMedia],
319-
allow_redacted_media: bool = False,
319+
redacted_media_bypass_config: Optional[RedactedMediaBypass] = None,
320320
) -> None:
321321
"""
322322
Verify that media requested for download should be visible to the user making
@@ -353,11 +353,15 @@ async def is_media_visible(
353353

354354
if attached_event_id:
355355
event_base = await self.store.get_event(attached_event_id)
356-
if event_base.internal_metadata.is_redacted() and not allow_redacted_media:
357-
# If the event the media is attached to is redacted, don't serve that
358-
# media to the user. Moderators and admins should probably be excluded
359-
# from this restriction
360-
raise NotFoundError()
356+
if event_base.internal_metadata.is_redacted():
357+
if (
358+
not redacted_media_bypass_config
359+
or not redacted_media_bypass_config.requesting_bypass
360+
):
361+
# If the event the media is attached to is redacted, don't serve that
362+
# media to the user. Moderators and admins should probably be excluded
363+
# from this restriction
364+
raise NotFoundError()
361365

362366
if event_base.is_state():
363367
# The standard event visibility utility, filter_events_for_client(),
@@ -994,10 +998,16 @@ async def get_local_media_info(
994998
# The file has been uploaded, so stop looping
995999
if media_info.media_length is not None:
9961000
if isinstance(request.requester, Requester):
1001+
# Only check media visibility if this is for a local request
1002+
is_admin = await self.auth.is_server_admin(request.requester)
1003+
redacted_media_bypass_config = RedactedMediaBypass(
1004+
allow_redacted_media, is_admin
1005+
)
1006+
9971007
await self.is_media_visible(
9981008
request.requester.user,
9991009
media_info,
1000-
allow_redacted_media,
1010+
redacted_media_bypass_config,
10011011
)
10021012
return media_info
10031013

@@ -1303,9 +1313,13 @@ async def _get_remote_media_impl(
13031313
# exists in the local database and again further down for after it was
13041314
# retrieved from the remote.
13051315
if self.msc3911_config.enabled and requester is not None:
1316+
is_admin = await self.auth.is_server_admin(requester)
1317+
redacted_media_bypass_config = RedactedMediaBypass(
1318+
allow_redacted_media, is_admin
1319+
)
13061320
# This will raise directly back to the client if not visible
13071321
await self.is_media_visible(
1308-
requester.user, media_info, allow_redacted_media
1322+
requester.user, media_info, redacted_media_bypass_config
13091323
)
13101324

13111325
# file_id is the ID we use to track the file locally. If we've already
@@ -1365,9 +1379,13 @@ async def _get_remote_media_impl(
13651379
and self.msc3911_config.enabled
13661380
and requester is not None
13671381
):
1382+
is_admin = await self.auth.is_server_admin(requester)
1383+
redacted_media_bypass_config = RedactedMediaBypass(
1384+
allow_redacted_media, is_admin
1385+
)
13681386
# This will raise directly back to the client if not visible
13691387
await self.is_media_visible(
1370-
requester.user, media_info, allow_redacted_media
1388+
requester.user, media_info, redacted_media_bypass_config
13711389
)
13721390

13731391
file_id = media_info.filesystem_id

synapse/types/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import logging
2424
import re
2525
import string
26+
from collections import namedtuple
2627
from enum import Enum
2728
from typing import (
2829
TYPE_CHECKING,
@@ -1530,3 +1531,8 @@ class ScheduledTask:
15301531
result: Optional[JsonMapping]
15311532
# Optional error that should be assigned a value when the status is FAILED
15321533
error: Optional[str]
1534+
1535+
1536+
RedactedMediaBypass = namedtuple(
1537+
"RedactedMediaBypass", ["requesting_bypass", "is_admin"]
1538+
)

0 commit comments

Comments
 (0)