# SPDX-License-Identifier: LicenseRef-CMSD-1.0
# Copyright (c) 2026 CyberMind — Gérald Kerma <devel@cybermind.fr>
# Source-Disclosed License — All rights reserved except as expressly granted.
# See LICENCE-CMSD-1.0.md for terms.
#
# Profils AppArmor ENFORCE de secubox-webfilter (#1962) : l'API (socket Unix), le démon d'alimentation (journal d'Unbound) et la synchronisation
# (téléchargement https). Tout ce qui n'est pas listé est refusé. Posés dans /etc/apparmor.d/secubox-webfilter, chargés par le postinst.

#include <tunables/global>

/usr/sbin/secubox-webfilter-api {
  #include <abstractions/base>
  #include <abstractions/python>

  /usr/sbin/secubox-webfilter-api r,
  /usr/bin/python3* rix,
  /usr/lib/secubox/webfilter/** r,
  /usr/lib/secubox/ r,
  /usr/lib/python3/dist-packages/** r,
  /usr/lib/python3.*/** r,
  /usr/local/lib/python3*/** r,

  # Configuration et authentification : fichiers nommés, jamais /etc/secubox/** (le dossier des secrets reste interdit).
  /etc/secubox/ r,
  /etc/secubox/secubox.conf r,
  /etc/secubox/webfilter.toml r,
  /etc/secubox/users.json r,
  /etc/secubox/appareils.json r,
  /etc/secubox/auth.toml r,
  deny /etc/secubox/secrets/** r,
  /etc/nsswitch.conf r,
  # Registre des sessions : sans lui, toute garde d'API voit un registre vide et refuse (401 partout, #942) ; trace de délégation.
  /var/lib/secubox/auth/ r,
  /var/lib/secubox/auth/sessions.json r,
  /var/log/secubox/delegation.log w,

  /var/lib/secubox/webfilter/ r,
  /var/lib/secubox/webfilter/** rwk,

  /run/secubox/ r,
  /run/secubox/webfilter.sock rwk,
  /run/secubox/webfilter.sock.lock rwk,

  network unix stream,
  network unix dgram,
  /proc/sys/net/core/somaxconn r,
}

/usr/sbin/secubox-webfilter-feed {
  #include <abstractions/base>
  #include <abstractions/python>

  /usr/sbin/secubox-webfilter-feed r,
  /usr/bin/python3* rix,
  /usr/lib/secubox/webfilter/** r,
  /usr/lib/python3/dist-packages/** r,
  /usr/lib/python3.*/** r,

  /etc/secubox/webfilter.toml r,

  /var/lib/secubox/webfilter/ r,
  /var/lib/secubox/webfilter/** rwk,

  # Journal d'Unbound (lecture seule) et adresses de la box
  /usr/bin/journalctl rix,
  /usr/sbin/ip rix,
  /usr/bin/ip rix,
  /var/log/journal/ r,
  /var/log/journal/** r,
  /run/log/journal/ r,
  /run/log/journal/** r,
  /etc/machine-id r,
  /proc/sys/kernel/random/boot_id r,
  /proc/*/stat r,
  /proc/*/cgroup r,
  /sys/fs/cgroup/** r,
  /run/systemd/journal/ r,
  /run/systemd/journal/** r,

  network netlink raw,
  network unix stream,
}

/usr/sbin/secubox-webfilter-sync {
  #include <abstractions/base>
  #include <abstractions/python>
  #include <abstractions/nameservice>
  #include <abstractions/openssl>
  #include <abstractions/ssl_certs>

  /usr/sbin/secubox-webfilter-sync r,
  /usr/bin/python3* rix,
  /usr/lib/secubox/webfilter/** r,
  /usr/lib/python3/dist-packages/** r,
  /usr/lib/python3.*/** r,

  /etc/secubox/webfilter.toml r,

  /var/lib/secubox/webfilter/ r,
  /var/lib/secubox/webfilter/** rwk,
  /var/log/secubox/audit.log w,

  network inet stream,
  network inet6 stream,
  network unix stream,
}

/usr/sbin/secubox-webfilter-ctl {
  #include <abstractions/base>
  #include <abstractions/python>

  /usr/sbin/secubox-webfilter-ctl r,
  /usr/bin/python3* rix,
  /usr/lib/secubox/webfilter/** r,
  /usr/lib/python3/dist-packages/** r,
  /usr/lib/python3.*/** r,

  # Lecture : configuration, état du service (config.json, listes, connus), drop-in d'ad-guard (adresses déjà liées à une vue)
  /etc/secubox/webfilter.toml r,
  /var/lib/secubox/webfilter/ r,
  /var/lib/secubox/webfilter/config.json r,
  /var/lib/secubox/webfilter/listes/ r,
  /var/lib/secubox/webfilter/listes/** r,
  /etc/unbound/unbound.conf.d/ r,
  /etc/unbound/unbound.conf.d/94-secubox-adguard-tv.conf r,

  # Écriture : le SEUL drop-in d'Unbound de webfilter, ses résultats, son état racine et l'audit
  /etc/unbound/unbound.conf.d/93-secubox-webfilter.conf rw,
  /etc/unbound/unbound.conf.d/.wf-* rw,
  /var/lib/secubox/webfilter/resultat.json rw,
  /var/lib/secubox/webfilter/carte.json rw,
  /var/lib/secubox/webfilter/.wf-* rw,
  /var/lib/secubox-webfilter-ctl/ r,
  /var/lib/secubox-webfilter-ctl/** rwk,
  /var/log/secubox/audit.log w,

  # Unbound : contrôle de la configuration puis rechargement (jamais de redémarrage), table de voisinage
  /usr/sbin/unbound-checkconf rix,
  /usr/sbin/unbound-control rix,
  /usr/sbin/ip rix,
  /usr/bin/ip rix,
  /etc/unbound/** r,
  /var/lib/unbound/** r,

  capability chown,
  capability dac_override,
  capability fowner,
  network inet stream,
  network inet6 stream,
  network netlink raw,
  network unix stream,
}
