Skip to content

Commit 330d1da

Browse files
fdintinofsbraun
andauthored
fix(2.2.x backport): respect upload and directory listing permissions (#1527)
* fix: respect upload and directory listing permissions (#1352) * 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 * Run isort * ci: use ubuntu-latest runner in gha actions * update dependencies and tox matrix to something workable --------- Co-authored-by: Fabian Braun <fsbraun@gmx.de>
1 parent 5440e47 commit 330d1da

File tree

18 files changed

+281
-172
lines changed

18 files changed

+281
-172
lines changed

.github/workflows/frontend.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [push]
44

55
jobs:
66
gulp:
7-
runs-on: ubuntu-20.04
7+
runs-on: ubuntu-latest
88
strategy:
99
matrix:
1010
node-version: [14.15.x]

.github/workflows/test.yml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
strategy:
99
fail-fast: false
1010
matrix:
11-
python-version: [ '3.7', '3.8', '3.9', '3.10', '3.11' ]
11+
python-version: [ '3.8', '3.9', '3.10', '3.11' ]
1212
requirements-file: [
1313
django-2.2.txt,
1414
django-3.0.txt,
@@ -19,12 +19,6 @@ jobs:
1919
django-4.2.txt,
2020
]
2121
exclude:
22-
- python-version: 3.7
23-
requirements-file: django-4.0.txt
24-
- python-version: 3.7
25-
requirements-file: django-4.1.txt
26-
- python-version: 3.7
27-
requirements-file: django-4.2.txt
2822
- python-version: 3.9
2923
requirements-file: django-2.2.txt
3024
- python-version: 3.10
@@ -40,7 +34,7 @@ jobs:
4034
- python-version: 3.11
4135
requirements-file: django-3.1.txt
4236
os: [
43-
ubuntu-20.04,
37+
ubuntu-latest,
4438
]
4539

4640
steps:
@@ -50,7 +44,7 @@ jobs:
5044
with:
5145
python-version: ${{ matrix.python-version }}
5246
- name: library prerequisites
53-
run: sudo apt-get install python-dev libpq-dev libmagic1 gcc libxml2-dev libxslt1-dev libjpeg62 libopenjp2-7 -y
47+
run: sudo apt-get install python-dev-is-python3 libpq-dev libmagic1 gcc libxml2-dev libxslt1-dev libjpeg62 libopenjp2-7 -y
5448
- name: Install extra dependencies
5549
run: pip install lxml
5650
if: matrix.python-version == '3.10'

.readthedocs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ version: 2
77

88
# Set the version of Python and other tools you might need
99
build:
10-
os: ubuntu-20.04
10+
os: ubuntu-latest
1111
tools:
1212
python: "3.9"
1313
# You can also specify other tool versions:

filer/admin/clipboardadmin.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
from django.contrib import admin
1+
from django.contrib import admin, messages
22
from django.forms.models import modelform_factory
33
from django.http import JsonResponse
44
from django.urls import path
5+
from django.utils.translation import gettext_lazy as _
56
from django.views.decorators.csrf import csrf_exempt
67

78
from .. import settings as filer_settings
@@ -11,8 +12,9 @@
1112
from . import views
1213

1314

14-
NO_FOLDER_ERROR = "Can't find folder to upload. Please refresh and try again"
15-
NO_PERMISSIONS_FOR_FOLDER = (
15+
NO_PERMISSIONS = _("You do not have permission to upload files.")
16+
NO_FOLDER_ERROR = _("Can't find folder to upload. Please refresh and try again")
17+
NO_PERMISSIONS_FOR_FOLDER = _(
1618
"Can't use this folder, Permission Denied. Please select another folder."
1719
)
1820

@@ -68,17 +70,24 @@ def ajax_upload(request, folder_id=None):
6870
"""
6971
Receives an upload from the uploader. Receives only one file at a time.
7072
"""
73+
74+
if not request.user.has_perm("filer.add_file"):
75+
messages.error(request, NO_PERMISSIONS)
76+
return JsonResponse({'error': NO_PERMISSIONS})
77+
7178
if folder_id:
7279
try:
7380
# Get folder
7481
folder = Folder.objects.get(pk=folder_id)
7582
except Folder.DoesNotExist:
83+
messages.error(request, NO_FOLDER_ERROR)
7684
return JsonResponse({'error': NO_FOLDER_ERROR})
7785
else:
7886
folder = Folder.objects.filter(pk=request.session.get('filer_last_folder_id', 0)).first()
7987

8088
# check permissions
8189
if folder and not folder.has_add_children_permission(request):
90+
messages.error(request, NO_PERMISSIONS_FOR_FOLDER)
8291
return JsonResponse({'error': NO_PERMISSIONS_FOR_FOLDER})
8392

8493
if len(request.FILES) == 1:

filer/admin/folderadmin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ def get_urls(self):
233233

234234
# custom views
235235
def directory_listing(self, request, folder_id=None, viewtype=None):
236+
if not request.user.has_perm("filer.can_use_directory_listing"):
237+
raise PermissionDenied()
236238
clipboard = tools.get_user_clipboard(request.user)
237239
if viewtype == 'images_with_missing_data':
238240
folder = ImagesWithMissingData()

filer/models/filemodels.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,13 +300,13 @@ def __lt__(self, other):
300300
return self.label.lower() < other.label.lower()
301301

302302
def has_edit_permission(self, request):
303-
return self.has_generic_permission(request, 'edit')
303+
return request.user.has_perm("filer.change_file") and self.has_generic_permission(request, 'edit')
304304

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

308308
def has_add_children_permission(self, request):
309-
return self.has_generic_permission(request, 'add_children')
309+
return request.user.has_perm("filer.add_file") and self.has_generic_permission(request, 'add_children')
310310

311311
def has_generic_permission(self, request, permission_type):
312312
"""

filer/models/foldermodels.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,13 @@ def quoted_logical_path(self):
200200
return urlquote(self.pretty_logical_path)
201201

202202
def has_edit_permission(self, request):
203-
return self.has_generic_permission(request, 'edit')
203+
return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'edit')
204204

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

208208
def has_add_children_permission(self, request):
209-
return self.has_generic_permission(request, 'add_children')
209+
return request.user.has_perm("filer.change_folder") and self.has_generic_permission(request, 'add_children')
210210

211211
def has_generic_permission(self, request, permission_type):
212212
"""

tests/requirements/django-2.2.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
django>=2.2,<3.0
44
django_polymorphic>=2.0,<2.1
55
django-app-helper
6+
easy-thumbnails[svg]<2.10

tests/requirements/django-3.0.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
django>=3.0,<3.1
44
django_polymorphic>=2.1,<2.2
55
django-app-helper
6+
easy-thumbnails[svg]<2.10

tests/requirements/django-3.1.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
django>=3.1,<3.2
44
django_polymorphic>=2,<3.1
55
django-app-helper
6+
easy-thumbnails[svg]<2.10

0 commit comments

Comments
 (0)