Parse template when validating it (#49282)

This commit is contained in:
Alexander Weaver 2022-05-19 16:05:34 -05:00 committed by GitHub
parent 0a95d493e3
commit e8b498fe8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package definitions
import (
"fmt"
"html/template"
"regexp"
"strings"
@ -74,6 +75,11 @@ func (t *MessageTemplate) Validate() error {
return fmt.Errorf("template must have content")
}
_, err := template.New("").Parse(t.Template)
if err != nil {
return fmt.Errorf("invalid template: %w", err)
}
content := strings.TrimSpace(t.Template)
found, err := regexp.MatchString(`\{\{\s*define`, content)
if err != nil {

View File

@ -228,6 +228,42 @@ func TestTemplateService(t *testing.T) {
require.Equal(t, tmpl.Template, result.Template)
})
t.Run("rejects syntactically invalid template", func(t *testing.T) {
sut := createTemplateServiceSut()
tmpl := definitions.MessageTemplate{
Name: "name",
Template: "{{ .MyField }",
}
sut.config.(*MockAMConfigStore).EXPECT().
getsConfig(models.AlertConfiguration{
AlertmanagerConfiguration: defaultConfig,
})
sut.config.(*MockAMConfigStore).EXPECT().saveSucceeds()
sut.prov.(*MockProvisioningStore).EXPECT().saveSucceeds()
_, err := sut.SetTemplate(context.Background(), 1, tmpl)
require.ErrorIs(t, err, ErrValidation)
})
t.Run("does not reject template with unknown field", func(t *testing.T) {
sut := createTemplateServiceSut()
tmpl := definitions.MessageTemplate{
Name: "name",
Template: "{{ .NotAField }}",
}
sut.config.(*MockAMConfigStore).EXPECT().
getsConfig(models.AlertConfiguration{
AlertmanagerConfiguration: defaultConfig,
})
sut.config.(*MockAMConfigStore).EXPECT().saveSucceeds()
sut.prov.(*MockProvisioningStore).EXPECT().saveSucceeds()
_, err := sut.SetTemplate(context.Background(), 1, tmpl)
require.NoError(t, err)
})
})
t.Run("deleting templates", func(t *testing.T) {