H-116: close visitor payload trust boundaries (#19)

* H-116: close visitor payload trust boundaries

* H-129: unblock SQLite backend tests

* H-129: remove stale last-seen response assertions

---------

Co-authored-by: Rogee <rogee@ipao.vip>
This commit is contained in:
Rogee
2026-08-15 01:15:04 +08:00
committed by GitHub
co-authored by rogee
parent 55fac96700
commit 18ecee3e46
9 changed files with 211 additions and 16 deletions
@@ -50,6 +50,29 @@ type recordingWidgetEventPublisher struct {
payload interface{}
}
func TestPublicMessagePayloadSanitizesIdentity(t *testing.T) {
senderID := uint(9)
message := model.Message{
SenderID: &senderID,
SenderType: string(model.SenderTypeAgentBot),
Content: "same reply",
ContentAttributes: datatypes.JSON(`[{"business":"keep","nested":{"sender_name":"Captain","ai_takeover_active":true}}]`),
}
publicPayload := publicMessagePayload(message, model.Conversation{Base: model.Base{ID: 1}})
assert.NotContains(t, publicPayload, "sender")
assert.Equal(t, "same reply", publicPayload["content"])
assert.Equal(t, []any{map[string]any{"business": "keep", "nested": map[string]any{}}}, publicPayload["content_attributes"])
message.SenderType = string(model.SenderTypeUser)
assert.Equal(t, publicPayload, publicMessagePayload(message, model.Conversation{Base: model.Base{ID: 1}}))
widgetPayload := widgetMessagePayload(message, 1)
assert.Equal(t, publicPayload["content_attributes"], widgetPayload["content_attributes"])
message.ContentAttributes = datatypes.JSON(`{"sender_name":`)
assert.Empty(t, publicMessagePayload(message, model.Conversation{})["content_attributes"])
}
func (p *recordingWidgetEventPublisher) PublishWidgetEvent(accountID uint, pubsubToken string, eventType string, payload interface{}) {
p.accountID = accountID
p.pubsubToken = pubsubToken