summaryrefslogblamecommitdiffhomepage
path: root/test/test_static_mount.py
blob: 91cf836c18f591d464be9289067d1518b26f8030 (plain) (tree)
1
2
3
4
5
6
7
8
9

                 
                        

             


                                                        
                                            









                                                    


                                                                       

            
                                    








                                                   


                                 
                                             




                                                            
                                                                                





             
                                    



                                                                     


                                 
                                             

                                                     
                                                      


                                      

                                      

                                      
                                                                              





                                                       
                                                                             



                                      

                                      
 
                                                                 








                                                                       
                                                              





                                                 
                                                              









                                                                          
                                                             



                                      
                                                      




                                               
                                                                 


                                      
                                                      





                                               
                                                                       
import os
import subprocess
from pathlib import Path

import pytest
from unit.applications.proto import TestApplicationProto


class TestStaticMount(TestApplicationProto):
    prerequisites = {'features': ['chroot']}

    @pytest.fixture(autouse=True)
    def setup_method_fixture(self, is_su, temp_dir):
        if not is_su:
            pytest.skip('requires root')

        os.makedirs(temp_dir + '/assets/dir/mount')
        os.makedirs(temp_dir + '/assets/dir/dir')
        os.makedirs(temp_dir + '/assets/mount')
        Path(temp_dir + '/assets/index.html').write_text('index')
        Path(temp_dir + '/assets/dir/dir/file').write_text('file')
        Path(temp_dir + '/assets/mount/index.html').write_text('mount')

        try:
            subprocess.check_output(
                [
                    "mount",
                    "--bind",
                    temp_dir + "/assets/mount",
                    temp_dir + "/assets/dir/mount",
                ],
                stderr=subprocess.STDOUT,
            )

        except KeyboardInterrupt:
            raise

        except subprocess.CalledProcessError:
            pytest.fail('Can\'t run mount process.')

        self._load_conf(
            {
                "listeners": {"*:7080": {"pass": "routes"}},
                "routes": [{"action": {"share": temp_dir + "/assets/dir$uri"}}],
            }
        )

        yield

        try:
            subprocess.check_output(
                ["umount", "--lazy", temp_dir + "/assets/dir/mount"],
                stderr=subprocess.STDOUT,
            )

        except KeyboardInterrupt:
            raise

        except subprocess.CalledProcessError:
            pytest.fail('Can\'t run umount process.')

    def test_static_mount(self, temp_dir, skip_alert):
        skip_alert(r'opening.*failed')

        resp = self.get(url='/mount/')
        assert resp['status'] == 200
        assert resp['body'] == 'mount'

        assert 'success' in self.conf(
            {"share": temp_dir + "/assets/dir$uri", "traverse_mounts": False},
            'routes/0/action',
        ), 'configure mount disable'

        assert self.get(url='/mount/')['status'] == 403

        assert 'success' in self.conf(
            {"share": temp_dir + "/assets/dir$uri", "traverse_mounts": True},
            'routes/0/action',
        ), 'configure mount enable'

        resp = self.get(url='/mount/')
        assert resp['status'] == 200
        assert resp['body'] == 'mount'

    def test_static_mount_two_blocks(self, temp_dir, skip_alert):
        skip_alert(r'opening.*failed')

        os.symlink(temp_dir + '/assets/dir', temp_dir + '/assets/link')

        assert 'success' in self.conf(
            [
                {
                    "match": {"method": "HEAD"},
                    "action": {
                        "share": temp_dir + "/assets/dir$uri",
                        "traverse_mounts": False,
                    },
                },
                {
                    "match": {"method": "GET"},
                    "action": {
                        "share": temp_dir + "/assets/dir$uri",
                        "traverse_mounts": True,
                    },
                },
            ],
            'routes',
        ), 'configure two options'

        assert self.get(url='/mount/')['status'] == 200, 'block enabled'
        assert self.head(url='/mount/')['status'] == 403, 'block disabled'

    def test_static_mount_chroot(self, temp_dir, skip_alert):
        skip_alert(r'opening.*failed')

        assert 'success' in self.conf(
            {
                "share": temp_dir + "/assets/dir$uri",
                "chroot": temp_dir + "/assets",
            },
            'routes/0/action',
        ), 'configure chroot mount default'

        assert self.get(url='/mount/')['status'] == 200, 'chroot'

        assert 'success' in self.conf(
            {
                "share": temp_dir + "/assets/dir$uri",
                "chroot": temp_dir + "/assets",
                "traverse_mounts": False,
            },
            'routes/0/action',
        ), 'configure chroot mount disable'

        assert self.get(url='/mount/')['status'] == 403, 'chroot mount'