From 402dfb0d5a4795ddd2bc919506cbd1d8f9fb7ddc Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Mon, 7 Sep 2026 21:52:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=BE=A4=E8=81=8A?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/auth_audit_test.go | 19 +++++++++++++++++++ server/internal_admin_query_resources.go | 14 +++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/server/auth_audit_test.go b/server/auth_audit_test.go index 183cf76..928d252 100644 --- a/server/auth_audit_test.go +++ b/server/auth_audit_test.go @@ -2,6 +2,8 @@ package main import ( "errors" + "net/http/httptest" + "reflect" "strings" "testing" @@ -75,6 +77,23 @@ func TestMessageQuerySpecsExposeAdminFields(t *testing.T) { } } +func TestGroupMessageQuerySupportsOperationalFilters(t *testing.T) { + req := httptest.NewRequest("GET", "/?seq_id=42&sender_username=alice&sender_nickname=%E5%B0%8F%E6%98%8E&group_name=%E6%B5%8B%E8%AF%95%E7%BE%A4", nil) + query, _, args, _, _, err := buildInternalAdminListQuery(req, groupMessagesInternalQuerySpec(), "") + if err != nil { + t.Fatal(err) + } + for _, clause := range []string{"m.seqid = ?", "u.username LIKE ?", "p.nickname LIKE ?", "gs.name LIKE ?"} { + if !strings.Contains(query, clause) { + t.Errorf("group message query missing %q: %s", clause, query) + } + } + want := []any{int64(42), "%alice%", "%小明%", "%测试群%"} + if !reflect.DeepEqual(args, want) { + t.Fatalf("unexpected filter arguments: got %#v, want %#v", args, want) + } +} + func TestRedactClientMessageForLog(t *testing.T) { raw := []byte(`{"login":{"id":"1","scheme":"basic","secret":"YWxpY2U6YWxpY2UxMjM="},"acc":{"secret":"account-secret","tmpsecret":"temp-secret"}}`) redacted := string(redactClientMessageForLog(raw)) diff --git a/server/internal_admin_query_resources.go b/server/internal_admin_query_resources.go index df34ea5..b9aa00e 100644 --- a/server/internal_admin_query_resources.go +++ b/server/internal_admin_query_resources.go @@ -330,7 +330,19 @@ func groupMessagesInternalQuerySpec() *internalQuerySpec { LEFT JOIN im_group_settings AS gs ON gs.topic=m.topic COLLATE utf8mb4_0900_ai_ci LEFT JOIN im_message_admin_actions AS aa ON aa.id=(SELECT MAX(a2.id) FROM im_message_admin_actions AS a2 WHERE a2.conversation_type='group' AND a2.topic=m.topic COLLATE utf8mb4_0900_ai_ci AND a2.seqid=m.seqid AND a2.action_status='success')`, DefaultSort: "ORDER BY m.id DESC", - Filters: []internalQueryFilter{{"topic", "m.topic", "LIKE", "string"}, {"sender_user_id", "m.from_user", "=", "uid"}, {"content_type", contentType, "=", "string"}, {"status", status, "=", "string"}, {"keyword", "CAST(m.content AS CHAR)", "LIKE", "string"}, {"created_at_start", "m.created_at", ">=", "time"}, {"created_at_end", "m.created_at", "<=", "time"}}, + Filters: []internalQueryFilter{ + {"topic", "m.topic", "LIKE", "string"}, + {"seq_id", "m.seqid", "=", "int"}, + {"sender_user_id", "m.from_user", "=", "uid"}, + {"sender_username", "u.username", "LIKE", "string"}, + {"sender_nickname", "p.nickname", "LIKE", "string"}, + {"group_name", "gs.name", "LIKE", "string"}, + {"content_type", contentType, "=", "string"}, + {"status", status, "=", "string"}, + {"keyword", "CAST(m.content AS CHAR)", "LIKE", "string"}, + {"created_at_start", "m.created_at", ">=", "time"}, + {"created_at_end", "m.created_at", "<=", "time"}, + }, } }