"""Тесты определения адреса клиента за обратным прокси. Caddy держит HTTPS и проксирует запросы на localhost. Без учёта X-Forwarded-For список разрешённых адресов увидит вместо клиента localhost и пустит кого угодно. Но доверять заголовку можно только от самого прокси - иначе его подделает любой желающий. """ import pytest from app.security import client_address, parse_allowlist class TestClientAddress: def test_direct_connection_uses_peer(self): assert client_address("203.0.113.5", None, parse_allowlist("")) == "203.0.113.5" def test_forwarded_header_used_from_trusted_proxy(self): trusted = parse_allowlist("127.0.0.1") assert client_address("127.0.0.1", "203.0.113.5", trusted) == "203.0.113.5" def test_forwarded_header_ignored_from_untrusted_peer(self): """Подделка заголовка не должна давать доступ.""" trusted = parse_allowlist("127.0.0.1") assert client_address("198.51.100.9", "10.0.0.1", trusted) == "198.51.100.9" def test_takes_first_address_from_chain(self): trusted = parse_allowlist("127.0.0.1") assert client_address("127.0.0.1", "203.0.113.5, 70.41.3.18", trusted) == "203.0.113.5" def test_empty_header_falls_back_to_peer(self): trusted = parse_allowlist("127.0.0.1") assert client_address("127.0.0.1", "", trusted) == "127.0.0.1" def test_no_trusted_proxies_ignores_header(self): """Пока прокси не настроен, заголовку верить нельзя вообще.""" assert client_address("127.0.0.1", "203.0.113.5", parse_allowlist("")) == "127.0.0.1" def test_malformed_header_falls_back_to_peer(self): trusted = parse_allowlist("127.0.0.1") assert client_address("127.0.0.1", "не-адрес", trusted) == "127.0.0.1" def test_ipv6_proxy_supported(self): trusted = parse_allowlist("::1") assert client_address("::1", "203.0.113.5", trusted) == "203.0.113.5"