| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  | from mimetypes import guess_extension | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | from flask import request | 
					
						
							| 
									
										
										
										
											2025-05-06 11:58:49 +08:00
										 |  |  | from flask_restful import Resource, marshal_with | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  | from core.tools.tool_file_manager import ToolFileManager | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | from fields.file_fields import file_fields | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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: | 
					
						
							| 
									
										
										
										
											2025-04-30 17:28:02 +08:00
										 |  |  |             tool_file = ToolFileManager().create_file_by_raw( | 
					
						
							| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  |                 user_id=user.id, | 
					
						
							|  |  |  |                 tenant_id=tenant_id, | 
					
						
							|  |  |  |                 file_binary=file.read(), | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                 mimetype=mimetype, | 
					
						
							| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  |                 filename=filename, | 
					
						
							|  |  |  |                 conversation_id=None, | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             extension = guess_extension(tool_file.mimetype) or ".bin" | 
					
						
							|  |  |  |             preview_url = ToolFileManager.sign_file(tool_file_id=tool_file.id, extension=extension) | 
					
						
							| 
									
										
										
										
											2025-05-21 15:38:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # Create a dictionary with all the necessary attributes | 
					
						
							|  |  |  |             result = { | 
					
						
							|  |  |  |                 "id": tool_file.id, | 
					
						
							|  |  |  |                 "user_id": tool_file.user_id, | 
					
						
							|  |  |  |                 "tenant_id": tool_file.tenant_id, | 
					
						
							|  |  |  |                 "conversation_id": tool_file.conversation_id, | 
					
						
							|  |  |  |                 "file_key": tool_file.file_key, | 
					
						
							|  |  |  |                 "mimetype": tool_file.mimetype, | 
					
						
							|  |  |  |                 "original_url": tool_file.original_url, | 
					
						
							|  |  |  |                 "name": tool_file.name, | 
					
						
							|  |  |  |                 "size": tool_file.size, | 
					
						
							|  |  |  |                 "mime_type": mimetype, | 
					
						
							|  |  |  |                 "extension": extension, | 
					
						
							|  |  |  |                 "preview_url": preview_url, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return result, 201 | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |         except services.errors.file.FileTooLargeError as file_too_large_error: | 
					
						
							|  |  |  |             raise FileTooLargeError(file_too_large_error.description) | 
					
						
							|  |  |  |         except services.errors.file.UnsupportedFileTypeError: | 
					
						
							|  |  |  |             raise UnsupportedFileTypeError() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-22 13:05:42 +08:00
										 |  |  |         return tool_file, 201 | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | api.add_resource(PluginUploadFileApi, "/files/upload/for-plugin") |