Files
AstrBot/astrbot/dashboard/services/static_file_service.py
Weilong Liao 0d8e8682db refactor(core): migrate backend backbone from Quart to FastAPI and introduce more OpenAPI (#8688)
* 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
2026-06-14 15:03:26 +08:00

71 lines
2.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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