application: verify upload filename
Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
@@ -980,10 +980,7 @@ class FileUploadHandler(AuthorizedRequestHandler):
|
|||||||
async def post(self) -> None:
|
async def post(self) -> None:
|
||||||
if self.parse_failed:
|
if self.parse_failed:
|
||||||
self._file.on_finish()
|
self._file.on_finish()
|
||||||
try:
|
self._remove_temp_file()
|
||||||
os.remove(self._file.filename)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
raise tornado.web.HTTPError(500, "File Upload Parsing Failed")
|
raise tornado.web.HTTPError(500, "File Upload Parsing Failed")
|
||||||
form_args = {}
|
form_args = {}
|
||||||
chk_target = self._targets.pop('checksum')
|
chk_target = self._targets.pop('checksum')
|
||||||
@@ -992,20 +989,20 @@ class FileUploadHandler(AuthorizedRequestHandler):
|
|||||||
# Validate checksum
|
# Validate checksum
|
||||||
recd_cksum = chk_target.value.decode().lower()
|
recd_cksum = chk_target.value.decode().lower()
|
||||||
if calc_chksum != recd_cksum:
|
if calc_chksum != recd_cksum:
|
||||||
# remove temporary file
|
self._remove_temp_file()
|
||||||
try:
|
|
||||||
os.remove(self._file.filename)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
raise tornado.web.HTTPError(
|
raise tornado.web.HTTPError(
|
||||||
422,
|
422,
|
||||||
f"File checksum mismatch: expected {recd_cksum}, "
|
f"File checksum mismatch: expected {recd_cksum}, "
|
||||||
f"calculated {calc_chksum}"
|
f"calculated {calc_chksum}"
|
||||||
)
|
)
|
||||||
|
mp_fname: Optional[str] = self._file.multipart_filename
|
||||||
|
if mp_fname is None or not mp_fname.strip():
|
||||||
|
self._remove_temp_file()
|
||||||
|
raise tornado.web.HTTPError(400, "Multipart filename omitted")
|
||||||
for name, target in self._targets.items():
|
for name, target in self._targets.items():
|
||||||
if target.value:
|
if target.value:
|
||||||
form_args[name] = target.value.decode()
|
form_args[name] = target.value.decode()
|
||||||
form_args['filename'] = self._file.multipart_filename
|
form_args['filename'] = mp_fname
|
||||||
form_args['tmp_file_path'] = self._file.filename
|
form_args['tmp_file_path'] = self._file.filename
|
||||||
debug_msg = "\nFile Upload Arguments:"
|
debug_msg = "\nFile Upload Arguments:"
|
||||||
for name, value in form_args.items():
|
for name, value in form_args.items():
|
||||||
@@ -1013,7 +1010,7 @@ class FileUploadHandler(AuthorizedRequestHandler):
|
|||||||
debug_msg += f"\nChecksum: {calc_chksum}"
|
debug_msg += f"\nChecksum: {calc_chksum}"
|
||||||
form_args["current_user"] = self.current_user
|
form_args["current_user"] = self.current_user
|
||||||
logging.debug(debug_msg)
|
logging.debug(debug_msg)
|
||||||
logging.info(f"Processing Uploaded File: {self._file.multipart_filename}")
|
logging.info(f"Processing Uploaded File: {mp_fname}")
|
||||||
try:
|
try:
|
||||||
result = await self.file_manager.finalize_upload(form_args)
|
result = await self.file_manager.finalize_upload(form_args)
|
||||||
except ServerError as e:
|
except ServerError as e:
|
||||||
@@ -1041,6 +1038,12 @@ class FileUploadHandler(AuthorizedRequestHandler):
|
|||||||
self.set_header("Content-Type", "application/json; charset=UTF-8")
|
self.set_header("Content-Type", "application/json; charset=UTF-8")
|
||||||
self.finish(jsonw.dumps(result))
|
self.finish(jsonw.dumps(result))
|
||||||
|
|
||||||
|
def _remove_temp_file(self) -> None:
|
||||||
|
try:
|
||||||
|
os.remove(self._file.filename)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
# Default Handler for unregistered endpoints
|
# Default Handler for unregistered endpoints
|
||||||
class AuthorizedErrorHandler(AuthorizedRequestHandler):
|
class AuthorizedErrorHandler(AuthorizedRequestHandler):
|
||||||
async def prepare(self) -> None:
|
async def prepare(self) -> None:
|
||||||
|
Reference in New Issue
Block a user