|
76 | 76 | MediaRestrictions, |
77 | 77 | RemoteMedia, |
78 | 78 | ) |
79 | | -from synapse.types import JsonDict, Requester, UserID |
| 79 | +from synapse.types import JsonDict, RedactedMediaBypass, Requester, UserID |
80 | 80 | from synapse.types.state import StateFilter |
81 | 81 | from synapse.util import json_decoder |
82 | 82 | from synapse.util.async_helpers import Linearizer |
@@ -316,7 +316,7 @@ async def is_media_visible( |
316 | 316 | self, |
317 | 317 | requesting_user: UserID, |
318 | 318 | media_info_object: Union[LocalMedia, RemoteMedia], |
319 | | - allow_redacted_media: bool = False, |
| 319 | + redacted_media_bypass_config: Optional[RedactedMediaBypass] = None, |
320 | 320 | ) -> None: |
321 | 321 | """ |
322 | 322 | Verify that media requested for download should be visible to the user making |
@@ -353,11 +353,15 @@ async def is_media_visible( |
353 | 353 |
|
354 | 354 | if attached_event_id: |
355 | 355 | 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() |
361 | 365 |
|
362 | 366 | if event_base.is_state(): |
363 | 367 | # The standard event visibility utility, filter_events_for_client(), |
@@ -994,10 +998,16 @@ async def get_local_media_info( |
994 | 998 | # The file has been uploaded, so stop looping |
995 | 999 | if media_info.media_length is not None: |
996 | 1000 | 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 | + |
997 | 1007 | await self.is_media_visible( |
998 | 1008 | request.requester.user, |
999 | 1009 | media_info, |
1000 | | - allow_redacted_media, |
| 1010 | + redacted_media_bypass_config, |
1001 | 1011 | ) |
1002 | 1012 | return media_info |
1003 | 1013 |
|
@@ -1303,9 +1313,13 @@ async def _get_remote_media_impl( |
1303 | 1313 | # exists in the local database and again further down for after it was |
1304 | 1314 | # retrieved from the remote. |
1305 | 1315 | 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 | + ) |
1306 | 1320 | # This will raise directly back to the client if not visible |
1307 | 1321 | await self.is_media_visible( |
1308 | | - requester.user, media_info, allow_redacted_media |
| 1322 | + requester.user, media_info, redacted_media_bypass_config |
1309 | 1323 | ) |
1310 | 1324 |
|
1311 | 1325 | # 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( |
1365 | 1379 | and self.msc3911_config.enabled |
1366 | 1380 | and requester is not None |
1367 | 1381 | ): |
| 1382 | + is_admin = await self.auth.is_server_admin(requester) |
| 1383 | + redacted_media_bypass_config = RedactedMediaBypass( |
| 1384 | + allow_redacted_media, is_admin |
| 1385 | + ) |
1368 | 1386 | # This will raise directly back to the client if not visible |
1369 | 1387 | await self.is_media_visible( |
1370 | | - requester.user, media_info, allow_redacted_media |
| 1388 | + requester.user, media_info, redacted_media_bypass_config |
1371 | 1389 | ) |
1372 | 1390 |
|
1373 | 1391 | file_id = media_info.filesystem_id |
|
0 commit comments