+10









-LAN-
GitHub
twwu
crazywoola
jyong
Wu Tianwei
QuantumGhost
lyzno1
quicksand
Jyong
lyzno1
zxhlyh
Yongtao Huang
autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Joel
Copilot
nite-knite
Hanqing Zhao
gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Harry
85cda47c70
Signed-off-by: -LAN- <[email protected]> Co-authored-by: twwu <[email protected]> Co-authored-by: crazywoola <[email protected]> Co-authored-by: jyong <[email protected]> Co-authored-by: Wu Tianwei <[email protected]> Co-authored-by: QuantumGhost <[email protected]> Co-authored-by: lyzno1 <[email protected]> Co-authored-by: quicksand <[email protected]> Co-authored-by: Jyong <[email protected]> Co-authored-by: lyzno1 <[email protected]> Co-authored-by: zxhlyh <[email protected]> Co-authored-by: Yongtao Huang <[email protected]> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Joel <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: nite-knite <[email protected]> Co-authored-by: Hanqing Zhao <[email protected]> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Harry <[email protected]>
56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
from urllib.parse import quote
|
|
|
|
from flask import Response
|
|
from flask_restx import Resource, reqparse
|
|
from werkzeug.exceptions import Forbidden, NotFound
|
|
|
|
from controllers.common.errors import UnsupportedFileTypeError
|
|
from controllers.files import files_ns
|
|
from core.tools.signature import verify_tool_file_signature
|
|
from core.tools.tool_file_manager import ToolFileManager
|
|
from extensions.ext_database import db as global_db
|
|
|
|
|
|
@files_ns.route("/tools/<uuid:file_id>.<string:extension>")
|
|
class ToolFileApi(Resource):
|
|
def get(self, file_id, extension):
|
|
file_id = str(file_id)
|
|
|
|
parser = reqparse.RequestParser()
|
|
|
|
parser.add_argument("timestamp", type=str, required=True, location="args")
|
|
parser.add_argument("nonce", type=str, required=True, location="args")
|
|
parser.add_argument("sign", type=str, required=True, location="args")
|
|
parser.add_argument("as_attachment", type=bool, required=False, default=False, location="args")
|
|
|
|
args = parser.parse_args()
|
|
if not verify_tool_file_signature(
|
|
file_id=file_id, timestamp=args["timestamp"], nonce=args["nonce"], sign=args["sign"]
|
|
):
|
|
raise Forbidden("Invalid request.")
|
|
|
|
try:
|
|
tool_file_manager = ToolFileManager(engine=global_db.engine)
|
|
stream, tool_file = tool_file_manager.get_file_generator_by_tool_file_id(
|
|
file_id,
|
|
)
|
|
|
|
if not stream or not tool_file:
|
|
raise NotFound("file is not found")
|
|
except Exception:
|
|
raise UnsupportedFileTypeError()
|
|
|
|
response = Response(
|
|
stream,
|
|
mimetype=tool_file.mimetype,
|
|
direct_passthrough=True,
|
|
headers={},
|
|
)
|
|
if tool_file.size > 0:
|
|
response.headers["Content-Length"] = str(tool_file.size)
|
|
if args["as_attachment"]:
|
|
encoded_filename = quote(tool_file.name)
|
|
response.headers["Content-Disposition"] = f"attachment; filename*=UTF-8''{encoded_filename}"
|
|
|
|
return response
|