upload.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from flask import request
  2. from flask_restful import Resource, marshal_with # type: ignore
  3. from werkzeug.exceptions import Forbidden
  4. import services
  5. from controllers.console.wraps import setup_required
  6. from controllers.files import api
  7. from controllers.files.error import UnsupportedFileTypeError
  8. from controllers.inner_api.plugin.wraps import get_user
  9. from controllers.service_api.app.error import FileTooLargeError
  10. from core.file.helpers import verify_plugin_file_signature
  11. from fields.file_fields import file_fields
  12. from services.file_service import FileService
  13. class PluginUploadFileApi(Resource):
  14. @setup_required
  15. @marshal_with(file_fields)
  16. def post(self):
  17. # get file from request
  18. file = request.files["file"]
  19. timestamp = request.args.get("timestamp")
  20. nonce = request.args.get("nonce")
  21. sign = request.args.get("sign")
  22. tenant_id = request.args.get("tenant_id")
  23. if not tenant_id:
  24. raise Forbidden("Invalid request.")
  25. user_id = request.args.get("user_id")
  26. user = get_user(tenant_id, user_id)
  27. filename = file.filename
  28. mimetype = file.mimetype
  29. if not filename or not mimetype:
  30. raise Forbidden("Invalid request.")
  31. if not timestamp or not nonce or not sign:
  32. raise Forbidden("Invalid request.")
  33. if not verify_plugin_file_signature(
  34. filename=filename,
  35. mimetype=mimetype,
  36. tenant_id=tenant_id,
  37. user_id=user_id,
  38. timestamp=timestamp,
  39. nonce=nonce,
  40. sign=sign,
  41. ):
  42. raise Forbidden("Invalid request.")
  43. try:
  44. upload_file = FileService.upload_file(
  45. filename=filename,
  46. content=file.read(),
  47. mimetype=mimetype,
  48. user=user,
  49. source=None,
  50. )
  51. except services.errors.file.FileTooLargeError as file_too_large_error:
  52. raise FileTooLargeError(file_too_large_error.description)
  53. except services.errors.file.UnsupportedFileTypeError:
  54. raise UnsupportedFileTypeError()
  55. return upload_file, 201
  56. api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")