4141from synapse .http .client import SimpleHttpClient
4242from synapse .logging .context import make_deferred_yieldable , run_in_background
4343from 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
4545from synapse .media .oembed import OEmbedProvider
4646from synapse .media .preview_html import decode_body , parse_html_to_open_graph
4747from 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