mirror of
https://github.com/AstrBotDevs/AstrBot
synced 2026-07-16 17:47:06 +08:00
* refactor: migrate to fastapi * structure refactor * fix: pyright fix * refactor: improve error handling and public messages in plugin services * feat(api): refactor API client integration and enhance request handling - Updated API client configuration to use a dedicated HTTP client. - Introduced utility functions for generating options, queries, and form data for API requests. - Refactored multiple API methods to utilize the new utility functions for improved consistency and readability. - Renamed types for clarity and updated import statements accordingly. feat(docs): add script to update OpenAPI JSON from YAML spec - Created a Python script to convert OpenAPI YAML specification to JSON format. - The script supports customizable input and output paths. - Ensured the script handles directory creation for output paths and validates the YAML structure. * fix * feat(auth): implement rate limiting for v1 login endpoint and enhance request handling * Refactor dashboard API routers to use legacy_router for backward compatibility - Changed all instances of dashboard_router to legacy_router across multiple API modules including platform, plugins, providers, sessions, skills, stats, subagents, t2i, tools, updates, and asgi_runtime. - Updated route definitions to ensure existing endpoints remain functional under the new router structure. - Introduced support for Quart request context in asgi_runtime to enhance compatibility with existing Quart-based plugins. - Added a test case to validate the functionality of the new Quart request context handling in plugin extensions. * chore: remove cli test * fix: update dashboard tests for fastapi migration * chore: satisfy ruff checks * fix: update openapi api key scopes * fix: sync config scope chip selection * fix: restore quart dependency * docs: clarify quart plugin api compatibility * docs: update openapi scope documentation * fix: use singular skill openapi scope * fix: hide update service exception details * fix: address fastapi review comments * fix: address dashboard review findings * docs: revert unrelated package deployment changes * docs: update agent api generation guidance * feat: add plugin page web api helpers * docs: add plugin page bridge demo * fix: type plugin upload files * fix: stabilize plugin page uploads * fix: type plugin web request proxy * docs: remove plugin page docs example * fix: authenticate plugin page SSE bridge
71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
from __future__ import annotations
|
||
|
||
from pathlib import Path
|
||
|
||
|
||
class StaticFileService:
|
||
INDEX_ROUTES = (
|
||
"/",
|
||
"/auth/login",
|
||
"/config",
|
||
"/logs",
|
||
"/extension",
|
||
"/dashboard/default",
|
||
"/alkaid",
|
||
"/alkaid/knowledge-base",
|
||
"/alkaid/long-term-memory",
|
||
"/alkaid/other",
|
||
"/console",
|
||
"/chat",
|
||
"/settings",
|
||
"/platforms",
|
||
"/providers",
|
||
"/about",
|
||
"/extension-marketplace",
|
||
"/conversation",
|
||
"/tool-use",
|
||
)
|
||
NOT_FOUND_MESSAGE = (
|
||
"404 Not found。如果你初次使用打开面板发现 404, 请参考文档: "
|
||
"https://docs.astrbot.app/faq.html。如果你正在测试回调地址可达性,"
|
||
"显示这段文字说明测试成功了。"
|
||
)
|
||
|
||
def list_index_routes(self) -> tuple[str, ...]:
|
||
return self.INDEX_ROUTES
|
||
|
||
def get_not_found_message(self) -> str:
|
||
return self.NOT_FOUND_MESSAGE
|
||
|
||
def resolve_index_file(self, static_folder: str | Path | None) -> Path | None:
|
||
if not static_folder:
|
||
return None
|
||
index_file = Path(static_folder) / "index.html"
|
||
if index_file.is_file():
|
||
return index_file
|
||
return None
|
||
|
||
def resolve_static_file(
|
||
self,
|
||
static_folder: str | Path | None,
|
||
requested_path: str,
|
||
) -> Path | None:
|
||
if not static_folder or not requested_path:
|
||
return None
|
||
if requested_path.startswith("api/"):
|
||
return None
|
||
path_parts = requested_path.replace("\\", "/").split("/")
|
||
if requested_path.startswith(("/", "\\")) or ".." in path_parts:
|
||
return None
|
||
|
||
static_root = Path(static_folder).resolve()
|
||
target_file = (static_root / requested_path).resolve()
|
||
try:
|
||
target_file.relative_to(static_root)
|
||
except ValueError:
|
||
return None
|
||
|
||
if target_file.is_file():
|
||
return target_file
|
||
return None
|