production-taskbar / backend / config / middleware.py
middleware.py
Raw
from typing import Callable
from django.http import HttpResponseForbidden, HttpRequest, HttpResponse
from django.contrib.auth.models import User
from django.template import loader, Template


def custom_forbidden_response(
    message: str = "Доступ заборонено. Тільки для адміністраторів."
) -> HttpResponseForbidden:
    template = loader.get_template('response/403.html')
    result = template.render({"message": message})
    return HttpResponseForbidden(result)


class AuthedHttpRequest(HttpRequest):
    user: User


class FilebrowserAccess:

    def __init__(self, get_response: Callable[[HttpRequest], HttpResponse]):
        self.get_response = get_response
        self.filebrowser_user_dirs = [
            '_versions',
            'uploads',
            'icons',
        ]

    def __call__(self, request: AuthedHttpRequest) -> HttpResponse:
        response = self.get_response(request)

        is_filebrowser = request.path.startswith('/admin/filebrowser/browse/')
        if is_filebrowser:
            filebrowser_dir = request.GET.get('dir', None)
            if filebrowser_dir:
                directory = filebrowser_dir.split('/')[0]
                if directory not in self.filebrowser_user_dirs and not request.user.is_superuser:
                    return custom_forbidden_response()

        return response