This commit is contained in:
binwiederhier 2024-03-22 22:01:41 -04:00
parent a04f2f9c9a
commit b9c176ddba
4 changed files with 81 additions and 70 deletions

View file

@ -135,6 +135,7 @@ const (
unifiedPushTopicPrefix = "up" // Temporarily, we rate limit all "up*" topics based on the subscriber
unifiedPushTopicLength = 14 // Length of UnifiedPush topics, including the "up" part
messagesHistoryMax = 10 // Number of message count values to keep in memory
templateMaxExecutionTime = 100 * time.Millisecond
)
// WebSocket constants
@ -1102,34 +1103,30 @@ func (s *Server) handleBodyAsTemplatedTextMessage(m *message, body *util.PeekedR
return errHTTPEntityTooLargeJSONBody
}
peekedBody := strings.TrimSpace(string(body.PeekedBytes))
m.Message = replaceTemplate(m.Message, peekedBody)
m.Title = replaceTemplate(m.Title, peekedBody)
if m.Message, err = replaceTemplate(m.Message, peekedBody); err != nil {
return err
}
if m.Title, err = replaceTemplate(m.Title, peekedBody); err != nil {
return err
}
if len(m.Message) > s.config.MessageSizeLimit {
return errHTTPBadRequestTemplatedMessageTooLarge
}
return nil
}
func replaceTemplate(tpl string, source string) string {
rendered, err := replaceTemplateInternal(tpl, source)
if err != nil {
return "<invalid template>"
}
return rendered
}
func replaceTemplateInternal(tpl string, source string) (string, error) {
func replaceTemplate(tpl string, source string) (string, error) {
var data any
if err := json.Unmarshal([]byte(source), &data); err != nil {
return "", err
return "", errHTTPBadRequestTemplatedMessageNotJSON
}
t, err := template.New("").Parse(tpl)
if err != nil {
return "", err
return "", errHTTPBadRequestTemplateInvalid
}
var buf bytes.Buffer
if err := t.Execute(&buf, data); err != nil {
return "", err
if err := t.Execute(util.NewTimeoutWriter(&buf, templateMaxExecutionTime), data); err != nil {
return "", errHTTPBadRequestTemplateExecutionFailed
}
return buf.String(), nil
}