"""
Adresse source réelle d'une requête, derrière un reverse proxy ou sans.

**Partagé entre le serveur de signalisation et le service de licence**, et c'est
délibéré : les deux exposent des points d'entrée limités par adresse, et cette
fonction porte une faille corrigée le 2026-07-30 (point 42) qu'il serait très
coûteux de rouvrir d'un seul côté. Un module commun plutôt qu'une copie surveillée
par un test — ici le partage est possible, donc la duplication ne se justifie pas.
"""

from __future__ import annotations

ADRESSES_DE_CONFIANCE = frozenset({"127.0.0.1", "::1", "localhost"})


def cle_source(request) -> str:
    """
    Adresse source utilisee comme cle de limitation.

    X-Forwarded-For n'est CONSULTE que si la requete arrive de la boucle locale, et seule
    sa DERNIERE valeur est retenue. Les deux moities de cette regle corrigent une faille
    mesuree le 2026-07-30, au moment d'exposer le serveur derriere Caddy :

    - un reverse proxy AJOUTE l'adresse du pair reel a la fin de l'en-tete envoye par le
      client, il ne le remplace pas. La premiere valeur est donc celle que le client a
      choisie, la derniere celle que le proxy garantit. Lire la premiere laissait
      l'attaquant fixer sa propre cle de limitation : en la changeant a chaque essai, le
      compteur d'echecs n'atteignait jamais le seuil et la protection anti-force-brute ne
      servait plus a rien ;
    - sans proxy devant, l'en-tete est entierement forge par le client, quelle que soit la
      valeur qu'on y lit. Il ne faut donc pas le consulter du tout — request.client.host
      est alors la seule source honnete.

    Reverse proxy sur une AUTRE machine : ses requetes ne viennent pas de la boucle locale,
    l'en-tete est ignore et tous les clients partagent la cle du proxy. C'est grossier mais
    sur (un attaquant ne peut pas se faire passer pour quelqu'un d'autre) ; le deploiement
    documente reste le proxy local.
    """
    hote = request.client.host if request.client else "inconnu"
    if hote in ADRESSES_DE_CONFIANCE:
        transmis = request.headers.get("x-forwarded-for")
        if transmis:
            return transmis.split(",")[-1].strip()
    return hote
