async def file_getter(request): tail = unquote(request.route_values.get('tail')).lstrip('/') resource_path = os.path.join(source_folder_name, tail) if '../' in tail: abs_path = os.path.abspath(resource_path) if not str(abs_path).lower().startswith(source_folder_full_path): # someone is trying to read out of the static folder raise NotFound() if not os.path.exists(resource_path) or os.path.islink(resource_path): raise NotFound() if os.path.isdir(resource_path): if discovery: return get_files_list_html_response( files_list_template, tail.rstrip('/'), list(get_files_to_serve(resource_path.rstrip('/')))) else: raise NotFound() file_extension = get_file_extension_from_name(resource_path) if file_extension not in extensions: raise NotFound() return get_response_for_file(request, resource_path, cache_time)
def get_files_to_serve(source_folder, extensions=None, recurse=False, root_folder=None): if extensions is None: extensions = get_default_extensions() if not root_folder: root_folder = source_folder p = Path(source_folder) if not p.exists(): raise InvalidArgument('given root path does not exist') if not p.is_dir(): raise InvalidArgument('given root path is not a directory') names = os.listdir(p) names.sort() dirs, nondirs = [], [] for name in names: full_path = Path(os.path.join(source_folder, name)) if os.path.isdir(full_path): dirs.append(full_path) else: nondirs.append(full_path) items = dirs + nondirs for item in items: item_path = str(item) if os.path.islink(item_path): continue if item.is_dir(): if not recurse: yield { 'rel_path': item_path[len(root_folder) + 1:], 'full_path': item_path, 'is_dir': True } else: for v in get_files_to_serve(Path(item_path), extensions, recurse, root_folder): yield v else: extension = get_file_extension_from_name(item_path) if extension in extensions: yield { 'rel_path': item_path[len(root_folder) + 1:], 'full_path': item_path, 'is_dir': False }
def get_files_to_serve(source_folder, extensions=None, discovery=False, root_folder=None): if extensions is None: extensions = get_default_extensions() if not root_folder: root_folder = source_folder p = Path(source_folder) if not p.exists(): raise InvalidArgument('given root path does not exist') if not p.is_dir(): raise InvalidArgument('given root path is not a directory') items = [x for x in p.iterdir()] items.sort(reverse=True) for item in items: item_path = str(item) if os.path.islink(item_path): continue if item.is_dir(): if discovery: yield { 'rel_path': item_path[len(root_folder):], 'full_path': item_path, 'is_dir': True } for v in get_files_to_serve(Path(item_path), extensions, discovery, root_folder): yield v else: extension = get_file_extension_from_name(item_path) if extension in extensions: yield { 'rel_path': item_path[len(root_folder):], 'full_path': item_path }