mirror of
https://mau.dev/maunium/synapse.git
synced 2025-01-19 00:32:02 +01:00
Ensure we delete media if we reject due to spam check (#17246)
Fixes up #17239 We need to keep the spam check within the `try/except` block. Also makes it so that we don't enter the top span twice. Also also ensures that we get the right thumbnail length.
This commit is contained in:
parent
466f344547
commit
8bd9ff0783
3 changed files with 32 additions and 31 deletions
1
changelog.d/17246.misc
Normal file
1
changelog.d/17246.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix errors in logs about closing incorrect logging contexts when media gets rejected by a module.
|
|
@ -1049,6 +1049,11 @@ class MediaRepository:
|
||||||
finally:
|
finally:
|
||||||
t_byte_source.close()
|
t_byte_source.close()
|
||||||
|
|
||||||
|
# We flush and close the file to ensure that the bytes have
|
||||||
|
# been written before getting the size.
|
||||||
|
f.flush()
|
||||||
|
f.close()
|
||||||
|
|
||||||
t_len = os.path.getsize(fname)
|
t_len = os.path.getsize(fname)
|
||||||
|
|
||||||
# Write to database
|
# Write to database
|
||||||
|
|
|
@ -137,42 +137,37 @@ class MediaStorage:
|
||||||
dirname = os.path.dirname(fname)
|
dirname = os.path.dirname(fname)
|
||||||
os.makedirs(dirname, exist_ok=True)
|
os.makedirs(dirname, exist_ok=True)
|
||||||
|
|
||||||
main_media_repo_write_trace_scope = start_active_span(
|
try:
|
||||||
"writing to main media repo"
|
with start_active_span("writing to main media repo"):
|
||||||
)
|
|
||||||
main_media_repo_write_trace_scope.__enter__()
|
|
||||||
|
|
||||||
with main_media_repo_write_trace_scope:
|
|
||||||
try:
|
|
||||||
with open(fname, "wb") as f:
|
with open(fname, "wb") as f:
|
||||||
yield f, fname
|
yield f, fname
|
||||||
|
|
||||||
except Exception as e:
|
with start_active_span("writing to other storage providers"):
|
||||||
try:
|
spam_check = (
|
||||||
os.remove(fname)
|
await self._spam_checker_module_callbacks.check_media_file_for_spam(
|
||||||
except Exception:
|
ReadableFileWrapper(self.clock, fname), file_info
|
||||||
pass
|
)
|
||||||
|
|
||||||
raise e from None
|
|
||||||
|
|
||||||
with start_active_span("writing to other storage providers"):
|
|
||||||
spam_check = (
|
|
||||||
await self._spam_checker_module_callbacks.check_media_file_for_spam(
|
|
||||||
ReadableFileWrapper(self.clock, fname), file_info
|
|
||||||
)
|
)
|
||||||
)
|
if spam_check != self._spam_checker_module_callbacks.NOT_SPAM:
|
||||||
if spam_check != self._spam_checker_module_callbacks.NOT_SPAM:
|
logger.info("Blocking media due to spam checker")
|
||||||
logger.info("Blocking media due to spam checker")
|
# Note that we'll delete the stored media, due to the
|
||||||
# Note that we'll delete the stored media, due to the
|
# try/except below. The media also won't be stored in
|
||||||
# try/except below. The media also won't be stored in
|
# the DB.
|
||||||
# the DB.
|
# We currently ignore any additional field returned by
|
||||||
# We currently ignore any additional field returned by
|
# the spam-check API.
|
||||||
# the spam-check API.
|
raise SpamMediaException(errcode=spam_check[0])
|
||||||
raise SpamMediaException(errcode=spam_check[0])
|
|
||||||
|
|
||||||
for provider in self.storage_providers:
|
for provider in self.storage_providers:
|
||||||
with start_active_span(str(provider)):
|
with start_active_span(str(provider)):
|
||||||
await provider.store_file(path, file_info)
|
await provider.store_file(path, file_info)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
try:
|
||||||
|
os.remove(fname)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
raise e from None
|
||||||
|
|
||||||
async def fetch_media(self, file_info: FileInfo) -> Optional[Responder]:
|
async def fetch_media(self, file_info: FileInfo) -> Optional[Responder]:
|
||||||
"""Attempts to fetch media described by file_info from the local cache
|
"""Attempts to fetch media described by file_info from the local cache
|
||||||
|
|
Loading…
Add table
Reference in a new issue