#!/usr/bin/env bash # check-artifact-secrets.sh — fail (exit 1) if an electron-builder output # contains private key material. Belt-and-suspenders behind the # extraResources denylist in package.json (judge polish #5, batch 3a). # # Usage: scripts/check-artifact-secrets.sh set -u ROOT="${1:?usage: check-artifact-secrets.sh }" [ -d "$ROOT" ] || { echo "ERROR: $ROOT is not a directory"; exit 2; } fail=0 # 1. Filename scan: private-key extensions and well-known key filenames. keyfiles=$(find "$ROOT" -type f \( \ -name '*.key' -o -name '*.pem' -o -name '*.p12' -o -name '*.pfx' \ -o -name '*.jks' -o -name '*.keystore' -o -name '*.ppk' \ -o -name 'id_rsa*' -o -name 'id_ed25519*' -o -name 'id_ecdsa*' \ -o -name 'id_dsa*' -o -name '*.ovpn' -o -name '*.keytab' \ -o -name '*.asc' \ \) 2>/dev/null) if [ -n "$keyfiles" ]; then echo "FAIL: key-material filenames found:" echo "$keyfiles" fail=1 fi # 2. Content scan: PEM private-key headers. Skip Electron asar archives and # large binaries (they were covered by the filename scan + denylist). hits=$(grep -rl --binary-files=text -e 'PRIVATE KEY-----' "$ROOT" \ --exclude-dir='*.asar' --exclude='*.asar' 2>/dev/null || true) if [ -n "$hits" ]; then echo "FAIL: private-key content found in:" echo "$hits" fail=1 fi # 3. Env-file scan: .env files must never ship. envfiles=$(find "$ROOT" -type f \( -name '.env' -o -name '.env.*' \) 2>/dev/null) if [ -n "$envfiles" ]; then echo "FAIL: .env files found:" echo "$envfiles" fail=1 fi if [ "$fail" -eq 0 ]; then echo "OK: no private key material in $ROOT" fi exit "$fail"