upload.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from flask import request
  2. from flask_restful import Resource, marshal_with
  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. user_id = request.args.get("user_id")
  23. user = get_user(user_id)
  24. filename = file.filename
  25. mimetype = file.mimetype
  26. if not filename or not mimetype:
  27. raise Forbidden("Invalid request.")
  28. if not timestamp or not nonce or not sign:
  29. raise Forbidden("Invalid request.")
  30. if not verify_plugin_file_signature(
  31. filename=filename,
  32. mimetype=mimetype,
  33. user_id=user_id,
  34. timestamp=timestamp,
  35. nonce=nonce,
  36. sign=sign,
  37. ):
  38. raise Forbidden("Invalid request.")
  39. try:
  40. upload_file = FileService.upload_file(
  41. filename=filename,
  42. content=file.read(),
  43. mimetype=mimetype,
  44. user=user,
  45. source=None,
  46. )
  47. except services.errors.file.FileTooLargeError as file_too_large_error:
  48. raise FileTooLargeError(file_too_large_error.description)
  49. except services.errors.file.UnsupportedFileTypeError:
  50. raise UnsupportedFileTypeError()
  51. return upload_file, 201
  52. api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")