Skip to content

Commit

Permalink
fix: respect upload and directory listing permissions (#1352)
Browse files Browse the repository at this point in the history
* fix: respect `can_use_directory_listing`, `change_folder`, `add_folder`, `add_file` permissions

* Update tests

* fix flake8 error

* Close files in tests

* Add test for has_... permissions of File and Folder class

* Remove unused variables from tests

* Remove unnecessary noqa
  • Loading branch information
fsbraun committed Jun 10, 2023
1 parent 672d00b commit 2b6798e
Show file tree
Hide file tree
Showing 8 changed files with 264 additions and 155 deletions.
15 changes: 12 additions & 3 deletions filer/admin/clipboardadmin.py
@@ -1,7 +1,8 @@
from django.contrib import admin
from django.contrib import admin, messages
from django.forms.models import modelform_factory
from django.http import JsonResponse
from django.urls import re_path
from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt

from .. import settings as filer_settings
Expand All @@ -11,8 +12,9 @@
from . import views


NO_FOLDER_ERROR = "Can't find folder to upload. Please refresh and try again"
NO_PERMISSIONS_FOR_FOLDER = (
NO_PERMISSIONS = _("You do not have permission to upload files.")
NO_FOLDER_ERROR = _("Can't find folder to upload. Please refresh and try again")
NO_PERMISSIONS_FOR_FOLDER = _(
"Can't use this folder, Permission Denied. Please select another folder."
)

Expand Down Expand Up @@ -68,17 +70,24 @@ def ajax_upload(request, folder_id=None):
"""
Receives an upload from the uploader. Receives only one file at a time.
"""

if not request.user.has_perm("filer.add_file"):
messages.error(request, NO_PERMISSIONS)
return JsonResponse({'error': NO_PERMISSIONS})

if folder_id:
try:
# Get folder
folder = Folder.objects.get(pk=folder_id)
except Folder.DoesNotExist:
messages.error(request, NO_FOLDER_ERROR)
return JsonResponse({'error': NO_FOLDER_ERROR})
else:
folder = Folder.objects.filter(pk=request.session.get('filer_last_folder_id', 0)).first()

# check permissions
if folder and not folder.has_add_children_permission(request):
messages.error(request, NO_PERMISSIONS_FOR_FOLDER)
return JsonResponse({'error': NO_PERMISSIONS_FOR_FOLDER})

if len(request.FILES) == 1:
Expand Down
2 changes: 2 additions & 0 deletions filer/admin/folderadmin.py
Expand Up @@ -233,6 +233,8 @@ def get_urls(self):

# custom views
def directory_listing(self, request, folder_id=None, viewtype=None):
if not request.user.has_perm("filer.can_use_directory_listing"):
raise PermissionDenied()
clipboard = tools.get_user_clipboard(request.user)
if viewtype == 'images_with_missing_data':
folder = ImagesWithMissingData()
Expand Down
4 changes: 2 additions & 2 deletions filer/models/filemodels.py
Expand Up @@ -300,13 +300,13 @@ def __lt__(self, other):
return self.label.lower() < other.label.lower()

def has_edit_permission(self, request):
return self.has_generic_permission(request, 'edit')
return request.user.has_perm("filer.change_file") and self.has_generic_permission(request, 'edit')

def has_read_permission(self, request):
return self.has_generic_permission(request, 'read')

def has_add_children_permission(self, request):
return self.has_generic_permission(request, 'add_children')
return request.user.has_perm("filer.add_file") and self.has_generic_permission(request, 'add_children')

def has_generic_permission(self, request, permission_type):
"""
Expand Down
4 changes: 2 additions & 2 deletions filer/models/foldermodels.py
Expand Up @@ -200,13 +200,13 @@ def quoted_logical_path(self):
return urlquote(self.pretty_logical_path)

def has_edit_permission(self, request):
return self.has_generic_permission(request, 'edit')
return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'edit')

def has_read_permission(self, request):
return self.has_generic_permission(request, 'read')

def has_add_children_permission(self, request):
return self.has_generic_permission(request, 'add_children')
return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'add_children')

def has_generic_permission(self, request, permission_type):
"""
Expand Down

0 comments on commit 2b6798e

Please sign in to comment.