From e62320b7323e7f5ee5be6855ca59d8a65edbdb1d Mon Sep 17 00:00:00 2001 From: p Date: Thu, 13 Aug 2026 17:49:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20RBAC=20perm=20init=20into=20build.sh=20?= =?UTF-8?q?=E2=80=94=20set=5Frole=5Fperm=20pipeline=20schema=20+=20load=5F?= =?UTF-8?q?path.sh=20venv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 8 ++++++++ load_path.sh | 10 +++++++--- set_role_perm.py | 36 ++++++++++++++++-------------------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/build.sh b/build.sh index ad07605..976788a 100644 --- a/build.sh +++ b/build.sh @@ -116,5 +116,13 @@ for d in sd_projects sd_iterations; do done +# 11. Initialize RBAC path permissions (all modules' scripts/load_path.py) +echo "=== RBAC permission init ===" +if [ -f "$cdir/load_path.sh" ]; then + bash "$cdir/load_path.sh" || echo " WARN: load_path.sh failed (DB not ready?)" +else + echo " WARN: load_path.sh not found" +fi + chmod +x "$cdir/start.sh" "$cdir/stop.sh" 2>/dev/null || true echo "=== Build complete ===" diff --git a/load_path.sh b/load_path.sh index ac3c4a9..0861b83 100644 --- a/load_path.sh +++ b/load_path.sh @@ -1,5 +1,9 @@ -for s in $(ls ls pkgs/*/scripts/load_path.py) +#!/usr/bin/env bash +# 初始化所有模块的 RBAC 路径权限(调用各模块 scripts/load_path.py) +set -e +cdir=$(cd "$(dirname "$0")" && pwd) +for s in $(ls "$cdir"/pkgs/*/scripts/load_path.py 2>/dev/null) do - echo $s - python $s + echo "==> $s" + "$cdir/py3/bin/python" "$s" done diff --git a/set_role_perm.py b/set_role_perm.py index 1a4097f..71531b8 100644 --- a/set_role_perm.py +++ b/set_role_perm.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 """ Register a single RBAC permission for pipeline modules. -Called by init_perms.py or directly. +Called by load_path.py or directly. Usage: python set_role_perm.py - python set_role_perm.py admin /pipeline_core/pipelines/*.dspy + python set_role_perm.py logined /pipeline-sdlc/workspace_edit.xterm """ import sys, os, asyncio @@ -23,40 +23,36 @@ from ahserver.globalEnv import initEnv async def main(role, path): - config = getConfig(os.path.join(ROOT_DIR, 'conf', 'config.json'), + config = getConfig(ROOT_DIR, NS={'workdir': ROOT_DIR, 'ProgramPath': ProgramPath()}) DBPools(config.databases) initEnv() env = ServerEnv() env.get_module_dbname = lambda m: 'pipeline' if 'pipeline' in m else 'sage' - # Determine module from path - parts = path.strip('/').split('/') - module = parts[0] if parts else 'app' + # pipeline RBAC schema: permission (id, path) + rolepermission (roleid, permid) + async with DBPools().sqlorContext('pipeline') as sor: + recs = await sor.R('permission', {'path': path}) + if not recs: + permid = getID() + await sor.C('permission', {'id': permid, 'path': path}) + else: + permid = recs[0].id - async with DBPools().sqlorContext('sage') as sor: - existing = await sor.sqlExe( - "SELECT id FROM role_path WHERE module=${m}$ AND path=${p}$ AND role_name=${r}$", - {'m': module, 'p': path, 'r': role}) - if existing: + rp = await sor.R('rolepermission', {'roleid': role, 'permid': permid}) + if rp: print(f'Permission exists: {role} {path}') return - await sor.C('role_path', { - 'id': getID(), - 'module': module, - 'path': path, - 'role_name': role, - 'description': f'Auto-registered: {role} -> {path}' - }) + await sor.C('rolepermission', {'id': getID(), 'roleid': role, 'permid': permid}) print(f'Registered: {role} -> {path}') if __name__ == '__main__': if len(sys.argv) != 3: print(f"Usage: {sys.argv[0]} ") - print(f" roles: guest, logined, admin") - print(f" path example: /pipeline_core/index.ui") + print(f" roles: any, anonymous, logined, admin, owner.superuser ...") + print(f" path example: /pipeline-sdlc/workspace_edit.xterm") sys.exit(1) asyncio.run(main(sys.argv[1], sys.argv[2]))