xref: /unit/test/test_unix_abstract.py (revision 2592:e079c44a8340)
12491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython
22182Szelenkov@nginx.comfrom unit.option import option
32182Szelenkov@nginx.com
42488Szelenkov@nginx.comprerequisites = {
52488Szelenkov@nginx.com    'modules': {'python': 'any'},
62488Szelenkov@nginx.com    'features': {'unix_abstract': True},
72488Szelenkov@nginx.com}
82488Szelenkov@nginx.com
92491Szelenkov@nginx.comclient = ApplicationPython()
102182Szelenkov@nginx.com
112182Szelenkov@nginx.com
122491Szelenkov@nginx.comdef test_unix_abstract_source():
132491Szelenkov@nginx.com    addr = '\0sock'
142491Szelenkov@nginx.com
152491Szelenkov@nginx.com    def source(source):
162491Szelenkov@nginx.com        assert 'success' in client.conf(f'"{source}"', 'routes/0/match/source')
172182Szelenkov@nginx.com
182491Szelenkov@nginx.com    assert 'success' in client.conf(
192491Szelenkov@nginx.com        {
202491Szelenkov@nginx.com            "listeners": {
21*2592Szelenkov@nginx.com                "127.0.0.1:8080": {"pass": "routes"},
222491Szelenkov@nginx.com                f"unix:@{addr[1:]}": {"pass": "routes"},
232491Szelenkov@nginx.com            },
242491Szelenkov@nginx.com            "routes": [
252491Szelenkov@nginx.com                {
262491Szelenkov@nginx.com                    "match": {"source": "!0.0.0.0/0"},
272491Szelenkov@nginx.com                    "action": {"return": 200},
282491Szelenkov@nginx.com                }
292491Szelenkov@nginx.com            ],
302491Szelenkov@nginx.com            "applications": {},
312491Szelenkov@nginx.com        }
322491Szelenkov@nginx.com    )
332182Szelenkov@nginx.com
342491Szelenkov@nginx.com    assert client.get(sock_type='unix', addr=addr)['status'] == 200, 'neg ipv4'
352182Szelenkov@nginx.com
362491Szelenkov@nginx.com    source("!::/0")
372491Szelenkov@nginx.com    assert client.get(sock_type='unix', addr=addr)['status'] == 200, 'neg ipv6'
382491Szelenkov@nginx.com
392491Szelenkov@nginx.com    source("unix")
402491Szelenkov@nginx.com    assert client.get()['status'] == 404, 'ipv4'
412491Szelenkov@nginx.com    assert client.get(sock_type='unix', addr=addr)['status'] == 200, 'unix'
422182Szelenkov@nginx.com
432182Szelenkov@nginx.com
442491Szelenkov@nginx.comdef test_unix_abstract_client_ip():
452491Szelenkov@nginx.com    def get_xff(xff, sock_type='ipv4'):
462491Szelenkov@nginx.com        address = {
47*2592Szelenkov@nginx.com            'ipv4': ('127.0.0.1', 8080),
48*2592Szelenkov@nginx.com            'ipv6': ('::1', 8081),
492491Szelenkov@nginx.com            'unix': ('\0sock', None),
502491Szelenkov@nginx.com        }
512491Szelenkov@nginx.com        (addr, port) = address[sock_type]
522182Szelenkov@nginx.com
532491Szelenkov@nginx.com        return client.get(
542491Szelenkov@nginx.com            sock_type=sock_type,
552491Szelenkov@nginx.com            addr=addr,
562491Szelenkov@nginx.com            port=port,
572491Szelenkov@nginx.com            headers={'Connection': 'close', 'X-Forwarded-For': xff},
582491Szelenkov@nginx.com        )['body']
592182Szelenkov@nginx.com
602491Szelenkov@nginx.com    client_ip_dir = f"{option.test_dir}/python/client_ip"
612491Szelenkov@nginx.com    assert 'success' in client.conf(
622491Szelenkov@nginx.com        {
632491Szelenkov@nginx.com            "listeners": {
64*2592Szelenkov@nginx.com                "127.0.0.1:8080": {
652491Szelenkov@nginx.com                    "client_ip": {
662491Szelenkov@nginx.com                        "header": "X-Forwarded-For",
672491Szelenkov@nginx.com                        "source": "unix",
682182Szelenkov@nginx.com                    },
692491Szelenkov@nginx.com                    "pass": "applications/client_ip",
702491Szelenkov@nginx.com                },
71*2592Szelenkov@nginx.com                "[::1]:8081": {
722491Szelenkov@nginx.com                    "client_ip": {
732491Szelenkov@nginx.com                        "header": "X-Forwarded-For",
742491Szelenkov@nginx.com                        "source": "unix",
752182Szelenkov@nginx.com                    },
762491Szelenkov@nginx.com                    "pass": "applications/client_ip",
772182Szelenkov@nginx.com                },
782491Szelenkov@nginx.com                "unix:@sock": {
792182Szelenkov@nginx.com                    "client_ip": {
802491Szelenkov@nginx.com                        "header": "X-Forwarded-For",
812491Szelenkov@nginx.com                        "source": "unix",
822491Szelenkov@nginx.com                    },
832491Szelenkov@nginx.com                    "pass": "applications/client_ip",
842182Szelenkov@nginx.com                },
852491Szelenkov@nginx.com            },
862491Szelenkov@nginx.com            "applications": {
872491Szelenkov@nginx.com                "client_ip": {
882491Szelenkov@nginx.com                    "type": client.get_application_type(),
892491Szelenkov@nginx.com                    "processes": {"spare": 0},
902491Szelenkov@nginx.com                    "path": client_ip_dir,
912491Szelenkov@nginx.com                    "working_directory": client_ip_dir,
922491Szelenkov@nginx.com                    "module": "wsgi",
932491Szelenkov@nginx.com                }
942491Szelenkov@nginx.com            },
952491Szelenkov@nginx.com        }
962491Szelenkov@nginx.com    )
972182Szelenkov@nginx.com
982491Szelenkov@nginx.com    assert get_xff('1.1.1.1') == '127.0.0.1', 'bad source ipv4'
992491Szelenkov@nginx.com    assert get_xff('1.1.1.1', 'ipv6') == '::1', 'bad source ipv6'
1002491Szelenkov@nginx.com
1012491Szelenkov@nginx.com    for ip in [
1022491Szelenkov@nginx.com        '1.1.1.1',
1032491Szelenkov@nginx.com        '::11.22.33.44',
1042491Szelenkov@nginx.com    ]:
1052491Szelenkov@nginx.com        assert get_xff(ip, 'unix') == ip, 'replace'
106