xref: /unit/test/test_static_symlink.py (revision 2616:ab2896c980ab)
1import os
2from pathlib import Path
3
4import pytest
5
6from unit.applications.proto import ApplicationProto
7
8prerequisites = {'features': {'chroot': True}}
9
10client = ApplicationProto()
11
12
13@pytest.fixture(autouse=True)
14def setup_method_fixture(temp_dir):
15    os.makedirs(f'{temp_dir}/assets/dir/dir')
16    Path(f'{temp_dir}/assets/index.html').write_text(
17        '0123456789', encoding='utf-8'
18    )
19    Path(f'{temp_dir}/assets/dir/file').write_text('blah', encoding='utf-8')
20
21    assert 'success' in client.conf(
22        {
23            "listeners": {"*:8080": {"pass": "routes"}},
24            "routes": [{"action": {"share": f'{temp_dir}/assets$uri'}}],
25        }
26    )
27
28
29def test_static_symlink(temp_dir, skip_alert):
30    skip_alert(r'opening.*failed')
31
32    os.symlink(f'{temp_dir}/assets/dir', f'{temp_dir}/assets/link')
33
34    assert client.get(url='/dir')['status'] == 301, 'dir'
35    assert client.get(url='/dir/file')['status'] == 200, 'file'
36    assert client.get(url='/link')['status'] == 301, 'symlink dir'
37    assert client.get(url='/link/file')['status'] == 200, 'symlink file'
38
39    assert 'success' in client.conf(
40        {"share": f'{temp_dir}/assets$uri', "follow_symlinks": False},
41        'routes/0/action',
42    ), 'configure symlink disable'
43
44    assert client.get(url='/link/file')['status'] == 403, 'symlink disabled'
45
46    assert 'success' in client.conf(
47        {"share": f'{temp_dir}/assets$uri', "follow_symlinks": True},
48        'routes/0/action',
49    ), 'configure symlink enable'
50
51    assert client.get(url='/link/file')['status'] == 200, 'symlink enabled'
52
53
54def test_static_symlink_two_blocks(temp_dir, skip_alert):
55    skip_alert(r'opening.*failed')
56
57    os.symlink(f'{temp_dir}/assets/dir', f'{temp_dir}/assets/link')
58
59    assert 'success' in client.conf(
60        [
61            {
62                "match": {"method": "HEAD"},
63                "action": {
64                    "share": f'{temp_dir}/assets$uri',
65                    "follow_symlinks": False,
66                },
67            },
68            {
69                "match": {"method": "GET"},
70                "action": {
71                    "share": f'{temp_dir}/assets$uri',
72                    "follow_symlinks": True,
73                },
74            },
75        ],
76        'routes',
77    ), 'configure two options'
78
79    assert client.get(url='/link/file')['status'] == 200, 'block enabled'
80    assert client.head(url='/link/file')['status'] == 403, 'block disabled'
81
82
83def test_static_symlink_chroot(temp_dir, skip_alert):
84    skip_alert(r'opening.*failed')
85
86    os.symlink(f'{temp_dir}/assets/dir/file', f'{temp_dir}/assets/dir/dir/link')
87
88    assert client.get(url='/dir/dir/link')['status'] == 200, 'default chroot'
89
90    assert 'success' in client.conf(
91        {
92            "share": f'{temp_dir}/assets$uri',
93            "chroot": f'{temp_dir}/assets/dir/dir',
94        },
95        'routes/0/action',
96    ), 'configure chroot'
97
98    assert client.get(url='/dir/dir/link')['status'] == 404, 'chroot'
99