ymq 1c1ef65931 feat(rag): 机构rags目录+容量检查参数化+KB级角色权限
- 存储: 知识库文件存 {workspace_base}/{org}/rags/{kb}/ (机构目录下开设rags目录)
- 容量: rag_check_storage_quota 参数控制是否检查机构上限(默认不检查)
- 权限: rag_knowledge_bases 加 maintain_roles/search_roles; 空=同机构默认可用
  维护入口(upload/delete/rename/tree/tags)校验maintain; 检索入口(search/file_list/file_serve)校验search
- file_serve.dspy: 下载/预览走校验端点, 堵住/idfile/猜路径越权
- 机构隔离: 跨机构KB一律拒绝
2026-09-02 12:09:16 +08:00

29 lines
1.1 KiB
Plaintext

ns = params_kw.copy()
kb_id = ns.get('kb_id', '')
name = ns.get('name', '').strip()
desc = ns.get('description', '')
if not kb_id or not name:
return json.dumps({"status": "error", "error": "kb_id and name required"}, ensure_ascii=False)
# KB 维护角色校验(机构隔离 + 角色)
from rag.init import check_kb_perm
env = request._run_ns
db = DBPools()
async with db.sqlorContext(get_module_dbname('rag')) as sor:
_ok, _kb, _msg = await check_kb_perm(env, sor, kb_id, 'maintain')
if not _ok:
return json.dumps({"status": "error", "error": _msg}, ensure_ascii=False)
env = request._run_ns
userorgid = await env.get_userorgid()
async with get_sor_context(env, 'rag') as sor:
await sor.sqlExe(
"UPDATE rag_knowledge_bases SET name=${name}$, description=${desc}$, updated_at=NOW() "
"WHERE id=${id}$ AND (org_id=${org_id}$ OR org_id IS NULL)",
{"name": name, "desc": desc, "id": kb_id, "org_id": userorgid})
return json.dumps({"widgettype": "urlwidget",
"options": {"url": entire_url('/rag/knowledge_bases_list/index.ui')}}, ensure_ascii=False)