1. 修复 mention_router 中的 IDOR 越权安全漏洞,加入 thread 归属权校验,定义强类型 Pydantic Schema。 2. 修复 mention_search_service 中 ensure_thread_dirs 的 GET 副作用、空 Query 扫描和 MAX_SEARCH_DEPTH 深度问题,使用标准 Base64 编解码。 3. 增加前端 mention_api.js 参数的安全兜底。 4. 重构 AgentPanel 自动展开策略,彻底解决大仓库克隆时的卡死问题: - 将 fetchThreadFiles 改为 recursive=false 避免递归大目录。 - 重构为只有在发生显性的物理文件写入(用户上传附件成功、用户保存交付件到工作区成功)的回调中才精准触发侧边栏自动展开,完美契合用户心智模型与性能诉求。 5. 精简 roadmap.md 文档,更新相关单元测试。
46 lines
1.7 KiB
Python
46 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from pydantic import BaseModel
|
|
from server.utils.auth_middleware import get_db, get_required_user
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from yuxi.repositories.conversation_repository import ConversationRepository
|
|
from yuxi.services.mention_search_service import search_mention_files_in_index
|
|
from yuxi.storage.postgres.models_business import User
|
|
|
|
mention_router = APIRouter(prefix="/mention", tags=["mention"])
|
|
|
|
|
|
class MentionFileItem(BaseModel):
|
|
"""提及文件搜索结果条目"""
|
|
|
|
name: str
|
|
path: str
|
|
is_dir: bool
|
|
|
|
|
|
@mention_router.get("/search", response_model=list[MentionFileItem])
|
|
async def search_mention_files(
|
|
thread_id: str = Query(..., description="当前聊天会话 ID"),
|
|
query: str = Query("", description="模糊搜索关键字"),
|
|
current_user: User = Depends(get_required_user),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""
|
|
提及文件模糊搜索接口:使用 Redis 二进制缓存进行极速过滤,防止大文件递归卡死。
|
|
调用前校验 thread 归属权,防止 IDOR 越权访问他人会话文件。
|
|
"""
|
|
user_id = str(current_user.id)
|
|
|
|
# NOTE: 校验 thread 归属权,防止恶意用户传入他人 thread_id 遍历文件
|
|
conv_repo = ConversationRepository(db)
|
|
conversation = await conv_repo.get_conversation_by_thread_id(thread_id)
|
|
if not conversation or conversation.user_id != user_id or conversation.status == "deleted":
|
|
raise HTTPException(status_code=404, detail="对话线程不存在")
|
|
|
|
return await search_mention_files_in_index(
|
|
thread_id=thread_id,
|
|
user_id=user_id,
|
|
query=query,
|
|
)
|