Projet

Général

Profil

0001-handle-storage-error-on-file-upload-40044.patch

Thomas Noël, 26 février 2020 11:57

Télécharger (4,53 ko)

Voir les différences:

Subject: [PATCH] handle storage error on file upload (#40044)

 tests/test_form_pages.py | 14 ++++++++++++++
 wcs/qommon/form.py       |  9 +++++++--
 wcs/root.py              | 15 ++++++++++-----
 3 files changed, 31 insertions(+), 7 deletions(-)
tests/test_form_pages.py
2895 2895
    assert resp.content_type == 'text/plain'
2896 2896
    assert resp.text == 'foobar'
2897 2897

  
2898
    # upload error if file storage is unknown (out of order)
2899
    formdef.fields[0].storage = 'unknown-storage'
2900
    formdef.store()
2901
    resp = app.get('/test/')
2902
    resp.form['f0$file'] = upload
2903
    # javascript simulation
2904
    upload_url = resp.form['f0$file'].attrs['data-url']
2905
    upload_resp = app.post(upload_url, params=resp.form.submit_fields())
2906
    assert upload_resp.json == [{'error': 'Failed to store file (system error)'}]
2907
    # try to post the form anyway (with file in f0$file, i.e. "no javascript")
2908
    resp = resp.forms[0].submit('submit')
2909
    assert 'Check values then click submit.' not in resp.text
2910
    assert 'failed to store file (system error)' in resp.text
2911

  
2898 2912

  
2899 2913
def test_form_file_field_image_submit(pub):
2900 2914
    formdef = create_formdef()
wcs/qommon/form.py
80 80
from .misc import strftime, C_, HAS_PDFTOPPM, json_loads
81 81
from .publisher import get_cfg
82 82
from .template_utils import render_block_to_string
83
from .upload_storage import PicklableUpload
83
from .upload_storage import PicklableUpload, UploadStorageError
84 84

  
85 85

  
86 86
QuixoteForm = Form
......
749 749
        if self.get('token'):
750 750
            token = self.get('token')
751 751
        elif self.get('file'):
752
            token = get_session().add_tempfile(self.get('file'), storage=self.storage)['token']
752
            try:
753
                token = get_session().add_tempfile(self.get('file'), storage=self.storage)['token']
754
            except UploadStorageError as e:
755
                self.error = _('failed to store file (system error)')
756
                return
753 757
            request.form[self.get_widget('token').get_name()] = token
754 758
        else:
755 759
            token = None
......
764 768

  
765 769
        if self.storage and self.storage != self.storage:
766 770
            self.error = _('unknown storage system (system error)')
771
            return
767 772

  
768 773
        # Don't trust the browser supplied MIME type, update the Upload object
769 774
        # with a MIME type created with magic (or based on the extension if the
wcs/root.py
36 36
from .qommon.form import *
37 37
from .qommon import ident
38 38
from .qommon import pages
39
from .qommon.upload_storage import UploadStorageError
39 40

  
40 41
from .qommon.afterjobs import AfterJobStatusDirectory
41 42

  
......
295 296
        storage = get_request().form.get('storage')
296 297
        for k, v in get_request().form.items():
297 298
            if hasattr(v, 'fp'):
298
                tempfile = get_session().add_tempfile(v, storage=storage)
299
                results.append({'name': tempfile.get('base_filename'),
300
                                'type': tempfile.get('content_type'),
301
                                'size': tempfile.get('size'),
302
                                'token': tempfile.get('token')})
299
                try:
300
                    tempfile = get_session().add_tempfile(v, storage=storage)
301
                    results.append({'name': tempfile.get('base_filename'),
302
                                    'type': tempfile.get('content_type'),
303
                                    'size': tempfile.get('size'),
304
                                    'token': tempfile.get('token')})
305
                except UploadStorageError as e:
306
                    get_logger().error('upload storage error: %s' % e)
307
                    results.append({'error': _('Failed to store file (system error)')})
303 308

  
304 309
        get_response().set_content_type('application/json')
305 310
        useragent = get_request().get_header('User-agent') or ''
306
-