# ============================================================================
#  ATTENTION : ce fichier doit être renommé « .htaccess » (sans extension,
#  avec le point initial) une fois déposé à la racine de l'hébergement.
#  Sous cette forme .txt il n'est pas interprété par Apache.
# ============================================================================
#  VIATERRA — configuration Apache (OVH mutualisé)
#  Durcissement conforme aux recommandations ANSSI relatives à la sécurisation
#  des sites web. Les empreintes CSP sont synchronisées avec le HTML : toute
#  modification d'une balise <style> ou <script> impose de régénérer ce fichier.
# ============================================================================

# ---------------------------------------------------------------------------
# 1. Redirection HTTPS systématique
# ---------------------------------------------------------------------------
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

# ---------------------------------------------------------------------------
# 2. En-têtes de sécurité
# ---------------------------------------------------------------------------
<IfModule mod_headers.c>
  # Politique de sécurité de contenu (identique au <meta>, + frame-ancestors)
  Header always set Content-Security-Policy "default-src 'none'; frame-ancestors 'none'; script-src 'sha256-0N9XrLEVs+WGetR0UseDN4GIu6yQnsjbmeVhm5t9Nd8='; script-src-attr 'none'; style-src 'sha256-nWdZKM0CdTkSB3CQPYpxEA5pmv2QSEl4t2zOFo+nlz0='; style-src-attr 'none'; font-src 'self'; img-src 'self' data:; connect-src 'none'; object-src 'none'; media-src 'none'; base-uri 'none'; form-action 'none'; frame-src 'none'; child-src 'none'; worker-src 'none'; manifest-src 'none'; require-trusted-types-for 'script'; trusted-types viaterra; upgrade-insecure-requests; report-uri /csp-report.php; report-to csp-endpoint;"

  # Point de collecte des violations CSP (nécessite csp-report.php)
  Header always set Reporting-Endpoints "csp-endpoint=\"/csp-report.php\""

  # Transport : HSTS 2 ans, sous-domaines inclus, éligible preload
  Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" env=HTTPS

  # Anti-cadrage (défense en profondeur avec frame-ancestors 'none')
  Header always set X-Frame-Options "DENY"

  # Interdiction du reniflage de type MIME
  Header always set X-Content-Type-Options "nosniff"

  # Aucun référent transmis aux sites tiers
  Header always set Referrer-Policy "no-referrer"

  # Fonctionnalités navigateur : tout est refusé sauf la géolocalisation,
  # indispensable au tri par distance et déclenchée uniquement sur action.
  Header always set Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), browsing-topics=(), camera=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(self), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), usb=(), xr-spatial-tracking=()"

  # Isolation d'origine
  Header always set Cross-Origin-Opener-Policy "same-origin"
  Header always set Cross-Origin-Resource-Policy "same-origin"
  Header always set Cross-Origin-Embedder-Policy "require-corp"

  # Divers
  Header always set X-Permitted-Cross-Domain-Policies "none"
  Header always set X-DNS-Prefetch-Control "off"
  Header always set Origin-Agent-Cluster "?1"

  # Suppression des en-têtes révélant la pile technique
  Header always unset X-Powered-By
  Header always unset Server
  Header always unset X-AspNet-Version

  # Le HTML ne doit pas être mis en cache par les intermédiaires : les
  # empreintes CSP et le contenu évoluent ensemble.
  <FilesMatch "\.(html)$">
    Header always set Cache-Control "no-cache, must-revalidate"
  </FilesMatch>
  <FilesMatch "\.(woff2|svg|png|ico)$">
    Header always set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>

# ---------------------------------------------------------------------------
# 3. Types MIME et encodage
# ---------------------------------------------------------------------------
<IfModule mod_mime.c>
  AddDefaultCharset UTF-8
  AddType text/html; charset=UTF-8 .html
  AddType font/woff2 .woff2
  AddType image/svg+xml .svg
  </IfModule>

# ---------------------------------------------------------------------------
# 4. Réduction de la surface exposée
# ---------------------------------------------------------------------------
# Pas d'index de répertoire, pas de suivi de liens symboliques
Options -Indexes -MultiViews -ExecCGI +FollowSymLinks
ServerSignature Off

# Page d'accueil
DirectoryIndex viaterra-2.html index.html

# Blocage des fichiers cachés et sensibles (.htaccess, .git, sauvegardes…)
<FilesMatch "^\.|(\.(bak|old|orig|save|swp|swo|log|ini|conf|sql|sh|py|json~|md)|~)$">
  Require all denied
</FilesMatch>
<IfModule mod_rewrite.c>
  RewriteRule "(^|/)\." - [F]
</IfModule>

# Méthodes HTTP : lecture seule
<IfModule mod_rewrite.c>
  RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|OPTIONS)$
  RewriteRule .* - [F]
</IfModule>

# ---------------------------------------------------------------------------
# 5. Compression
# ---------------------------------------------------------------------------
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/css text/plain text/calendar application/json image/svg+xml
</IfModule>

# ---------------------------------------------------------------------------
# 6. Pages d'erreur sobres (aucune divulgation d'information)
# ---------------------------------------------------------------------------
ErrorDocument 403 "Acces refuse."
ErrorDocument 404 "Page introuvable."
