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) 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:

View file

@ -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

View file

@ -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()

View file

@ -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',