#!/usr/bin/env python3 """RBAC path registration for pipeline-sdlc module.""" import os, sys, subprocess MOD = "pipeline-sdlc" PATHS_ANY = [ f"/{MOD}/index.ui", ] PATHS_LOGINED = [ f"/{MOD}", # Dashboard f"/{MOD}/sd_dashboard/index.ui", f"/{MOD}/sd_dashboard/dashboard_data.dspy", # Projects f"/{MOD}/sd_projects/index.ui", f"/{MOD}/sd_projects/get_sd_projects.dspy", f"/{MOD}/sd_projects/add_sd_projects.dspy", f"/{MOD}/sd_projects/update_sd_projects.dspy", f"/{MOD}/sd_projects/delete_sd_projects.dspy", f"/{MOD}/sd_project_list/index.ui", # Iterations f"/{MOD}/sd_iterations/index.ui", f"/{MOD}/sd_iterations/get_sd_iterations.dspy", f"/{MOD}/sd_iterations/add_sd_iterations.dspy", f"/{MOD}/sd_iterations/update_sd_iterations.dspy", f"/{MOD}/sd_iterations/delete_sd_iterations.dspy", f"/{MOD}/sd_iteration_list/index.ui", # Test Plans f"/{MOD}/sd_test_plans/index.ui", f"/{MOD}/sd_test_plans/get_sd_test_plans.dspy", f"/{MOD}/sd_test_plans/add_sd_test_plans.dspy", f"/{MOD}/sd_test_plans/update_sd_test_plans.dspy", f"/{MOD}/sd_test_plans/delete_sd_test_plans.dspy", f"/{MOD}/sd_test_plan_list/index.ui", # Test Cases f"/{MOD}/sd_test_cases/index.ui", f"/{MOD}/sd_test_cases/get_sd_test_cases.dspy", f"/{MOD}/sd_test_cases/add_sd_test_cases.dspy", f"/{MOD}/sd_test_cases/update_sd_test_cases.dspy", f"/{MOD}/sd_test_cases/delete_sd_test_cases.dspy", f"/{MOD}/sd_test_case_list/index.ui", # Bugs f"/{MOD}/sd_bugs/index.ui", f"/{MOD}/sd_bugs/get_sd_bugs.dspy", f"/{MOD}/sd_bugs/add_sd_bugs.dspy", f"/{MOD}/sd_bugs/update_sd_bugs.dspy", f"/{MOD}/sd_bugs/delete_sd_bugs.dspy", f"/{MOD}/sd_bug_list/index.ui", # Deploy Envs f"/{MOD}/sd_deploy_envs/index.ui", f"/{MOD}/sd_deploy_envs/get_sd_deploy_envs.dspy", f"/{MOD}/sd_deploy_envs/add_sd_deploy_envs.dspy", f"/{MOD}/sd_deploy_envs/update_sd_deploy_envs.dspy", f"/{MOD}/sd_deploy_envs/delete_sd_deploy_envs.dspy", f"/{MOD}/sd_deploy_env_list/index.ui", # Review f"/{MOD}/sd_review/index.ui", # API f"/{MOD}/api/bug_close.dspy", f"/{MOD}/api/bug_confirm.dspy", f"/{MOD}/api/check_iteration_bugs.dspy", f"/{MOD}/api/env_verify.dspy", f"/{MOD}/api/get_iteration_options.dspy", f"/{MOD}/api/get_project_options.dspy", f"/{MOD}/api/get_test_plan_options.dspy", f"/{MOD}/api/submit_bug.dspy", f"/{MOD}/api/sd_bug_create.dspy", f"/{MOD}/api/sd_bug_update.dspy", f"/{MOD}/api/sd_bug_delete.dspy", f"/{MOD}/api/sd_case_create.dspy", f"/{MOD}/api/sd_case_update.dspy", f"/{MOD}/api/sd_case_delete.dspy", f"/{MOD}/api/sd_env_create.dspy", f"/{MOD}/api/sd_env_update.dspy", f"/{MOD}/api/sd_env_delete.dspy", f"/{MOD}/api/sd_iter_create.dspy", f"/{MOD}/api/sd_iter_update.dspy", f"/{MOD}/api/sd_iter_delete.dspy", f"/{MOD}/api/sd_plan_create.dspy", f"/{MOD}/api/sd_plan_update.dspy", f"/{MOD}/api/sd_plan_delete.dspy", f"/{MOD}/api/sd_proj_create.dspy", f"/{MOD}/api/sd_proj_update.dspy", f"/{MOD}/api/sd_proj_delete.dspy", # Search data sources f"/{MOD}/api/get_search_bug_status.dspy", f"/{MOD}/api/get_search_case_status.dspy", f"/{MOD}/api/get_search_case_type.dspy", f"/{MOD}/api/get_search_env_status.dspy", f"/{MOD}/api/get_search_env_type.dspy", f"/{MOD}/api/get_search_iteration_status.dspy", f"/{MOD}/api/get_search_iteration_type.dspy", f"/{MOD}/api/get_search_plan_status.dspy", f"/{MOD}/api/get_search_plan_type.dspy", f"/{MOD}/api/get_search_priority.dspy", f"/{MOD}/api/get_search_project_type.dspy", f"/{MOD}/api/get_search_reporter_type.dspy", f"/{MOD}/api/get_search_severity.dspy", f"/{MOD}/api/get_search_status.dspy", # Workspace 文件浏览/编辑 f"/{MOD}/api/workspace_tree.dspy", f"/{MOD}/api/workspace_files.dspy", f"/{MOD}/api/workspace_open.dspy", f"/{MOD}/api/workspace_file.dspy", f"/{MOD}/api/workspace_upload.dspy", f"/{MOD}/api/workspace_delete.dspy", f"/{MOD}/api/workspace_popup.dspy", f"/{MOD}/workspace_edit.xterm", # 工作环境 / 部署账号(普通用户可用) f"/{MOD}/api/work_env.dspy", f"/{MOD}/api/deploy_account.dspy", ] # 审计日志 API:仅 owner.audit 角色(审计独立性,superuser 也不给) PATHS_AUDIT = [ f"/{MOD}/api/audit.dspy", ] def find_app_root(): # 从 scripts/ 向上逐层查找 set_role_perm.py(位于 pipeline-app 根目录) d = os.path.dirname(os.path.abspath(__file__)) for _ in range(6): if os.path.isfile(os.path.join(d, "set_role_perm.py")): return d parent = os.path.dirname(d) if parent == d: break d = parent return None def main(): root = find_app_root() if not root: print("ERROR: pipeline root not found") sys.exit(1) set_perm = os.path.join(root, "set_role_perm.py") py = sys.executable count = 0 for role, paths in [("any", PATHS_ANY), ("logined", PATHS_LOGINED), ("owner.audit", PATHS_AUDIT)]: for path in paths: cmd = [py, set_perm, role, path] r = subprocess.run(cmd, capture_output=True, text=True, cwd=root) if r.returncode == 0: count += 1 else: print(f" WARN: {path} -> {r.stderr.strip()[-80:]}") print(f"Registered {count}/{len(PATHS_ANY)+len(PATHS_LOGINED)+len(PATHS_AUDIT)} paths for {MOD}") if __name__ == "__main__": main()