Skip to content

Commit 0c06d86

Browse files
Prevent possible Code injection in podfile (#1367)
Fixes for security alerts : - https://github.com/EsupPortail/Esup-Pod/security/code-scanning/44 - https://github.com/EsupPortail/Esup-Pod/security/code-scanning/45 - https://github.com/EsupPortail/Esup-Pod/security/code-scanning/46 Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
1 parent 3bc43b2 commit 0c06d86

File tree

6 files changed

+49
-14
lines changed

6 files changed

+49
-14
lines changed
211 Bytes
Binary file not shown.

pod/locale/fr/LC_MESSAGES/django.po

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ msgid ""
55
msgstr ""
66
"Project-Id-Version: Pod\n"
77
"Report-Msgid-Bugs-To: \n"
8-
"POT-Creation-Date: 2025-10-09 14:25+0200\n"
8+
"POT-Creation-Date: 2025-10-15 17:14+0200\n"
99
"PO-Revision-Date: \n"
1010
"Last-Translator: obado <[email protected]>\n"
1111
"Language-Team: Pod Team [email protected]\n"
@@ -10775,6 +10775,15 @@ msgstr "Statistiques de visualisation des vidéos du thème %s"
1077510775
msgid "You do not have access rights to this video: %s "
1077610776
msgstr "Vous n’avez pas les droits d’accès à cette vidéo : %s "
1077710777

10778+
#: pod/video/views.py
10779+
#, python-format
10780+
msgid ""
10781+
"The following “%(target)s” type target does not exist or contains no videos: "
10782+
"%(slug)s."
10783+
msgstr ""
10784+
"La cible de type « %(target)s » suivant(e) n’existe pas ou ne contient "
10785+
"aucune vidéo : %(slug)s."
10786+
1077810787
#: pod/video/views.py
1077910788
#, python-format
1078010789
msgid "The following video does not exist: %s"

pod/locale/nl/LC_MESSAGES/django.po

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10084,6 +10084,13 @@ msgstr ""
1008410084
msgid "You do not have access rights to this video: %s "
1008510085
msgstr ""
1008610086

10087+
#: pod/video/views.py
10088+
#, python-format
10089+
msgid ""
10090+
"The following “%(target)s” type target does not exist or contains no videos: "
10091+
"%(slug)s."
10092+
msgstr ""
10093+
1008710094
#: pod/video/views.py
1008810095
#, python-format
1008910096
msgid "The following video does not exist: %s"

pod/podfile/views.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,15 @@ def deletefolder(request):
266266
@staff_member_required(redirect_field_name="referrer")
267267
def deletefile(request):
268268
if request.POST.get("id") and request.POST.get("classname"):
269-
file = get_object_or_404(
270-
eval(request.POST.get("classname")), id=request.POST.get("id")
271-
)
269+
classname = request.POST.get("classname")
270+
if classname == "CustomImageModel":
271+
file = get_object_or_404(
272+
CustomImageModel, id=request.POST.get("id")
273+
)
274+
else:
275+
file = get_object_or_404(
276+
CustomFileModel, id=request.POST.get("id")
277+
)
272278
folder = file.folder
273279
if request.user != file.created_by and not (
274280
request.user.is_superuser
@@ -398,9 +404,16 @@ def changefile(request):
398404
)
399405
raise PermissionDenied
400406

401-
file = get_object_or_404(
402-
eval(request.POST.get("file_type")), id=request.POST.get("file_id")
403-
)
407+
file_type = request.POST.get("file_type")
408+
if file_type == "CustomImageModel":
409+
file = get_object_or_404(
410+
CustomImageModel, id=request.POST.get("file_id")
411+
)
412+
else:
413+
file = get_object_or_404(
414+
CustomFileModel, id=request.POST.get("file_id")
415+
)
416+
404417
if request.user != file.created_by and not (
405418
request.user.is_superuser
406419
or request.user.has_perm("podfile.change_customfilemodel")
@@ -410,9 +423,14 @@ def changefile(request):
410423
messages.add_message(request, messages.ERROR, _("You cannot edit this file."))
411424
raise PermissionDenied
412425

413-
form_file = eval("%sForm" % request.POST.get("file_type"))(
414-
request.POST, request.FILES, instance=file
415-
)
426+
if file_type == "CustomImageModel":
427+
form_file = CustomImageModelForm(
428+
request.POST, request.FILES, instance=file
429+
)
430+
else:
431+
form_file = CustomFileModelForm(
432+
request.POST, request.FILES, instance=file
433+
)
416434

417435
if form_file.is_valid():
418436
if form_file.cleaned_data["folder"] != folder:

pod/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
##
2020
# Version of the project
2121
#
22-
VERSION = "4.0.1"
22+
VERSION = "4.0.3"
2323

2424
##
2525
# Installed applications list

pod/video/views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from django.http import QueryDict, Http404
1818
from django.views.decorators.csrf import csrf_protect
1919
from django.contrib import messages
20+
from django.utils.html import escape
2021
from django.utils.translation import ngettext
2122
from django.utils.translation import gettext_lazy as _
2223
from django.contrib.auth.models import User
@@ -2645,8 +2646,8 @@ def stats_view(request, slug=None, slug_t=None):
26452646
"""
26462647
target = request.GET.get("from", "videos")
26472648
videos, title = get_videos(slug, target, slug_t)
2648-
error_message = (
2649-
"The following %(target)s does not exist or contain any videos: %(slug)s"
2649+
error_message = _(
2650+
"The following %(target)s” type target does not exist or contains no videos: %(slug)s."
26502651
)
26512652
if request.method == "GET" and target == "video" and videos:
26522653
return manage_access_rights_stats_video(request, videos[0], title)
@@ -2659,7 +2660,7 @@ def stats_view(request, slug=None, slug_t=None):
26592660
):
26602661
slug = slug if not slug_t else slug_t
26612662
target = "Pod" if target == "videos" else target
2662-
return HttpResponseNotFound(_(error_message) % {"target": target, "slug": slug})
2663+
return HttpResponseNotFound(error_message % {"target": escape(target), "slug": escape(slug)})
26632664

26642665
if (
26652666
request.method == "POST"

0 commit comments

Comments
 (0)