#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0

# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"

# Vérifier si le script est exécuté en root
check_root

# Mise à jour du système
update_system

# Installation d'Apache et des outils nécessaires
echo "=== Installation d'Apache et des outils nécessaires ==="
apt install -y apache2 curl dnsutils certbot python3-certbot-apache

# Activer et démarrer Apache uniquement si ce n'est pas déjà fait
echo "=== Activation et démarrage d'Apache ==="
systemctl is-enabled apache2 || systemctl enable apache2
systemctl is-active --quiet apache2 || systemctl start apache2

# Activer les modules nécessaires uniquement s'ils ne le sont pas déjà
MODULES=(rewrite ssl headers http2 socache_shmcb proxy proxy_http setenvif)
for MODULE in "${MODULES[@]}"; do
    if ! a2query -m "$MODULE" >/dev/null 2>&1; then
        a2enmod "$MODULE"
    fi
done
systemctl reload apache2

# Récupérer le FQDN
FQDN=$(get_fqdn_and_domain | awk '{print $1}')
echo "🔍 Serveur détecté : $FQDN"

# Vérification DNS
check_dns "$FQDN"

# Configurer le VirtualHost uniquement si ce n'est pas déjà fait
echo "=== Configuration du Virtual Host pour $FQDN ==="
if ! grep -q "ServerName $FQDN" /etc/apache2/sites-available/*.conf; then
    ./add_domain.sh "$FQDN"
    EXIT_CODE=$?
    if [[ $EXIT_CODE -ne 0 ]]; then
        echo "❌ Échec de la configuration du serveur ($FQDN). Code erreur : $EXIT_CODE"
        exit $EXIT_CODE
    fi
fi

# Configuration SSL uniquement si nécessaire
setup_ssl "$FQDN"

# Sécurisation des accès
echo "=== Sécurisation des accès ==="
SECURITY_CONF="/etc/apache2/conf-available/security.conf"
# Vérifier si le fichier existe et contient déjà la configuration
if [ ! -f "$SECURITY_CONF" ]; then
    echo "Création de $SECURITY_CONF avec les paramètres de sécurité."
    cat <<EOF > "$SECURITY_CONF"
<Directory />
    AllowOverride None
    Require all denied
</Directory>

<FilesMatch "\.(htaccess|htpasswd|env|ini|log|sh|bak)$">
    Require all denied
</FilesMatch>
EOF
    a2enconf security
    systemctl reload apache2
    echo "Configuration de sécurité appliquée et rechargement d'Apache."
else
    echo "Le fichier $SECURITY_CONF existe déjà. Aucune modification nécessaire."
fi

# Vérifier si le fichier de configuration existe
if [ -f "$SECURITY_CONF" ]; then
    # Vérifier si les directives sont déjà présentes pour éviter les doublons
    if ! grep -q "Header always unset X-Powered-By" "$SECURITY_CONF"; then
        echo "Ajout des directives de sécurité HTTP à $SECURITY_CONF."
        cat <<EOF >> "$SECURITY_CONF"

# Renforcement des en-têtes HTTP
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header always unset X-Powered-By
EOF
        echo "Configuration mise à jour et rechargement d'Apache."
    else
        echo "Les directives de sécurité HTTP sont déjà présentes. Aucune modification nécessaire."
    fi
else
    echo "Erreur : le fichier $SECURITY_CONF n'existe pas. Assurez-vous que la configuration de sécurité est en place."
fi

# Activer HTTP Strict Transport Security (HSTS) uniquement si nécessaire
SSL_CONF="/etc/apache2/sites-available/default-ssl.conf"
if ! grep -q "Strict-Transport-Security" "$SSL_CONF"; then
    echo "Header always set Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\"" >> "$SSL_CONF"
fi


# Activation de l'OCSP Stapling uniquement si nécessaire
echo "=== Activation de l'OCSP Stapling ==="
# Vérifier si le fichier de configuration SSL existe
if [ -f "$SSL_CONF" ]; then
    # Vérifier si l'option est déjà activée pour éviter les doublons
    if ! grep -q "^SSLUseStapling on" "$SSL_CONF"; then
        echo "Ajout des directives OCSP Stapling à $SSL_CONF."
        cat <<EOF >> "$SSL_CONF"

# Configuration OCSP Stapling
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)
EOF
        systemctl reload apache2
        echo "Configuration OCSP Stapling mise à jour et rechargement d'Apache."
    else
        echo "OCSP Stapling est déjà activé. Aucune modification nécessaire."
    fi
else
    echo "Erreur : le fichier $SSL_CONF n'existe pas. Assurez-vous que le module SSL est bien installé."
fi

# Désactivation des chiffres faibles et renforcement TLS
echo "=== Renforcement de la configuration SSL/TLS ==="

SSL_MOD_CONF="/etc/apache2/mods-available/ssl.conf"

# Vérifier si le fichier de configuration SSL existe
if [ -f "$SSL_MOD_CONF" ]; then
    # Vérifier si la configuration est déjà appliquée pour éviter les doublons
    if ! grep -q "^SSLProtocol -all +TLSv1.2 +TLSv1.3" "$SSL_MOD_CONF"; then
        echo "Ajout des directives SSL/TLS sécurisées à $SSL_MOD_CONF."
        cat <<EOF >> "$SSL_MOD_CONF"

# Renforcement de la configuration SSL/TLS
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
EOF
        systemctl reload apache2
        echo "Configuration SSL/TLS mise à jour et rechargement d'Apache."
    else
        echo "La configuration SSL/TLS est déjà sécurisée. Aucune modification nécessaire."
    fi
else
    echo "Erreur : le fichier $SSL_MOD_CONF n'existe pas. Assurez-vous que le module SSL est bien installé."
fi


# Limitation de la taille des requêtes (éviter les doublons)
echo "=== Limitation de la taille des requêtes ==="
if ! grep -q "LimitRequestBody" "$SECURITY_CONF"; then
    echo "LimitRequestBody 10485760" >> "$SECURITY_CONF"
fi

# Vérifier la configuration avant rechargement
echo "=== Vérification de la configuration Apache ==="
apachectl configtest
if [[ $? -ne 0 ]]; then
    echo "❌ Erreur dans la configuration Apache !"
    exit 1
fi

# Appliquer des permissions sécurisées (éviter les erreurs si déjà appliquées)
echo "=== Sécurisation des permissions des fichiers de configuration ==="
chmod 640 /etc/apache2/sites-available/* 2>/dev/null
chmod 640 /etc/apache2/conf-available/* 2>/dev/null
chown root:root /etc/apache2/sites-available/* 2>/dev/null
chown root:root /etc/apache2/conf-available/* 2>/dev/null

# Rechargement final d'Apache
systemctl reload apache2

echo "✅ Installation et sécurisation d'Apache terminées !"