From ae6792830de22bfb15e7d7154469707cb0604b21 Mon Sep 17 00:00:00 2001 From: Christian Lawson-Perfect Date: Tue, 27 Feb 2024 15:46:37 +0000 Subject: [PATCH] editable packages: only allow reading or editing files inside the package's directory This commit adds validation on views which read, write or delete files belonging to extensions and themes. --- editor/forms.py | 16 ++++++-- .../templates/editable_package/edit_base.html | 6 +-- .../editable_package/edit_source.html | 20 +++++++--- editor/views/editable_package.py | 39 ++++++++++++++++--- editor/views/theme.py | 3 ++ 5 files changed, 67 insertions(+), 17 deletions(-) diff --git a/editor/forms.py b/editor/forms.py index 5dcb4df2..196d8be7 100644 --- a/editor/forms.py +++ b/editor/forms.py @@ -278,8 +278,18 @@ def clean_zipfile(self): raise forms.ValidationError('Uploaded file is not a zip file') return value +class PackageFileFormMixin: + def clean(self): + cleaned_data = super().clean() + package = self.instance + filename = cleaned_data.get('filename') + package_path = Path(package.extracted_path).resolve() + path = (package_path / filename).resolve() + if not path.is_relative_to(package_path): + raise forms.ValidationError("This file is not in the package's directory.") + return cleaned_data -class EditPackageForm(forms.ModelForm): +class EditPackageForm(PackageFileFormMixin, forms.ModelForm): """Form to edit a file in a package.""" @@ -299,7 +309,7 @@ def save(self, commit=True): f.write(self.cleaned_data.get('source')) return package -class EditPackageReplaceFileForm(forms.ModelForm): +class EditPackageReplaceFileForm(PackageFileFormMixin, forms.ModelForm): """Form to replace a file in a package.""" @@ -330,7 +340,7 @@ class ReplaceExtensionFileForm(EditPackageReplaceFileForm): class Meta(EditPackageReplaceFileForm.Meta): model = Extension -class PackageDeleteFileForm(forms.ModelForm): +class PackageDeleteFileForm(PackageFileFormMixin, forms.ModelForm): filename = forms.CharField(widget=forms.HiddenInput) class Meta: diff --git a/editor/templates/editable_package/edit_base.html b/editor/templates/editable_package/edit_base.html index ef5744a0..a1c37687 100644 --- a/editor/templates/editable_package/edit_base.html +++ b/editor/templates/editable_package/edit_base.html @@ -35,7 +35,7 @@

{% endif %} {% if object.editable %} -
Files {{filename}}
+
Files