refactor: 审计 API 迁移到 app_audit 模块
- 删除 wwwroot/api/audit.dspy(迁移到 app_audit) - work_env.dspy 改 import app_audit.audit_service - load_path.py 移除 audit.dspy 的 owner.audit 注册
This commit is contained in:
parent
4742a67d80
commit
534591e5d5
@ -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__":
|
||||
|
||||
@ -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)
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user