mirror of
https://0xacab.org/jvoisin/mat2-web.git
synced 2025-05-11 18:55:02 -04:00
Added Non-Ascii filename support
This commit is contained in:
parent
a5715f9f8c
commit
1035a24707
4 changed files with 30 additions and 10 deletions
|
@ -68,7 +68,7 @@ def upload_file():
|
||||||
parser, mime = utils.get_file_parser(filepath)
|
parser, mime = utils.get_file_parser(filepath)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
flash('The filetype is not supported')
|
flash('The filetype is not supported')
|
||||||
current_app.logger.error('Unsupported filetype',)
|
current_app.logger.error('Unsupported filetype')
|
||||||
return redirect(url_for('routes.upload_file'))
|
return redirect(url_for('routes.upload_file'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -2,6 +2,8 @@ import hmac
|
||||||
import os
|
import os
|
||||||
import hashlib
|
import hashlib
|
||||||
import mimetypes as mtype
|
import mimetypes as mtype
|
||||||
|
import pathlib
|
||||||
|
import uuid
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from flask_restful import abort, current_app
|
from flask_restful import abort, current_app
|
||||||
|
@ -68,9 +70,16 @@ def get_supported_extensions():
|
||||||
|
|
||||||
|
|
||||||
def save_file(file, upload_folder):
|
def save_file(file, upload_folder):
|
||||||
filename = secure_filename(file.filename)
|
path = pathlib.Path(file.filename)
|
||||||
|
extension = path.suffix
|
||||||
|
stem = path.stem
|
||||||
|
|
||||||
|
filename = secure_filename(stem)
|
||||||
if not filename:
|
if not filename:
|
||||||
raise ValueError('Invalid Filename')
|
filename = str(uuid.uuid4())
|
||||||
|
|
||||||
|
if extension:
|
||||||
|
filename = str(pathlib.Path(filename).with_suffix(extension))
|
||||||
filepath = os.path.join(upload_folder, filename)
|
filepath = os.path.join(upload_folder, filename)
|
||||||
file.save(os.path.join(filepath))
|
file.save(os.path.join(filepath))
|
||||||
return filename, filepath
|
return filename, filepath
|
||||||
|
|
17
test/test.py
17
test/test.py
|
@ -187,17 +187,28 @@ class Mat2WebTestCase(TestCase):
|
||||||
self.assertIn(b'.mp2', rv.data)
|
self.assertIn(b'.mp2', rv.data)
|
||||||
self.assertEqual(rv.status_code, 200)
|
self.assertEqual(rv.status_code, 200)
|
||||||
|
|
||||||
def test_get_upload_naughty_input(self):
|
def test_get_upload_no_ascii_no_ext_input(self):
|
||||||
rv = self.client.post(
|
rv = self.client.post(
|
||||||
'/',
|
'/',
|
||||||
data=dict(
|
data=dict(
|
||||||
file=(io.BytesIO(b"a"), '﷽'),
|
file=(io.BytesIO(b"a"), '﷽.txt'),
|
||||||
),
|
),
|
||||||
follow_redirects=True
|
follow_redirects=True
|
||||||
)
|
)
|
||||||
self.assertEqual(rv.status_code, 200)
|
self.assertEqual(rv.status_code, 200)
|
||||||
self.assertIn(b'Invalid Filename', rv.data)
|
self.assertIn(b'.cleaned.txt', rv.data)
|
||||||
|
|
||||||
|
def test_get_upload_no_ascii_stem_input(self):
|
||||||
|
pdfBytes = b"%PDF-1.\n 1 0 obj<</Pages 2 0 R>>endobj\n2 0 obj<</Kids[3 0 R]/Count 1>>endobj\n3 0 obj<</Parent 2 0 R>>endobj\ntrailer <</Root 1 0 R>>"
|
||||||
|
rv = self.client.post(
|
||||||
|
'/',
|
||||||
|
data=dict(
|
||||||
|
file=(io.BytesIO(pdfBytes), '한국어.pdf'),
|
||||||
|
),
|
||||||
|
follow_redirects=True
|
||||||
|
)
|
||||||
|
self.assertEqual(rv.status_code, 200)
|
||||||
|
self.assertIn(b'.cleaned.pdf', rv.data)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -451,8 +451,8 @@ class Mat2APITestCase(unittest.TestCase):
|
||||||
headers={'content-type': 'application/json'}
|
headers={'content-type': 'application/json'}
|
||||||
)
|
)
|
||||||
error_message = request.get_json()['message']
|
error_message = request.get_json()['message']
|
||||||
self.assertEqual(400, request.status_code)
|
self.assertEqual(415, request.status_code)
|
||||||
self.assertEqual("Invalid Filename", error_message)
|
self.assertEqual("The filetype is not supported", error_message)
|
||||||
|
|
||||||
request = self.app.post('/api/upload',
|
request = self.app.post('/api/upload',
|
||||||
data='{"file_name": "﷽", '
|
data='{"file_name": "﷽", '
|
||||||
|
@ -534,8 +534,8 @@ class Mat2APITestCase(unittest.TestCase):
|
||||||
),
|
),
|
||||||
follow_redirects=False
|
follow_redirects=False
|
||||||
)
|
)
|
||||||
self.assertEqual(r.get_json()['message'], 'Invalid Filename')
|
self.assertEqual(r.get_json()['message'], 'The filetype is not supported')
|
||||||
self.assertEqual(r.status_code, 400)
|
self.assertEqual(r.status_code, 415)
|
||||||
|
|
||||||
r = self.app.post(
|
r = self.app.post(
|
||||||
'/api/remove_metadata',
|
'/api/remove_metadata',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue