Реализованы сервисы ВМ2 - проверка сообщений и синхронизация с Б24 (деплой еще без перевода в боевой режим)
This commit is contained in:
@@ -1004,7 +1004,14 @@ async def complete_upload(
|
||||
or metadata.get("ContentType") != draft.mime_type
|
||||
):
|
||||
raise DomainError("attachment_invalid", 400, "Uploaded metadata differs")
|
||||
version_id, etag = metadata.get("VersionId"), metadata.get("ETag")
|
||||
if not version_id or not etag:
|
||||
raise DomainError(
|
||||
"dependency_unavailable", 503, "Versioned object metadata is unavailable"
|
||||
)
|
||||
draft.checksum_sha256 = checksum
|
||||
draft.quarantine_version_id = str(version_id)
|
||||
draft.quarantine_etag = str(etag)
|
||||
verdict = await safety.check(
|
||||
{
|
||||
"message_id": str(draft.id),
|
||||
@@ -1013,6 +1020,8 @@ async def complete_upload(
|
||||
"attachment": {
|
||||
"attachment_id": str(draft.id),
|
||||
"quarantine_object_key": draft.quarantine_object_key,
|
||||
"quarantine_version_id": draft.quarantine_version_id,
|
||||
"quarantine_etag": draft.quarantine_etag,
|
||||
"checksum": body.checksum,
|
||||
"mime_type": draft.mime_type,
|
||||
"size_bytes": draft.size_bytes,
|
||||
@@ -1020,25 +1029,33 @@ async def complete_upload(
|
||||
},
|
||||
request_id,
|
||||
)
|
||||
if verdict["_status"] == 203:
|
||||
if verdict["_status"] == 202:
|
||||
deadline = datetime.now(UTC) + timedelta(
|
||||
seconds=safety.settings.message_safety_task_poll_max_sec
|
||||
)
|
||||
while verdict["_status"] == 203 and datetime.now(UTC) < deadline:
|
||||
while verdict["_status"] == 202 and datetime.now(UTC) < deadline:
|
||||
await asyncio.sleep(safety.settings.message_safety_task_poll_interval_sec)
|
||||
verdict = await safety.poll(verdict["task_id"], request_id)
|
||||
verdict = await safety.poll(verdict["_location"], request_id)
|
||||
draft.safety_processing_mode = verdict.get("processing_mode")
|
||||
draft.safety_config_version = verdict.get("config_version")
|
||||
draft.safety_rules_version = verdict.get("rules_version")
|
||||
if verdict["_status"] == 200:
|
||||
destination = (
|
||||
f"attachments/users/{user_id}/{draft.context_type}/{draft.context_id}/{draft.id}"
|
||||
)
|
||||
await s3.promote(draft.quarantine_object_key or draft.object_key, destination)
|
||||
await s3.promote(
|
||||
draft.quarantine_object_key or draft.object_key,
|
||||
destination,
|
||||
version_id=draft.quarantine_version_id or "",
|
||||
etag=draft.quarantine_etag or "",
|
||||
)
|
||||
draft.storage_bucket = s3.settings.selectel_s3_bucket_attachments
|
||||
draft.object_key = destination
|
||||
draft.quarantine_object_key = None
|
||||
draft.scan_status = "clean"
|
||||
elif verdict["_status"] == 403 or (
|
||||
verdict["_status"] == 400 and verdict.get("verdict") == "deny"
|
||||
):
|
||||
draft.scan_status = (
|
||||
"bypassed" if verdict["processing_mode"] == "mock" else "clean"
|
||||
)
|
||||
elif verdict["_status"] == 403:
|
||||
if draft.quarantine_object_key:
|
||||
await s3.delete_quarantine(draft.quarantine_object_key)
|
||||
draft.scan_status = "infected"
|
||||
|
||||
Reference in New Issue
Block a user