diff --git a/scripts/load_path.py b/scripts/load_path.py index 49ba229..ceb4501 100644 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -113,11 +113,6 @@ PATHS_LOGINED = [ 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 根目录) @@ -140,7 +135,7 @@ def main(): 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 role, paths in [("any", PATHS_ANY), ("logined", PATHS_LOGINED)]: for path in paths: cmd = [py, set_perm, role, path] r = subprocess.run(cmd, capture_output=True, text=True, cwd=root) @@ -148,7 +143,7 @@ def main(): 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}") + print(f"Registered {count}/{len(PATHS_ANY)+len(PATHS_LOGINED)} paths for {MOD}") if __name__ == "__main__": diff --git a/wwwroot/api/audit.dspy b/wwwroot/api/audit.dspy deleted file mode 100644 index 0ec38e0..0000000 --- a/wwwroot/api/audit.dspy +++ /dev/null @@ -1,71 +0,0 @@ -# audit.dspy - 审计日志 API -# 查看/备份/删除 仅 owner.audit 角色(审计独立性:superuser 也无权访问) -# action: list / backup / delete - -user_id = await get_user() -if not user_id: - return json.dumps({'ok': False, 'error': '未登录'}, ensure_ascii=False) - -action = (params_kw or {}).get('action', 'list') - -from pipeline_service.audit_service import ( - is_audit_role, list_audit_logs, backup_audit_logs, delete_audit_logs, -) - -# 查 username 和 client_ip -username = user_id -try: - async with get_sor_context(request._run_ns, 'pipeline') as _sor: - _u = await _sor.sqlExe("SELECT username FROM users WHERE id=${u}$", {'u': user_id}) - if _u: - username = getattr(_u[0], 'username', user_id) or user_id -except Exception: - pass - -client_ip = '' -try: - client_ip = request.get('client_ip', '') or '' -except Exception: - pass - -# 权限校验:所有 action 仅 owner.audit(superuser 也不行) -async with get_sor_context(request._run_ns, 'pipeline') as _sor: - if not await is_audit_role(_sor, user_id): - return json.dumps({'ok': False, 'error': '仅 owner.audit 角色可访问审计日志'}, ensure_ascii=False) - -if action == 'list': - filters = { - 'user_id': (params_kw or {}).get('user_id', ''), - 'username': (params_kw or {}).get('username', ''), - 'action': (params_kw or {}).get('act', ''), - 'from': (params_kw or {}).get('from', ''), - 'to': (params_kw or {}).get('to', ''), - } - limit = (params_kw or {}).get('limit', 100) - offset = (params_kw or {}).get('offset', 0) - try: - async with get_sor_context(request._run_ns, 'pipeline') as sor: - rows = await list_audit_logs(sor, filters, limit, offset) - return json.dumps({'ok': True, 'logs': rows}, ensure_ascii=False) - except Exception as e: - return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) - -elif action == 'backup': - try: - async with get_sor_context(request._run_ns, 'pipeline') as sor: - r = await backup_audit_logs(sor, user_id, username, None, client_ip) - return json.dumps(r, ensure_ascii=False) - except Exception as e: - return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) - -elif action == 'delete': - before = (params_kw or {}).get('before', '') - try: - async with get_sor_context(request._run_ns, 'pipeline') as sor: - r = await delete_audit_logs(sor, user_id, username, before, client_ip) - return json.dumps(r, ensure_ascii=False) - except Exception as e: - return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) - -else: - return json.dumps({'ok': False, 'error': '未知 action: ' + str(action)}, ensure_ascii=False) diff --git a/wwwroot/api/work_env.dspy b/wwwroot/api/work_env.dspy index 52d5cde..38c2f15 100644 --- a/wwwroot/api/work_env.dspy +++ b/wwwroot/api/work_env.dspy @@ -11,7 +11,7 @@ from pipeline_service.work_env import ( get_work_env, set_work_env, ensure_remote_bwrap, get_org_pubkey, ) from pipeline_service.deploy_account import account_name_for, sanitize_username -from pipeline_service.audit_service import audit_log +from app_audit.audit_service import audit_log client_ip = '' try: