Skip to content

fix(audit): enhance SQL audit middleware to utilize session context from streamExecute requests#623

Merged
iwanghc merged 1 commit into
mainfrom
fix-odc-audit
May 21, 2026
Merged

fix(audit): enhance SQL audit middleware to utilize session context from streamExecute requests#623
iwanghc merged 1 commit into
mainfrom
fix-odc-audit

Conversation

@LordofAvernus
Copy link
Copy Markdown
Collaborator

@LordofAvernus LordofAvernus commented May 20, 2026

User description

What this PR does

Fix DMS ODC SQL Workbench 审核中间件三处缺陷,详见 #622

缺陷与修复

  1. 未启用审核反向阻塞 SQL 执行
    AuditMiddleware 在数据源未启用 SQL 审核时返回 SqlWorkbenchAuditNotEnabledErr,把审核辅助能力变成主链路硬依赖。
    → 改为 next(c) 放行,由 ODC 执行 SQL。

  2. SQLE 审核缺少 schema 上下文
    callSQLEAudit 未透传 SchemaName,依赖 schema 的规则会误报/漏报。
    → 函数签名增加 schemaName 参数,写入 AuditSQLReq.SchemaName

  3. sid 解析不完整且会误切 :did:
    LastIndex(":d") 会把 sid:xxx:did:123 也按 :d 截断;仅识别纯 base64 JSON 一种形态。
    → 与 ODC pathUtil.generateDatabaseSid 对齐,按三态顺序解析:

    • :did:{dbId} 优先匹配(包含 :d: 子串)
    • :d:{urlEncodedDbName} 次之,做 url.QueryUnescape
    • 回退到纯 base64 JSON
      → 引入结构体 streamExecuteSidInfo{datasourceID, schemaName, dbID} 替代裸字符串返回。
      → 新增 getODCDatabaseName:仅给 dbID 时,透传 ODC Session/XSRF Cookie 调 GET /api/v2/database/databases/{id} 反查库名。

影响范围

  • 仅作用于 ODC streamExecute 请求的审核辅助路径
  • SQLE 侧 AuditSQLReq.SchemaName 字段早已存在,DMS 透传后即生效,无需 SQLE 同步升级
  • 行为变更:未启用审核的数据源在 ODC SQL 工作台从阻塞变为放行(行为纠正)
  • 新增对 ODC /api/v2/database/databases/{id} 的调用,失败时仅降级,不影响 SQL 执行

Related Issue

Closes #622

同步修复

本 PR 入 main;另起一份 PR 同步到 release-4.2601.x


Description

  • 修复审核中间件未启用审核时阻塞 SQL 执行问题

  • 增强 sid 解析,支持 :d: 与 :did: 格式

  • 新增 schemaName 获取并透传至 SQL 审核接口

  • 优化错误处理,避免因解析失败阻塞主流程


Diagram Walkthrough

flowchart LR
  A["AuditMiddleware"]
  B["parseStreamExecuteRequest"]
  C["parseStreamExecuteSid"]
  D["getODCDatabaseName"]
  E["callSQLEAudit"]
  A -- "调用解析" --> B
  B -- "解析 sid" --> C
  C -- "返回 sidInfo" --> A
  A -- "schema为空且dbID>0" --> D
  D -- "获取 schemaName" --> E
  A -- "调用审核接口" --> E
Loading

File Walkthrough

Relevant files
Bug fix
sql_workbench_service.go
修改审核中间件和 sid 解析逻辑                                                                               

internal/sql_workbench/service/sql_workbench_service.go

  • 修改 AuditMiddleware 直接放行未启用审核情形
  • 重构 parseStreamExecuteRequest 返回 sidInfo 结构体
  • 新增 parseStreamExecuteSid 与 fillStreamExecuteSidFromBase64 解析 sid
  • 调整 callSQLEAudit 增加 schemaName 参数及调用 getODCDatabaseName
+111/-45

