Просмотр исходного кода

fix(产物读取): 在摘要水合前拒绝非冻结 Attempt 产物

get_by_attempt 先检查数据库中的 ArtifactState,仅允许 frozen 或 published,再解析产物并验证 digest。避免废弃或草稿产物的损坏内容先触发误导性的摘要与摘要校验异常。
SamLee 20 часов назад
Родитель
Сommit
1eb34a96cc

+ 5 - 2
script_build_host/src/script_build_host/repositories/sqlalchemy.py

@@ -728,11 +728,14 @@ class SqlAlchemyScriptBusinessArtifactRepository:
         row = await self._find_by_attempt(attempt_id)
         if row is None:
             raise ArtifactNotFound()
+        if ArtifactState(str(row["state"])) not in {
+            ArtifactState.FROZEN,
+            ArtifactState.PUBLISHED,
+        }:
+            raise ArtifactNotFound()
         version = _version_from_row(row)
         if version.script_build_id != script_build_id or version.task_id != task_id:
             raise ArtifactOwnershipMismatch()
-        if version.state not in {ArtifactState.FROZEN, ArtifactState.PUBLISHED}:
-            raise ArtifactNotFound()
         if canonical_sha256(_artifact_payload(version.artifact)).wire != version.canonical_sha256:
             raise ArtifactDigestMismatch()
         return version