Ejemplo n.º 1
0
class URLDirectoryHandler(URLHandler):
    ALLOWED_EXTENSIONS = ('jpg', 'css', 'js', 'gif', 'less', 'html', 'htm')

    def __init__(self, url, path):
        super(URLDirectoryHandler, self).__init__(url + '/<filename:EOF>')
        self.path = Path(path)

    def urls(self, pattern):
        return [self.url(path.base) for path in self.path.find(pattern)]

    def directory_view(self, x, files, dirs):
        with x.html:
            with x.body:
                with x.div('DIRECTORIES') >> x.ul:
                    for item in dirs:
                        x.li << x.a(item.base, href=self.url(item.base))
                with x.div('FILES') >> x.ul:
                    for item in files:
                        x.li << x.a(item.base, href=self.url(item.base))

    def directory_handler(self, req, filename, path):
        files, dirs = [], []
        for item in path.find():
            (dirs if item.isdir() else files).append(item)
        return pyml_response(req, self.directory_view, files, dirs)

    def secure(self, req, filename):
        assert '/..' not in filename, filename
        assert '../' not in filename, filename

        if '.' in filename:
            _, ext = filename.rsplit('.', 1)
            assert ext in self.ALLOWED_EXTENSIONS, ext

    def handler(self, req, filename):
        self.secure(req, filename)

        path = self.path[filename].real()
        if path.isfile():
            return file_response(req, path)
        if path.isdir():
            return self.directory_handler(req, filename, path)
        raise URLError('The file does not exist.')
Ejemplo n.º 2
0
 def __init__(self, url, path):
     super(URLDirectoryHandler, self).__init__(url + '/<filename:EOF>')
     self.path = Path(path)