Added Non-Ascii filename support

This commit is contained in:
jfriedli 2025-01-12 12:11:06 +00:00
parent a5715f9f8c
commit 1035a24707
4 changed files with 30 additions and 10 deletions

View file

@ -68,7 +68,7 @@ def upload_file():
parser, mime = utils.get_file_parser(filepath)
except ValueError:
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'))
try:

View file

@ -2,6 +2,8 @@ import hmac
import os
import hashlib
import mimetypes as mtype
import pathlib
import uuid
from typing import Tuple
from flask_restful import abort, current_app
@ -68,9 +70,16 @@ def get_supported_extensions():
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:
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)
file.save(os.path.join(filepath))
return filename, filepath

View file

@ -187,17 +187,28 @@ class Mat2WebTestCase(TestCase):
self.assertIn(b'.mp2', rv.data)
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(
'/',
data=dict(
file=(io.BytesIO(b"a"), ''),
file=(io.BytesIO(b"a"), '.txt'),
),
follow_redirects=True
)
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__':
unittest.main()

View file

@ -451,8 +451,8 @@ class Mat2APITestCase(unittest.TestCase):
headers={'content-type': 'application/json'}
)
error_message = request.get_json()['message']
self.assertEqual(400, request.status_code)
self.assertEqual("Invalid Filename", error_message)
self.assertEqual(415, request.status_code)
self.assertEqual("The filetype is not supported", error_message)
request = self.app.post('/api/upload',
data='{"file_name": "", '
@ -534,8 +534,8 @@ class Mat2APITestCase(unittest.TestCase):
),
follow_redirects=False
)
self.assertEqual(r.get_json()['message'], 'Invalid Filename')
self.assertEqual(r.status_code, 400)
self.assertEqual(r.get_json()['message'], 'The filetype is not supported')
self.assertEqual(r.status_code, 415)
r = self.app.post(
'/api/remove_metadata',