Add files via upload

This commit is contained in:
公明
2026-07-10 16:46:26 +08:00
committed by GitHub
parent 25a76a8c97
commit 0ff8c58fbd
18 changed files with 1461 additions and 122 deletions
+69 -1
View File
@@ -10,6 +10,7 @@ import (
"time"
"cyberstrike-ai/internal/config"
"cyberstrike-ai/internal/security"
"github.com/gin-gonic/gin"
)
@@ -163,6 +164,7 @@ func (h *AgentHandler) ListHITLLogs(c *gin.Context) {
q, args := h.buildHitlListQuery(true)
q, args = h.appendHitlListFilters(q, args, c)
q, args = appendConversationAccessSQL(q, args, "conversation_id", notificationAccessFromContext(c))
total, err := h.countHitlQuery(q, args)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
@@ -207,6 +209,7 @@ func (h *AgentHandler) DeleteHITLLogs(c *gin.Context) {
if request.All {
where, args := h.buildHitlLogsWhere(true)
where, args = h.appendHitlListFilters(where, args, c)
where, args = appendConversationAccessSQL(where, args, "conversation_id", notificationAccessFromContext(c))
deleted, err = h.db.DeleteHitlInterruptLogsMatching(where, args)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
@@ -222,7 +225,12 @@ func (h *AgentHandler) DeleteHITLLogs(c *gin.Context) {
c.JSON(http.StatusBadRequest, gin.H{"error": "审计日志 ID 列表不能为空"})
return
}
deleted, err = h.db.DeleteHitlInterruptLogsByIDs(request.IDs)
ids, filterErr := h.filterAllowedHitlInterruptIDs(c, request.IDs)
if filterErr != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": filterErr.Error()})
return
}
deleted, err = h.db.DeleteHitlInterruptLogsByIDs(ids)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
@@ -259,5 +267,65 @@ func (h *AgentHandler) GetHITLLog(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
if !h.hitlConversationAllowed(c, cid) {
c.JSON(http.StatusForbidden, gin.H{"error": "无权访问该资源"})
return
}
c.JSON(http.StatusOK, hitlInterruptRowToMap(rowID, cid, mode, toolName, toolCallID, payload, rowStatus, decidedBy, messageID, decision, comment, createdAt, decidedAt))
}
func (h *AgentHandler) filterAllowedHitlInterruptIDs(c *gin.Context, ids []string) ([]string, error) {
clean := make([]string, 0, len(ids))
seen := map[string]struct{}{}
for _, id := range ids {
id = strings.TrimSpace(id)
if id == "" {
continue
}
if _, ok := seen[id]; ok {
continue
}
seen[id] = struct{}{}
clean = append(clean, id)
}
if len(clean) == 0 {
return clean, nil
}
query := `SELECT id, conversation_id FROM hitl_interrupts WHERE id IN (` + buildPlaceholders(len(clean)) + `)`
args := make([]interface{}, 0, len(clean))
for _, id := range clean {
args = append(args, id)
}
rows, err := h.db.Query(query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
allowed := make([]string, 0, len(clean))
for rows.Next() {
var id, conversationID string
if err := rows.Scan(&id, &conversationID); err != nil {
continue
}
if h.hitlConversationAllowed(c, conversationID) {
allowed = append(allowed, id)
}
}
return allowed, rows.Err()
}
func (h *AgentHandler) hitlInterruptAllowed(c *gin.Context, interruptID string) bool {
var conversationID string
if err := h.db.QueryRow(`SELECT conversation_id FROM hitl_interrupts WHERE id = ?`, strings.TrimSpace(interruptID)).Scan(&conversationID); err != nil {
return false
}
return h.hitlConversationAllowed(c, conversationID)
}
func (h *AgentHandler) hitlConversationAllowed(c *gin.Context, conversationID string) bool {
session, ok := security.CurrentSession(c)
if !ok {
return false
}
return h.db.UserCanAccessResource(session.UserID, session.Scope, "conversation", conversationID)
}