From 8d8ace1c213973f69392bb992f6d0e796d1ebb30 Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Fri, 29 Jul 2016 12:49:20 +0200 Subject: [PATCH] url encode filenames (#12793) --- fargo/fargo/models.py | 9 +++++++-- tests/test_api.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/fargo/fargo/models.py b/fargo/fargo/models.py index 0f6032b..a1494ef 100644 --- a/fargo/fargo/models.py +++ b/fargo/fargo/models.py @@ -3,6 +3,7 @@ import base64 import subprocess import os import threading +import urllib from django.conf import settings from django.core.urlresolvers import reverse @@ -60,12 +61,16 @@ class UserDocument(models.Model): verbose_name_plural = _('user documents') ordering = ('-created', 'user') + @property + def filename_encoded(self): + return urllib.quote(self.filename, safe='') + def get_download_url(self): - return reverse('download', kwargs={'pk': self.id, 'filename': self.filename}) + return reverse('download', kwargs={'pk': self.id, 'filename': self.filename_encoded}) def get_thumbnail_url(self): if self.document.thumbnail: - return reverse('thumbnail', kwargs={'pk': self.id, 'filename': self.filename}) + return reverse('thumbnail', kwargs={'pk': self.id, 'filename': self.filename_encoded}) return '' diff --git a/tests/test_api.py b/tests/test_api.py index 7412a9a..1c6af50 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -132,3 +132,20 @@ def test_push_document_max_document_box_size(app, private_settings, admin_user, assert response.json['errors'].keys() == ['__all__'] assert response.json['errors']['__all__'][0]['code'] == 'box-is-full' assert response.json['errors']['__all__'][0]['limit'] == 4 + + +def test_push_document_slashed_name(app, admin_user, john_doe): + login(app) + url = reverse('fargo-api-push-document') + data = { + 'user_email': john_doe.email, + 'origin': 'wcs', + 'file_b64_content': base64.b64encode('coin'), + 'file_name': 'monfichier 18/06/2017.pdf', + } + response = app.post_json(url, data, status=200) + assert response.json['result'] == 1 + assert models.Document.objects.count() == 1 + slashed = models.UserDocument.objects.first() + assert slashed.filename == 'monfichier 18/06/2017.pdf' + assert slashed.get_download_url() == '/1/download/monfichier%252018%252F06%252F2017.pdf' -- 2.8.1