file.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import urllib.parse
  2. from flask import request
  3. from flask_restful import marshal_with
  4. import services
  5. from controllers.web import api
  6. from controllers.web.error import FileTooLargeError, NoFileUploadedError, TooManyFilesError, UnsupportedFileTypeError
  7. from controllers.web.wraps import WebApiResource
  8. from core.helper import ssrf_proxy
  9. from fields.file_fields import file_fields, remote_file_info_fields
  10. from services.file_service import FileService
  11. class FileApi(WebApiResource):
  12. @marshal_with(file_fields)
  13. def post(self, app_model, end_user):
  14. # get file from request
  15. file = request.files["file"]
  16. # check file
  17. if "file" not in request.files:
  18. raise NoFileUploadedError()
  19. if len(request.files) > 1:
  20. raise TooManyFilesError()
  21. try:
  22. upload_file = FileService.upload_file(file, end_user)
  23. except services.errors.file.FileTooLargeError as file_too_large_error:
  24. raise FileTooLargeError(file_too_large_error.description)
  25. except services.errors.file.UnsupportedFileTypeError:
  26. raise UnsupportedFileTypeError()
  27. return upload_file, 201
  28. class RemoteFileInfoApi(WebApiResource):
  29. @marshal_with(remote_file_info_fields)
  30. def get(self, url):
  31. decoded_url = urllib.parse.unquote(url)
  32. try:
  33. response = ssrf_proxy.head(decoded_url)
  34. return {
  35. "file_type": response.headers.get("Content-Type", "application/octet-stream"),
  36. "file_length": int(response.headers.get("Content-Length", 0)),
  37. }
  38. except Exception as e:
  39. return {"error": str(e)}, 400
  40. api.add_resource(FileApi, "/files/upload")
  41. api.add_resource(RemoteFileInfoApi, "/remote-files/<path:url>")