"""Normalization and SSRF unit tests.""" from __future__ import annotations import pytest from app.services.normalize import ( NormalizationError, normalize_tracker_url, parse_tracker_list_text, ) from app.services.ssrf import assert_safe_destination, is_blocked_hostname, is_public_ip def test_parse_blank_lines_and_duplicates(): body = "udp://a.example:80/announce\n\n\nudp://a.example:80/announce\nhttp://b.example:80/announce\n" items = parse_tracker_list_text(body) assert items == [ "udp://a.example:80/announce", "http://b.example:80/announce", ] def test_normalize_basic_and_idna(): n = normalize_tracker_url("HTTPS://EXEMPLO.COM:443/announce") assert n.scheme == "https" assert n.hostname == "exemplo.com" assert n.port == 443 assert n.canonical_url == "https://exemplo.com:443/announce" n2 = normalize_tracker_url("http://bücher.example/announce") assert "xn--" in n2.hostname assert n2.scheme == "http" def test_reject_credentials_and_bad_port(): with pytest.raises(NormalizationError): normalize_tracker_url("http://user:pass@host.example:80/announce") with pytest.raises(NormalizationError): normalize_tracker_url("udp://host.example:99999/announce") def test_unsupported_ws(): n = normalize_tracker_url("wss://tracker.example/announce") assert n.unsupported is True def test_ssrf_blocks_private_and_metadata(): assert is_public_ip("8.8.8.8") assert not is_public_ip("127.0.0.1") assert not is_public_ip("10.0.0.1") assert not is_public_ip("192.168.1.1") assert not is_public_ip("169.254.169.254") assert not is_public_ip("::1") assert not is_public_ip("fc00::1") assert is_blocked_hostname("localhost") assert is_blocked_hostname("metadata.google.internal") with pytest.raises(ValueError): assert_safe_destination("evil.example", ["127.0.0.1"]) with pytest.raises(ValueError): assert_safe_destination("localhost", ["8.8.8.8"])