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:
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/gochat/gochat/internal/model"
|
||||
"github.com/gochat/gochat/internal/service"
|
||||
"github.com/gochat/gochat/internal/webhookutil"
|
||||
wspkg "github.com/gochat/gochat/internal/ws"
|
||||
)
|
||||
|
||||
@@ -1323,7 +1324,7 @@ func widgetMessagePayload(message model.Message, conversationID uint) gin.H {
|
||||
"conversation_id": conversationID,
|
||||
"message_type": message.MessageType,
|
||||
"content_type": message.ContentType,
|
||||
"content_attributes": message.ContentAttributes,
|
||||
"content_attributes": webhookutil.SanitizeOutboundJSON(message.ContentAttributes),
|
||||
"created_at": message.CreatedAt.Unix(),
|
||||
"private": message.Private,
|
||||
"source_id": message.SourceID,
|
||||
@@ -1513,13 +1514,10 @@ func publicMessagePayload(message model.Message, conversation model.Conversation
|
||||
"content": message.Content,
|
||||
"message_type": message.MessageType,
|
||||
"content_type": message.ContentType,
|
||||
"content_attributes": message.ContentAttributes,
|
||||
"content_attributes": webhookutil.SanitizeOutboundJSON(message.ContentAttributes),
|
||||
"created_at": message.CreatedAt.Unix(),
|
||||
"conversation_id": publicDisplayID(conversation),
|
||||
}
|
||||
if message.SenderID != nil {
|
||||
payload["sender"] = gin.H{"id": *message.SenderID, "type": message.SenderType}
|
||||
}
|
||||
return payload
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user