Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A1dxvtsZx8NE9fwjXUNDBr
52 lines
2.8 KiB
Bash
Executable File
52 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Prima di pubblicare: niente prompt, fogli grezzi, log di Codex, segreti o nomi della rete di casa.
|
|
# Guarda tutti i percorsi raggiungibili da tutti i ref (la storia intera, non solo HEAD) e il testo di HEAD.
|
|
# `--self-test` costruisce un repo usa e getta, inietta un prompt e un host .lan e pretende che siano rifiutati:
|
|
# un controllo che non fallisce mai non prova niente.
|
|
set -euo pipefail
|
|
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
|
|
|
|
FORBIDDEN_PATHS='(^|/)(PROMPT[A-Z_]*\.md|prompts/|assets/raw/|assets/generated/|codex[a-z.-]*\.log|deploy\.local\.mk)'
|
|
FORBIDDEN_PATHS+='|(^|/)\.env$|(^|/)id_(rsa|ed25519|ecdsa)(\.pub)?$|\.(pem|key|p12|pfx)$'
|
|
FORBIDDEN_TEXT='[a-z0-9-]+\.lan([^a-z0-9.-]|$)|192\.168\.[0-9]+\.[0-9]+|BEGIN (RSA|OPENSSH|EC|DSA) PRIVATE KEY'
|
|
|
|
scan_repo() {
|
|
local repo=$1 rc=0 hits
|
|
hits=$(git -C "$repo" rev-list --all --objects | awk 'NF>1{print $2}' | sort -u | grep -E "$FORBIDDEN_PATHS" || true)
|
|
if [[ -n $hits ]]; then
|
|
echo "FAIL: percorsi vietati nella storia (va riscritta, non basta cancellarli):"
|
|
echo "$hits" | head -40 | sed 's/^/ /'
|
|
rc=1
|
|
fi
|
|
hits=$(git -C "$repo" grep -nIE "$FORBIDDEN_TEXT" HEAD -- . ':!scripts/check-public.sh' 2>/dev/null | sed 's/^HEAD://' || true)
|
|
if [[ -n $hits ]]; then
|
|
echo "FAIL: testo vietato in HEAD:"
|
|
echo "$hits" | head -20 | sed 's/^/ /'
|
|
rc=1
|
|
fi
|
|
[[ $rc -eq 0 ]] && echo "PASS: niente prompt, fogli grezzi, segreti o host privati in $repo (tutti i ref)"
|
|
return $rc
|
|
}
|
|
|
|
self_test() {
|
|
local tmp
|
|
tmp=$(mktemp -d /tmp/check-public.XXXXXX)
|
|
trap 'rm -rf -- "$tmp"' RETURN
|
|
local -a g=(git -C "$tmp" -c user.name=check -c user.email=check@example.invalid -c commit.gpgsign=false)
|
|
git init -q "$tmp"
|
|
printf '# pulito\n' > "$tmp/README.md"
|
|
"${g[@]}" add README.md && "${g[@]}" commit -qm pulito
|
|
scan_repo "$tmp" >/dev/null || { echo 'self-test FAIL: un repo pulito deve passare'; return 1; }
|
|
mkdir -p "$tmp/prompts" && printf 'foto di famiglia\n' > "$tmp/prompts/character_x.md"
|
|
"${g[@]}" add prompts && "${g[@]}" commit -qm 'prompt iniettato'
|
|
"${g[@]}" rm -rq prompts && "${g[@]}" commit -qm 'cancellato (resta nella storia)'
|
|
if scan_repo "$tmp" >/dev/null 2>&1; then echo 'self-test FAIL: un prompt nella storia deve essere rifiutato'; return 1; fi
|
|
rm -rf "$tmp/.git" && git init -q "$tmp" && printf 'DEPLOY_HOST = root@casa.lan\n' > "$tmp/README.md"
|
|
"${g[@]}" add README.md && "${g[@]}" commit -qm 'host privato'
|
|
if scan_repo "$tmp" >/dev/null 2>&1; then echo 'self-test FAIL: un host .lan deve essere rifiutato'; return 1; fi
|
|
echo 'self-test PASS: repo pulito accettato, prompt nella storia e host .lan rifiutati'
|
|
}
|
|
|
|
[[ ${1:-} == --self-test ]] && { self_test; exit; }
|
|
scan_repo "$ROOT"
|