…ext from streamExecute requests and improve error handling
@actiontech-bot actiontech-bot requested a review from iwanghc May 20, 2026 07:06
@github-actions
Copy link
Copy Markdown

PR Reviewer Guide 🔍

🎫 Ticket compliance analysis ✅

622 - Fully compliant

Compliant requirements:

  • 未启用审核时直接调用 next(c)
  • 函数 callSQLEAudit 新增 schemaName 参数,写入审核请求
  • parseStreamExecuteSid 按优先顺序解析 sid
⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

错误提示不一致

在解析 sid 的过程中,当处理 :did: 形态时,错误信息中出现了 "sibd" 这一拼写错误,可能会对问题排查造成困扰。建议统一为 "sid" 的拼写。

dbID, err := strconv.Atoi(dbPart)
if err != nil {
	return nil, fmt.Errorf("invalid database id in sibd: %v", err)
}
info.dbID = dbID

@github-actions
Copy link
Copy Markdown

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
统一错误处理和修正提示

建议统一在 parseStreamExecuteSid 方法中对 fillStreamExecuteSidFromBase64
的返回错误进行处理。若解析失败,应立即返回错误而不是仅记录调试信息,以防止后续逻辑使用错误的 sid 信息。同时将错误提示中的 "sibd" 修改为
"sid",使错误信息更加准确。

internal/sql_workbench/service/sql_workbench_service.go [1177-1188]

 if didMarker := strings.LastIndex(rest, ":did:"); didMarker != -1 {
     dbPart := rest[didMarker+5:]
     prefix := rest[:didMarker]
     dbID, err := strconv.Atoi(dbPart)
     if err != nil {
-        return nil, fmt.Errorf("invalid database id in sibd: %v", err)
+        return nil, fmt.Errorf("invalid database id in sid: %v", err)
     }
     info.dbID = dbID
     if err := sqlWorkbenchService.fillStreamExecuteSidFromBase64(prefix, info); err != nil {
-        sqlWorkbenchService.log.Debugf("sid prefix is not base64 session JSON, skip: %v", err)
+        return nil, fmt.Errorf("failed to parse sid prefix: %v", err)
     }
     return info, nil
 }
Suggestion importance[1-10]: 8

__

Why: This suggestion improves error handling in the parseStreamExecuteSid function by returning the error immediately instead of only logging it, and it fixes the typo in the error message from "sibd" to "sid", enhancing both robustness and clarity.

Medium
统一错误处理及错误提示

同样建议在 :d: 分支中对 fillStreamExecuteSidFromBase64 的错误进行一致处理。若 base64
解析失败,应返回错误而避免继续处理,从而减少潜在的逻辑异常,并确保错误提示信息准确无误。

internal/sql_workbench/service/sql_workbench_service.go [1190-1202]

 if dMarker := strings.LastIndex(rest, ":d:"); dMarker != -1 {
     dbPart := rest[dMarker+3:]
     prefix := rest[:dMarker]
     schemaName, err := url.QueryUnescape(dbPart)
     if err != nil {
         return nil, fmt.Errorf("failed to decode database name from sid: %v", err)
     }
     info.schemaName = schemaName
     if err := sqlWorkbenchService.fillStreamExecuteSidFromBase64(prefix, info); err != nil {
-        sqlWorkbenchService.log.Debugf("sid prefix is not base64 session JSON, skip: %v", err)
+        return nil, fmt.Errorf("failed to parse sid prefix: %v", err)
     }
     return info, nil
 }
Suggestion importance[1-10]: 8

__

Why: The suggestion enforces consistent error handling in the :d: branch by returning an error upon failure of fillStreamExecuteSidFromBase64, ensuring proper propagation of issues and avoiding potential logical errors.

Medium

@iwanghc iwanghc merged commit 56c52cf into main May 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ODC] SQL 工作台审核中间件存在 schema 上下文缺失与未启用审核时阻塞执行问题

2 participants