#!/bin/bash
# Coupe le module de blog vulnérable (ph_simpleblog, injection SQL exploitée le 5 octobre 2026)
# sur toutes les boutiques PrestaShop de l'hébergement, comme sur alchimistes.fr.
# Écrit à la demande du gérant le 6 octobre 2026. À lancer par le gérant, sur le serveur OVH.
#
#   bash ~/couper-blog-boutiques.sh test     → ne modifie RIEN, montre ce qui serait fait
#   bash ~/couper-blog-boutiques.sh go       → applique
#   bash ~/couper-blog-boutiques.sh annuler <dossier de la boutique>   → remet cette boutique comme avant
#
# Pour chaque boutique qui a encore le dossier modules/ph_simpleblog :
#   1. lit les accès à SA base dans app/config/parameters.php (jamais affichés ; fichier temporaire privé effacé ensuite)
#   2. sauvegarde l'état des 3 modules du blog dans sa base, puis les désactive
#   3. corrige les raccourcis piégés du back-office (même piège qu'alchimistes.fr), s'il y en a
#   4. met les dossiers du blog et le cache de côté dans ~/hors-web-2026-10-06/<boutique>/ (rien n'est supprimé)
#   Le serveur ne peut pas appeler les sites en https (constaté le 6 octobre) : les accueils sont vérifiés
#   depuis l'extérieur après le passage ; en cas de problème, le mode « annuler » remet une boutique comme avant.
set -u
MODE="${1:-}"
CIBLE="${2:-}"
[ "$MODE" = "test" ] || [ "$MODE" = "go" ] || { [ "$MODE" = "annuler" ] && [ -n "$CIBLE" ]; } || { echo "Usage : bash $0 test | go | annuler <dossier>"; exit 1; }
MODULES="ph_simpleblog ph_blog_column_custom ph_relatedposts"
LISTE_SQL="'ph_simpleblog','ph_blog_column_custom','ph_relatedposts'"
CAVE="$HOME/hors-web-2026-10-06"
CR="$HOME/compte-rendu-couper-blog-$(date +%Y%m%d-%H%M%S).txt"
command -v mysql >/dev/null || { echo "Le client mysql n'est pas disponible sur ce serveur."; exit 1; }
command -v php >/dev/null || { echo "php n'est pas disponible sur ce serveur."; exit 1; }
umask 077


traite() {
  local d="$1" P="$1/app/config/parameters.php" DEF base prefixe n_xss m
  [ -f "$P" ] || { echo "$d : pas de app/config/parameters.php, ignoré"; return; }
  DEF=$(mktemp "$HOME/.acces-base-XXXXXX")
  # Les accès sont lus par PHP et écrits directement dans un fichier privé : rien ne s'affiche
  php -r '$p = require $argv[1]; $p = $p["parameters"];
    $h = $p["database_host"]; $port = $p["database_port"];
    if (strpos($h, ":") !== false) { list($h, $port) = explode(":", $h, 2); }
    $f = fopen($argv[2], "w");
    fwrite($f, "[client]\nhost=".$h."\n".($port ? "port=".$port."\n" : "")."user=".$p["database_user"]."\npassword=\"".addcslashes($p["database_password"], "\"\\")."\"\n");
    fclose($f); echo $p["database_name"]."|".$p["database_prefix"];' "$P" "$DEF" > "$DEF.nom" 2>/dev/null
  base=$(cut -d'|' -f1 "$DEF.nom"); prefixe=$(cut -d'|' -f2 "$DEF.nom"); rm -f "$DEF.nom"
  if [ -z "$base" ]; then echo "$d : accès à la base illisibles, ignoré"; rm -f "$DEF"; return; fi
  SQL() { mysql --defaults-extra-file="$DEF" -N -B "$base" -e "$1" 2>&1; }
  if ! SQL "SELECT 1" >/dev/null; then echo "$d : connexion à la base impossible, ignoré"; rm -f "$DEF"; return; fi
  n_xss=$(SQL "SELECT COUNT(*) FROM \`${prefixe}quick_access_lang\` WHERE name LIKE '%<script%'")
  if [ "$MODE" = "test" ]; then
    echo "$d : base $base, préfixe $prefixe, raccourcis piégés : $n_xss, dossiers du blog : $(for m in $MODULES; do [ -d "$d/modules/$m" ] && printf '%s ' "$m"; done)"
    rm -f "$DEF"; return
  fi
  if [ "$MODE" = "annuler" ]; then
    for m in $MODULES; do [ -d "$CAVE/$d/$m" ] && [ ! -e "$d/modules/$m" ] && mv "$CAVE/$d/$m" "$d/modules/"; done
    SQL "UPDATE \`${prefixe}module\` m JOIN \`${prefixe}sauv_blog_module\` s ON s.id_module = m.id_module SET m.active = s.active;
         INSERT IGNORE INTO \`${prefixe}module_shop\` SELECT * FROM \`${prefixe}sauv_blog_module_shop\`;" >/dev/null
    echo "$d : remis comme avant (blog réactivé, dossiers revenus)"
    rm -f "$DEF"; return
  fi
  # 2. Sauvegarde de l'état des modules dans la base de la boutique, puis désactivation
  SQL "DROP TABLE IF EXISTS \`${prefixe}sauv_blog_module_shop\`;
       CREATE TABLE \`${prefixe}sauv_blog_module_shop\` AS SELECT ms.* FROM \`${prefixe}module_shop\` ms JOIN \`${prefixe}module\` m ON m.id_module = ms.id_module WHERE m.name IN ($LISTE_SQL);
       DROP TABLE IF EXISTS \`${prefixe}sauv_blog_module\`;
       CREATE TABLE \`${prefixe}sauv_blog_module\` AS SELECT id_module, name, active FROM \`${prefixe}module\` WHERE name IN ($LISTE_SQL);" >/dev/null
  SQL "UPDATE \`${prefixe}module\` SET active = 0 WHERE name IN ($LISTE_SQL);
       DELETE ms FROM \`${prefixe}module_shop\` ms JOIN \`${prefixe}module\` m ON m.id_module = ms.id_module WHERE m.name IN ($LISTE_SQL);
       UPDATE \`${prefixe}quick_access_lang\` SET name = SUBSTRING_INDEX(name, '</a>', 1) WHERE name LIKE '%<script%';" >/dev/null
  # 4. Dossiers du blog et cache mis de côté
  mkdir -p "$CAVE/$d"
  for m in $MODULES; do [ -d "$d/modules/$m" ] && mv "$d/modules/$m" "$CAVE/$d/"; done
  [ -d "$d/var/cache/prod" ] && mv "$d/var/cache/prod" "$CAVE/$d/cache-prod-$(date +%H%M%S)"
  echo "$d : blog coupé, raccourcis piégés corrigés : $n_xss"
  rm -f "$DEF"
}

cd "$HOME" || exit 1
{
  echo "== $(date '+%Y-%m-%d %H:%M:%S') mode $MODE"
  if [ "$MODE" = "annuler" ]; then
    traite "${CIBLE%/}"
  else
    for d in */; do
      d="${d%/}"
      [ "$d" = "alchimistes.fr" ] && continue           # déjà fait à la main le 6 octobre
      [ -d "$d/modules/ph_simpleblog" ] || continue
      traite "$d"
    done
  fi
  echo "== fin"
} 2>&1 | tee "$CR"
echo "Compte rendu : $CR"
