fix(build): не дать скану обходов security-gate поймать самого себя

Третий раз в этом файле: скан `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.
This commit is contained in:
2026-08-30 07:47:40 +05:00
parent 219bb364bc
commit 60a1aea85e
+31 -9
View File
@@ -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)"
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_hits"
|| fail "acceptance: обход проверки зависимостей $bypass_var вернулся в $bypass_scan_file: $bypass_hits"
done
done
# И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем