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