Projet

Général

Profil

0001-url-encode-filenames-12793.patch

Josué Kouka, 01 août 2016 10:55

Télécharger (2,72 ko)

Voir les différences:

Subject: [PATCH] url encode filenames (#12793)

 fargo/fargo/models.py |  9 +++++++--
 tests/test_api.py     | 19 +++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)
fargo/fargo/models.py
9 9
from django.db import models
10 10
from django.utils.translation import ugettext_lazy as _
11 11
from django.utils.text import slugify
12
from django.utils.http import urlquote
12 13
from django.dispatch import receiver
13 14
from django.db.models.signals import post_save
14 15
from django.core.files.storage import default_storage
......
60 61
        verbose_name_plural = _('user documents')
61 62
        ordering = ('-created', 'user')
62 63

  
64
    @property
65
    def filename_encoded(self):
66
        return urlquote(self.filename, safe='')
67

  
63 68
    def get_download_url(self):
64
        return reverse('download', kwargs={'pk': self.id, 'filename': self.filename})
69
        return reverse('download', kwargs={'pk': self.id, 'filename': self.filename_encoded})
65 70

  
66 71
    def get_thumbnail_url(self):
67 72
        if self.document.thumbnail:
68
            return reverse('thumbnail', kwargs={'pk': self.id, 'filename': self.filename})
73
            return reverse('thumbnail', kwargs={'pk': self.id, 'filename': self.filename_encoded})
69 74
        return ''
70 75

  
71 76

  
tests/test_api.py
132 132
    assert response.json['errors'].keys() == ['__all__']
133 133
    assert response.json['errors']['__all__'][0]['code'] == 'box-is-full'
134 134
    assert response.json['errors']['__all__'][0]['limit'] == 4
135

  
136

  
137
def test_push_document_slashed_name(app, admin_user, john_doe):
138
    login(app)
139
    url = reverse('fargo-api-push-document')
140
    data = {
141
        'user_email': john_doe.email,
142
        'origin': 'wcs',
143
        'file_b64_content': base64.b64encode('whatever'),
144
        'file_name': 'monfichier 18/06/2017.pdf',
145
    }
146
    response = app.post_json(url, data, status=200)
147
    assert response.json['result'] == 1
148
    assert models.Document.objects.count() == 1
149
    doc = models.UserDocument.objects.first()
150
    assert doc.filename == 'monfichier 18/06/2017.pdf'
151
    assert doc.get_download_url() == '/1/download/monfichier%252018%252F06%252F2017.pdf'
152
    login(app, user=john_doe)
153
    app.get(doc.get_download_url(), status=200)
135
-