#!/bin/sh
# Quita los indices de directorio de cmox.es y comprueba en el acto que no ha
# roto nada. Si algo falla, restaura la copia y sale.
#
# ── Que arregla ────────────────────────────────────────────────────────
# Medido antes de esto:
#
#   https://cmox.es/wp-content/uploads/   →  «Index of /wp-content/uploads»
#   https://cmox.es/img/                  →  «Index of /img»
#
# El arbol entero navegable. Da la lista completa de nombres de fichero a quien
# pase por ahi, incluida la de las fotos que la regla antienlace protege: se
# puede tapar la puerta y dejar el listin pegado al lado. Y un indice de
# wp-content ensena que plugins hay instalados, con sus carpetas, que es la
# mitad del trabajo de quien busca una version vieja con un agujero conocido.
#
# ── Por que aqui y no en wp-content/.htaccess ──────────────────────────
# Porque los dos .htaccess de wp-content los gestiona el plugin «Converter for
# Media» y llevan escrito «DO NOT EDIT» entre marcas. Lo que se escriba ahi
# desaparece el dia que el plugin regenere el fichero, y desaparece en silencio.
#
# `Options -Indexes` en la raiz cubre todo lo que cuelga de ella de una vez.
#
# ── Por que esto NO es «inventar una regla en el .htaccess» ────────────
# La regla que tumbo /panelcmox era una REESCRITURA: le decia a Apache que
# buscara un fichero real donde habia una ruta virtual. Esto no enruta nada.
# Solo apaga la pagina de listado que Apache fabrica cuando una carpeta no
# tiene indice. Aun asi se comprueba, porque algunos alojamientos no permiten
# `Options` en .htaccess y responden 500 a todo.
set -e

H=~/www/.htaccess
COPIA=~/www/.htaccess.antes-indices-$(date +%Y%m%d-%H%M%S)

cp "$H" "$COPIA"
echo "copia: $COPIA"

if grep -q 'CMOX SIN INDICES' "$H"; then
  echo "ya estaba puesto"
else
  python3 - "$H" <<'PY'
import io, sys
ruta = sys.argv[1]
s = io.open(ruta, encoding='utf-8').read()

bloque = """
# --- CMOX SIN INDICES ---------------------------------------------------
# Sin esto, /img/ y /wp-content/uploads/ devolvian el arbol entero navegable.
# No enruta nada: solo apaga la pagina de listado que Apache fabrica cuando una
# carpeta no tiene indice.
Options -Indexes
# --- FIN CMOX SIN INDICES -----------------------------------------------
"""

marca = 'DirectoryIndex index.html index.php\n'
assert marca in s, 'no encuentro el DirectoryIndex'
s = s.replace(marca, marca + bloque, 1)
io.open(ruta, 'w', encoding='utf-8').write(s)
PY
  echo "puesto"
fi

# ── La comprobacion, en el acto ─────────────────────────────────────────
# El canario es /panelcmox: es lo que se rompe cuando se toca este fichero, y
# es lo que hay que mirar antes de irse tranquilo (ESTADO.md §5).
fallo=0
comprobar() {
  codigo=$(curl -s -o /tmp/cmox-idx.txt -m 20 -w '%{http_code}' "$1")
  if [ "$codigo" != "$2" ]; then
    echo "  MAL  $1  devuelve $codigo y se esperaba $2"
    fallo=1
  elif grep -qi 'Index of' /tmp/cmox-idx.txt; then
    echo "  MAL  $1  sigue enseñando el indice"
    fallo=1
  else
    echo "  ok   $1  $codigo"
  fi
}

sleep 2
# Para una carpeta sin indice, Apache responde 403; si la reescritura de
# WordPress la recoge antes, responde 404. Las dos valen: lo que NO puede
# quedar es el listado. Fijar un codigo concreto aqui seria una comprobacion
# que falla por el motivo equivocado.
# El `?nocache=` no es adorno. La primera vez que se ejecuto esto, la regla
# estaba puesta y correcta y las dos carpetas seguian devolviendo su listado:
# era el CDN de OVH sirviendo la respuesta que habia guardado ANTES del cambio.
# Estuvo a un paso de darse por bueno que el alojamiento ignora `Options`.
# Una comprobacion que puede leer una copia vieja no comprueba nada.
sin_indice() {
  codigo=$(curl -s -o /tmp/cmox-idx.txt -m 20 -w '%{http_code}' "$1?nocache=$(date +%s)")
  if grep -qi 'Index of' /tmp/cmox-idx.txt; then
    echo "  MAL  $1  sigue ensenando el indice ($codigo)"
    fallo=1
  elif [ "$codigo" = "403" ] || [ "$codigo" = "404" ]; then
    echo "  ok   $1  $codigo, sin listado"
  else
    echo "  MAL  $1  devuelve $codigo"
    fallo=1
  fi
}

comprobar  https://cmox.es/                       200
comprobar  https://cmox.es/panelcmox              302
comprobar  https://cmox.es/contacto/              200
sin_indice https://cmox.es/img/
sin_indice https://cmox.es/wp-content/uploads/

# Una foto de verdad tiene que seguir sirviendose: apagar el listado no puede
# apagar los ficheros.
foto=$(curl -s -o /dev/null -m 20 -H 'Referer: https://cmox.es/' \
       -w '%{http_code}' https://cmox.es/img/v2/hero-electronica-cmox.webp)
if [ "$foto" = "200" ]; then
  echo "  ok   una foto suelta sigue en 200"
else
  echo "  MAL  la foto devuelve $foto"
  fallo=1
fi

if [ "$fallo" = "1" ]; then
  echo "ALGO HA FALLADO. Restaurando $COPIA"
  cp "$COPIA" "$H"
  exit 1
fi

echo "hecho, y comprobado"
