Skip to content

Commit d0873d5

Browse files
Ensure the url previewer also hashes and quarantines media (#18297)
Co-authored-by: Andrew Morgan <[email protected]>
1 parent c9adbc6 commit d0873d5

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

changelog.d/18297.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Apply file hashing and existing quarantines to media downloaded for URL previews.

synapse/media/media_repository.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,6 @@ async def create_content(
378378
media_length=content_length,
379379
user_id=auth_user,
380380
sha256=sha256,
381-
# TODO: Better name?
382381
quarantined_by="system" if should_quarantine else None,
383382
)
384383

synapse/media/url_previewer.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from synapse.http.client import SimpleHttpClient
4242
from synapse.logging.context import make_deferred_yieldable, run_in_background
4343
from synapse.media._base import FileInfo, get_filename_from_headers
44-
from synapse.media.media_storage import MediaStorage
44+
from synapse.media.media_storage import MediaStorage, SHA256TransparentIOWriter
4545
from synapse.media.oembed import OEmbedProvider
4646
from synapse.media.preview_html import decode_body, parse_html_to_open_graph
4747
from synapse.metrics.background_process_metrics import run_as_background_process
@@ -593,17 +593,26 @@ async def _handle_url(
593593
file_info = FileInfo(server_name=None, file_id=file_id, url_cache=True)
594594

595595
async with self.media_storage.store_into_file(file_info) as (f, fname):
596+
sha256writer = SHA256TransparentIOWriter(f)
596597
if url.startswith("data:"):
597598
if not allow_data_urls:
598599
raise SynapseError(
599600
500, "Previewing of data: URLs is forbidden", Codes.UNKNOWN
600601
)
601602

602-
download_result = await self._parse_data_url(url, f)
603+
download_result = await self._parse_data_url(url, sha256writer.wrap())
603604
else:
604-
download_result = await self._download_url(url, f)
605+
download_result = await self._download_url(url, sha256writer.wrap())
605606

606607
try:
608+
sha256 = sha256writer.hexdigest()
609+
should_quarantine = await self.store.get_is_hash_quarantined(sha256)
610+
611+
if should_quarantine:
612+
logger.warn(
613+
"Media has been automatically quarantined as it matched existing quarantined media"
614+
)
615+
607616
time_now_ms = self.clock.time_msec()
608617

609618
await self.store.store_local_media(
@@ -614,6 +623,8 @@ async def _handle_url(
614623
media_length=download_result.length,
615624
user_id=user,
616625
url_cache=url,
626+
sha256=sha256,
627+
quarantined_by="system" if should_quarantine else None,
617628
)
618629

619630
except Exception as e:

0 commit comments

Comments
 (0)