Реализованы сервисы ВМ2 - проверка сообщений и синхронизация с Б24 (деплой еще без перевода в боевой режим)

This commit is contained in:
mi
2026-08-13 18:52:42 +03:00
parent 5100ba9fc3
commit 99605b1c77
144 changed files with 15295 additions and 1120 deletions
@@ -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"