Files
talkscore-asr/tests/test_proxy.py
T
Vladimir BryzgalovandClaude Opus 5 c992b7907d HTTPS через Caddy с автоматическими сертификатами
Токен и расшифровки разговоров ходили по сети открытым текстом. Теперь в
пакете лежит Caddy: он держит сертификаты Let's Encrypt и продлевает их сам,
а сервис уходит на localhost.

Отдельно решён вопрос подмены адреса: за прокси все запросы приходят с
localhost, и список разрешённых адресов пускал бы кого угодно. Заголовку
с настоящим адресом сервис верит только от доверенного прокси - на это
восемь тестов.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 01:41:34 +05:00

45 lines
2.2 KiB
Python

"""Тесты определения адреса клиента за обратным прокси.
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"