Check the whole draft submission text when checking mime type, and catch decoding errors and raise ValidationError when converting submission form txt file to unicode for Draft().
- Legacy-Id: 13759
This commit is contained in:
parent
4b28605774
commit
274548f1b1
|
@ -203,11 +203,18 @@ class SubmissionUploadForm(forms.Form):
|
||||||
# try to parse it
|
# try to parse it
|
||||||
txt_file = self.cleaned_data['txt']
|
txt_file = self.cleaned_data['txt']
|
||||||
txt_file.seek(0)
|
txt_file.seek(0)
|
||||||
self.parsed_draft = Draft(txt_file.read().decode('utf8'), txt_file.name)
|
bytes = txt_file.read()
|
||||||
|
txt_file.seek(0)
|
||||||
|
try:
|
||||||
|
text = bytes.decode('utf8')
|
||||||
|
except UnicodeDecodeError as e:
|
||||||
|
raise forms.ValidationError('Failed decoding the uploaded file: "%s"' % str(e))
|
||||||
|
#
|
||||||
|
self.parsed_draft = Draft(text, txt_file.name)
|
||||||
self.filename = self.parsed_draft.filename
|
self.filename = self.parsed_draft.filename
|
||||||
self.revision = self.parsed_draft.revision
|
self.revision = self.parsed_draft.revision
|
||||||
self.title = self.parsed_draft.get_title()
|
self.title = self.parsed_draft.get_title()
|
||||||
txt_file.seek(0)
|
|
||||||
|
|
||||||
if not self.filename:
|
if not self.filename:
|
||||||
raise forms.ValidationError("Could not extract a valid draft name from the upload"
|
raise forms.ValidationError("Could not extract a valid draft name from the upload"
|
||||||
|
|
|
@ -76,7 +76,7 @@ class FileParser(object):
|
||||||
|
|
||||||
def parse_file_type(self):
|
def parse_file_type(self):
|
||||||
self.fd.file.seek(0)
|
self.fd.file.seek(0)
|
||||||
content = self.fd.file.read(4096)
|
content = self.fd.file.read()
|
||||||
mimetype = magic.from_buffer(content, mime=True)
|
mimetype = magic.from_buffer(content, mime=True)
|
||||||
if not mimetype in self.mimetypes:
|
if not mimetype in self.mimetypes:
|
||||||
self.parsed_info.add_error(u'Expected an %s file of type "%s", found one of type "%s"' % (self.ext.upper(), '" or "'.join(self.mimetypes), mimetype))
|
self.parsed_info.add_error(u'Expected an %s file of type "%s", found one of type "%s"' % (self.ext.upper(), '" or "'.join(self.mimetypes), mimetype))
|
||||||
|
|
|
@ -21,7 +21,7 @@ class PlainParser(FileParser):
|
||||||
def parse_file_charset(self):
|
def parse_file_charset(self):
|
||||||
import magic
|
import magic
|
||||||
self.fd.file.seek(0)
|
self.fd.file.seek(0)
|
||||||
content = self.fd.file.read(4096)
|
content = self.fd.file.read()
|
||||||
if hasattr(magic, "open"):
|
if hasattr(magic, "open"):
|
||||||
m = magic.open(magic.MAGIC_MIME)
|
m = magic.open(magic.MAGIC_MIME)
|
||||||
m.load()
|
m.load()
|
||||||
|
@ -31,8 +31,8 @@ class PlainParser(FileParser):
|
||||||
m.cookie = magic.magic_open(magic.MAGIC_NONE | magic.MAGIC_MIME | magic.MAGIC_MIME_ENCODING)
|
m.cookie = magic.magic_open(magic.MAGIC_NONE | magic.MAGIC_MIME | magic.MAGIC_MIME_ENCODING)
|
||||||
magic.magic_load(m.cookie, None)
|
magic.magic_load(m.cookie, None)
|
||||||
filetype = m.from_buffer(content)
|
filetype = m.from_buffer(content)
|
||||||
if not 'ascii' in filetype:
|
if not 'ascii' in filetype and not 'utf-8' in filetype:
|
||||||
self.parsed_info.add_error('A plain text ASCII document must be submitted.')
|
self.parsed_info.add_error('A plain text ASCII document is required. Found an unexpected encoding: "%s"' % filetype)
|
||||||
|
|
||||||
def parse_name(self):
|
def parse_name(self):
|
||||||
self.fd.file.seek(0)
|
self.fd.file.seek(0)
|
||||||
|
|
Loading…
Reference in a new issue