| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- """client_ip 回环地址替换测试(同机 localhost 访问记本机网卡 IPv4)。"""
- from __future__ import annotations
- import ipaddress
- import pytest
- from dms.services import audit_service
- from dms.services.audit_service import _is_loopback, client_ip
- LAN_IP = "192.168.1.5"
- @pytest.fixture(autouse=True)
- def stub_primary_address(monkeypatch):
- """默认钉住本机网卡解析结果,仅真实解析用例放行。"""
- monkeypatch.setattr(audit_service, "_primary_local_address", lambda: LAN_IP)
- monkeypatch.setattr(audit_service, "_primary_address_cache", None)
- def request_client_ip(flask_app, remote_addr=None, headers=None):
- with flask_app.test_request_context(
- "/", environ_base={"REMOTE_ADDR": remote_addr} if remote_addr else {},
- headers=headers or {},
- ):
- return client_ip()
- def test_loopback_ipv6_replaced_with_lan_ip(flask_app):
- assert request_client_ip(flask_app, "::1") == LAN_IP
- assert request_client_ip(flask_app, "0:0:0:0:0:0:0:1") == LAN_IP
- def test_loopback_ipv4_replaced_with_lan_ip(flask_app):
- assert request_client_ip(flask_app, "127.0.0.1") == LAN_IP
- def test_xff_takes_precedence_and_passes_through(flask_app):
- assert request_client_ip(
- flask_app, "::1", headers={"X-Forwarded-For": "192.0.2.10, 10.0.0.1"}
- ) == "192.0.2.10"
- def test_non_loopback_remote_addr_passes_through(flask_app):
- assert request_client_ip(flask_app, "192.168.1.20") == "192.168.1.20"
- def test_is_loopback_variants():
- assert _is_loopback("::1")
- assert _is_loopback("0:0:0:0:0:0:0:1")
- assert _is_loopback("127.0.0.1")
- assert _is_loopback("127.0.1.9")
- assert _is_loopback("::ffff:127.0.0.1")
- assert _is_loopback("fe80::1%eth0") is False
- assert not _is_loopback("192.168.1.5")
- assert not _is_loopback("not-an-ip")
- def test_primary_local_address_real_resolution(flask_app, monkeypatch):
- """真实选路:返回有效 IPv4 且非 ::1 形态(无网卡环境回退 127.0.0.1)。"""
- monkeypatch.undo()
- monkeypatch.setattr(audit_service, "_primary_address_cache", None)
- resolved = audit_service._primary_local_address()
- assert ipaddress.ip_address(resolved).version == 4
|