# SPDX-FileCopyrightText: 2026 FTW.group Sàrl
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# Second Brain 3.0 : en-têtes de sécurité, cache et types de fichiers (Apache, hébergement mutualisé Infomaniak).
# À déposer dans le dossier app/ du site, avec les autres fichiers de publication/web/.
#
# Pourquoi ce fichier est indispensable : la racine du site (la présentation de Second Brain) impose une
# politique qui n'autorise aucun script. Second Brain est un fichier unique dont tout le CSS et tout le
# JavaScript sont intégrés : sans ce fichier, le navigateur les bloque et la page s'affiche nue. Ces
# directives remplacent celles de la racine pour ce dossier seulement.
Options -Indexes
AddDefaultCharset utf-8
DirectoryIndex index.html

# Aucune directive de réécriture dans ce fichier : la règle « https obligatoire » de la racine du site s'applique donc
# aussi à ce dossier. En ajouter une l'y désactiverait, sauf avec « RewriteOptions Inherit ».

# Types : manifeste de l'application installable, signatures, paquets de l'application de bureau
AddType application/manifest+json .webmanifest
AddType application/json .sig
AddType application/vnd.debian.binary-package .deb
AddType application/octet-stream .AppImage

<IfModule mod_headers.c>
  # S'ajoute à la politique écrite dans la page (balise meta) : le navigateur exige les deux. La page
  # n'autorise que ses propres scripts en ligne, par leurs empreintes (outils/csp.js) ; cet en-tête reste
  # général (code intégré) pour ne dépendre d'aucune version précise de la page, et ajoute frame-ancestors,
  # qui n'existe qu'en en-tête. blob: et 'wasm-unsafe-eval' servent au moteur PDF intégré (chargé depuis la
  # page elle-même) ; connect-src https: permet de télécharger un PDF collé par lien ; http://localhost et
  # 127.0.0.1 ne servent qu'aux essais (l'application refuse un serveur local en clair ailleurs) ;
  # worker-src 'self' et manifest-src 'self' : service worker (sw.js) et manifeste de la version installable ;
  # style-src 'self' : la page « introuvable » du site, servie aussi dans ce dossier, garde son style.
  Header always set Content-Security-Policy "default-src 'none'; script-src 'unsafe-inline' blob: 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; media-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' data: blob: https: http://localhost:* http://127.0.0.1:*; frame-src blob: https://www.youtube-nocookie.com https://www.youtube.com; worker-src 'self' blob:; manifest-src 'self'; base-uri 'none'; form-action 'none'; object-src 'none'; frame-ancestors 'none'"
  Header always set X-Content-Type-Options "nosniff"
  # Le lecteur YouTube reçoit l'origine du site grâce à son propre attribut referrerpolicy.
  Header always set Referrer-Policy "no-referrer"
  # Micro, caméra et capture d'écran : autorisés pour la page elle-même (mémos audio et vidéo).
  Header always set Permissions-Policy "camera=(self), microphone=(self), display-capture=(self), geolocation=(), payment=(), usb=(), browsing-topics=()"
  Header always set X-Frame-Options "DENY"
  # HTTPS : à garder seulement si le certificat est actif (Manager Infomaniak)
  Header always set Strict-Transport-Security "max-age=31536000"

  # Page, service worker, manifeste et annonce des versions : toujours revalidés (une mise à jour se voit tout de suite)
  <FilesMatch "\.(html|js|webmanifest|json|sig)$">
    Header set Cache-Control "no-cache"
  </FilesMatch>
  # Icônes : une journée
  <FilesMatch "\.png$">
    Header set Cache-Control "max-age=86400"
  </FilesMatch>
</IfModule>
