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:
@@ -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() {
|
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 отдаёт список файлов, где подстрока встречается В КОДЕ.
|
# 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
|
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 \
|
||||||
[ -z "$bypass_hits" ] \
|
tools/build/build.sh \
|
||||||
|| fail "acceptance: обход проверки зависимостей $bypass_var вернулся в: $bypass_hits"
|
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
|
done
|
||||||
|
|
||||||
# И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем
|
# И в документации тоже: описанный, но нерабочий аварийный выход — хуже, чем
|
||||||
|
|||||||
Reference in New Issue
Block a user