"""Identification du client pour la limitation de debit. Le point sensible : `X-Forwarded-For` est un en-tete que n'importe quel client peut ecrire. Le croire sans condition permettrait a un client direct de changer d'identite a chaque requete et de contourner toute limite. La confiance est donc explicite et desactivee par defaut (`TRUST_PROXY_HEADERS`). Quand elle est activee, on lit la DERNIERE valeur de `X-Forwarded-For` : un reverse proxy correctement configure ajoute l'adresse qu'il a reellement vue a la fin de la liste, tandis que les valeurs precedentes peuvent avoir ete forgees par le client. Cette lecture suppose un seul proxy directement devant OpenMind, ce qui correspond au deploiement documente. """ from __future__ import annotations from starlette.requests import Request FORWARDED_FOR = "x-forwarded-for" REAL_IP = "x-real-ip" UNKNOWN_CLIENT = "unknown" def resolve_client_ip(request: Request, *, trust_proxy_headers: bool) -> str: if trust_proxy_headers: forwarded = request.headers.get(FORWARDED_FOR) if forwarded: parts = [part.strip() for part in forwarded.split(",") if part.strip()] if parts: return parts[-1] real_ip = request.headers.get(REAL_IP) if real_ip and real_ip.strip(): return real_ip.strip() client = request.client if client and client.host: return client.host return UNKNOWN_CLIENT