From d3051b50d76e396ff26fbb9f74062b0ad3924941 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 18 Feb 2020 11:33:47 +0100 Subject: [PATCH] csvdatasource: validate CSV file in clean() (#39971) --- passerelle/apps/csvdatasource/models.py | 4 ++++ tests/test_csv_datasource.py | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py index 8e0feea5..a8d85467 100644 --- a/passerelle/apps/csvdatasource/models.py +++ b/passerelle/apps/csvdatasource/models.py @@ -149,6 +149,10 @@ class CsvDataSource(BaseResource): self._detect_dialect_options() except Exception as e: raise ValidationError(_('Could not detect CSV dialect: %s') % e) + try: + self.get_rows() + except Exception as e: + raise ValidationError(_('Invalid CSV file: %s') % e) return super(CsvDataSource, self).clean(*args, **kwargs) def _detect_dialect_options(self): diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py index 0b0f0f72..96bd28e6 100644 --- a/tests/test_csv_datasource.py +++ b/tests/test_csv_datasource.py @@ -751,6 +751,17 @@ def test_csv_sniffer(admin_user, app): assert 'Could not detect CSV dialect' in resp +def test_csv_validation(admin_user, app): + app = login(app) + resp = app.get('/manage/csvdatasource/add') + form = resp.form + form.set('title', 'Title') + form.set('description', 'Description') + form.set('csv_file', webtest.Upload('test.csv', b'a,b,c\n1,2\0,3\n4,5,6', 'application/octet-stream')) + resp = form.submit() + assert 'Invalid CSV file: line contains NUL' in resp + + def test_change_csv_command(setup): csv, url = setup(data=StringIO(data)) call_command('change-csv', 'test', os.path.join(TEST_BASE_DIR, 'data-empty.ods')) -- 2.24.0