From 60a1aea85e0d81edf2972193eb5f10d302c2b217 Mon Sep 17 00:00:00 2001 From: Crimson Date: Sun, 30 Aug 2026 07:47:40 +0500 Subject: [PATCH] =?UTF-8?q?fix(build):=20=D0=BD=D0=B5=20=D0=B4=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D0=BA=D0=B0=D0=BD=D1=83=20=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20security-gate=20=D0=BF=D0=BE=D0=B9?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D1=8C=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=81=D0=B5=D0=B1=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Третий раз в этом файле: скан `code_mentions_in "$bypass_var" tools/build` находил строку `for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN` в самой приёмке. Это код, а не комментарий, поэтому code_without_comments не помогал, и проверка гарантированно падала бы на корректном дереве — снова в конце сборки. Сканируются перечисленные модули сборки, а не весь каталог. Заодно code_without_comments выбирает вид комментария по расширению: решётка отбрасывается только в shell. В шаблоне Vue строка вполне может начинаться с `#default="scope"` — это сокращение v-slot, и общий фильтр молча выбрасывал бы её из сканов по apps/frontend/src. --- tools/build/lib/acceptance.sh | 42 ++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/tools/build/lib/acceptance.sh b/tools/build/lib/acceptance.sh index 9cfb43f..c61b76b 100644 --- a/tools/build/lib/acceptance.sh +++ b/tools/build/lib/acceptance.sh @@ -13,13 +13,20 @@ set -euo pipefail # удалённые маршруты, чтобы доказать их отсутствие. Помощник существует, чтобы # третьего раза не было. # -# Отбрасываются оба вида строк-комментариев: `//` для Go и TypeScript, `#` для -# shell. Раньше стриплось только `//`, поэтому сканы по tools/build/*.sh не -# работали вовсе — там комментарии начинаются с решётки, и объяснение «почему -# этого больше нет» считалось за код. Ни один из языков не использует префикс -# другого для чего-то иного, так что общий фильтр безопасен для обоих. +# Вид комментария выбирается по расширению файла. +# +# Раньше отбрасывались только строки, начинающиеся с `//`, поэтому сканы по +# tools/build/*.sh не работали вовсе: там комментарии начинаются с решётки, и +# объяснение «почему этого больше нет» считалось за код. +# +# Решётка при этом отбрасывается ТОЛЬКО в shell. В шаблоне Vue строка вполне +# может начинаться с `#default="scope"` — это сокращение для v-slot, а не +# комментарий, и общий фильтр молча выбрасывал бы её из скана. code_without_comments() { - grep -vE '^[[:space:]]*(//|#)' "$1" 2>/dev/null || true + case "$1" in + *.sh) grep -vE '^[[:space:]]*#' "$1" 2>/dev/null || true ;; + *) grep -v '^[[:space:]]*//' "$1" 2>/dev/null || true ;; + esac } # code_mentions_in отдаёт список файлов, где подстрока встречается В КОДЕ. @@ -638,11 +645,26 @@ run_dependency_hygiene_acceptance() { # Противоречие закрыто в пользу строгой политики, и теперь это проверяется, а # не только описано. Ищется КОД: комментарий выше объясняет, почему обходов # нет, и обязан называть их по имени. - local bypass_var bypass_hits + # + # Сканируются модули, которые могли бы обход вернуть, а НЕ весь tools/build. + # Причина ровно та, из-за которой в этом файле дважды падала сборка на + # корректном коде: скан по всему каталогу находил сам себя — строку + # `for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN` ниже. + # Это код, а не комментарий, поэтому code_without_comments тут не спасает. + local bypass_var bypass_scan_file bypass_hits for bypass_var in ALLOW_VULNERABLE_DEPENDENCIES SKIP_SECURITY_SCAN; do - bypass_hits="$(code_mentions_in "$bypass_var" tools/build)" - [ -z "$bypass_hits" ] \ - || fail "acceptance: обход проверки зависимостей $bypass_var вернулся в: $bypass_hits" + for bypass_scan_file in \ + tools/build/build.sh \ + tools/build/lib/security.sh \ + tools/build/lib/package.sh \ + tools/build/lib/versions.sh \ + tools/build/lib/deps.sh \ + tools/build/lib/verify.sh + do + bypass_hits="$(code_without_comments "$bypass_scan_file" | grep -F -- "$bypass_var" || true)" + [ -z "$bypass_hits" ] \ + || fail "acceptance: обход проверки зависимостей $bypass_var вернулся в $bypass_scan_file: $bypass_hits" + done done # И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем