# .github/workflows/secret-guard.yml
# Penjaga Kebocoran Rahasia - tolak commit yang berisi file .env asli / kunci asli.
#
# Cara kerja (HYBRID, sengaja minim alarm-palsu):
#   - TOLAK-KERAS (CI merah): file .env ASLI ter-commit (.env, .env.local, .env.production, dst).
#     File contoh (.env.example/.sample/.template) DIKECUALIKAN - itu cuma placeholder, aman.
#   - PERINGATAN (tidak memblokir): ada yang MIRIP kunci asli (sk-ant-/AKIA/ghp_/dst) di file ter-track.
#     Non-blokir supaya placeholder di file contoh tidak menghentikan kerja staf.
#   - PERINGATAN: repo non-sensitive tapi .env.example mendeklarasi kunci DB (DATABASE_URL dll).
#     Tingkat repo dibaca dari Variable REPO_TIER atau berkas .split-state.
#
# Robot ini TIDAK butuh secret apa pun (cuma membaca kode). Aman jalan di mana saja.

name: Penjaga Kebocoran Rahasia

on:
  push:
  pull_request:

# Hak akses minimum: cuma baca kode.
permissions:
  contents: read

jobs:
  secret-guard:
    name: Penjaga Kebocoran Rahasia
    runs-on: ubuntu-latest
    steps:
      - name: Checkout kode
        uses: actions/checkout@v4

      - name: Pindai rahasia ter-commit
        shell: bash
        env:
          REPO_TIER: ${{ vars.REPO_TIER }}
        run: |
          set -uo pipefail
          fail=0

          # === TOLAK-KERAS (nol alarm-palsu): file .env ASLI ter-commit ===
          # .env.example / .sample / .template = AMAN (cuma contoh), dikecualikan.
          envfiles=$(git ls-files | grep -E '(^|/)\.env(\.[A-Za-z0-9_-]+)?$' | grep -Ev '\.(examples?|samples?|templates?|dist|demo)$' || true)
          if [ -n "$envfiles" ]; then
            echo "::error::File rahasia (.env ASLI) ter-commit ke git -- ini TIDAK BOLEH (bisa bocorkan kunci):"
            while IFS= read -r f; do
              [ -n "$f" ] && echo "::error::  - $f  (perbaiki: tambah ke .gitignore lalu jalankan: git rm --cached \"$f\")"
            done <<< "$envfiles"
            fail=1
          fi

          # === PERINGATAN (tidak memblokir): sesuatu yang MIRIP kunci asli di file ter-track ===
          # Cuma cetak NAMA berkas (pakai grep -l), TIDAK pernah cetak nilai rahasianya ke log.
          patterns='sk-ant-[A-Za-z0-9_-]{20}|AKIA[0-9A-Z]{16}|gh[posu]_[A-Za-z0-9]{36}|xox[baprs]-[A-Za-z0-9-]{10}|glpat-[A-Za-z0-9_-]{20}'
          scan=$(git ls-files | grep -vE '^\.github/' | grep -vE '\.env\.(examples?|samples?|templates?|dist|demo)$' | grep -vE '(^|/)(package-lock\.json|pnpm-lock\.yaml|yarn\.lock)$' || true)
          if [ -n "$scan" ]; then
            keyfiles=$(printf '%s\n' "$scan" | xargs -d '\n' grep -lIE "$patterns" 2>/dev/null || true)
            if [ -n "$keyfiles" ]; then
              echo "::warning::File berikut MUNGKIN berisi kunci/token asli. Periksa; kalau asli: hapus dari git + ganti (rotate) kuncinya. Lihat docs/SECURITY_INCIDENT_PLAYBOOK.md."
              while IFS= read -r f; do
                [ -n "$f" ] && echo "::warning::  - $f"
              done <<< "$keyfiles"
            fi
          fi

          # === PERINGATAN: repo non-sensitive tapi .env.example mendeklarasi kunci DB ===
          tier="${REPO_TIER:-}"
          if [ -z "$tier" ] && [ -f .split-state ]; then
            tier=$(grep -E '^access_tier:' .split-state 2>/dev/null | head -1 | sed -E 's/^access_tier:[[:space:]]*//' | tr -d ' "' || true)
          fi
          if [ -n "$tier" ] && [ "$tier" != "sensitive" ]; then
            while IFS= read -r ex; do
              [ -z "$ex" ] && continue
              if grep -qE '^(DATABASE_URL|DIRECT_URL|SUPABASE_SERVICE_ROLE_KEY|SERVICE_ROLE_KEY|SECRET_KEY)=' "$ex" 2>/dev/null; then
                echo "::warning file=$ex::Repo tingkat '$tier' (bukan sensitive) mendeklarasi kunci DB di $ex. Repo fitur seharusnya TIDAK punya kunci DB -- ambil data lewat API backend."
              fi
            done <<< "$(git ls-files | grep -E '\.env\.(examples?|samples?|templates?|dist)$' || true)"
          fi

          if [ "$fail" -ne 0 ]; then
            echo ""
            echo "GAGAL: ada file rahasia (.env asli) ter-commit. Langkah aman ada di docs/SECURITY_INCIDENT_PLAYBOOK.md."
            exit 1
          fi
          echo "OK secret-guard: tidak ada file .env asli ter-commit."
