123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- from flask import request
- from flask_restful import Resource, marshal_with # type: ignore
- from werkzeug.exceptions import Forbidden
- import services
- from controllers.console.wraps import setup_required
- from controllers.files import api
- from controllers.files.error import UnsupportedFileTypeError
- from controllers.inner_api.plugin.wraps import get_user
- from controllers.service_api.app.error import FileTooLargeError
- from core.file.helpers import verify_plugin_file_signature
- from fields.file_fields import file_fields
- from services.file_service import FileService
- class PluginUploadFileApi(Resource):
- @setup_required
- @marshal_with(file_fields)
- def post(self):
- # get file from request
- file = request.files["file"]
- timestamp = request.args.get("timestamp")
- nonce = request.args.get("nonce")
- sign = request.args.get("sign")
- tenant_id = request.args.get("tenant_id")
- if not tenant_id:
- raise Forbidden("Invalid request.")
- user_id = request.args.get("user_id")
- user = get_user(tenant_id, user_id)
- filename = file.filename
- mimetype = file.mimetype
- if not filename or not mimetype:
- raise Forbidden("Invalid request.")
- if not timestamp or not nonce or not sign:
- raise Forbidden("Invalid request.")
- if not verify_plugin_file_signature(
- filename=filename,
- mimetype=mimetype,
- tenant_id=tenant_id,
- user_id=user_id,
- timestamp=timestamp,
- nonce=nonce,
- sign=sign,
- ):
- raise Forbidden("Invalid request.")
- try:
- upload_file = FileService.upload_file(
- filename=filename,
- content=file.read(),
- mimetype=mimetype,
- user=user,
- source=None,
- )
- except services.errors.file.FileTooLargeError as file_too_large_error:
- raise FileTooLargeError(file_too_large_error.description)
- except services.errors.file.UnsupportedFileTypeError:
- raise UnsupportedFileTypeError()
- return upload_file, 201
- api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin")
|