|
@@ -5,8 +5,8 @@ import (
|
|
"errors"
|
|
"errors"
|
|
"fmt"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http"
|
|
|
|
+ "regexp"
|
|
"strconv"
|
|
"strconv"
|
|
- "strings"
|
|
|
|
|
|
|
|
"github.com/asaskevich/govalidator"
|
|
"github.com/asaskevich/govalidator"
|
|
"github.com/knadh/listmonk/models"
|
|
"github.com/knadh/listmonk/models"
|
|
@@ -32,6 +32,10 @@ type dummyMessage struct {
|
|
UnsubscribeURL string
|
|
UnsubscribeURL string
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+var (
|
|
|
|
+ regexpTplTag = regexp.MustCompile(`{{(\s+)?template\s+?"content"(\s+)?\.(\s+)?}}`)
|
|
|
|
+)
|
|
|
|
+
|
|
// handleGetTemplates handles retrieval of templates.
|
|
// handleGetTemplates handles retrieval of templates.
|
|
func handleGetTemplates(c echo.Context) error {
|
|
func handleGetTemplates(c echo.Context) error {
|
|
var (
|
|
var (
|
|
@@ -76,7 +80,7 @@ func handlePreviewTemplate(c echo.Context) error {
|
|
)
|
|
)
|
|
|
|
|
|
if body != "" {
|
|
if body != "" {
|
|
- if strings.Count(body, tplTag) != 1 {
|
|
|
|
|
|
+ if !regexpTplTag.MatchString(body) {
|
|
return echo.NewHTTPError(http.StatusBadRequest,
|
|
return echo.NewHTTPError(http.StatusBadRequest,
|
|
fmt.Sprintf("Template body should contain the %s placeholder exactly once", tplTag))
|
|
fmt.Sprintf("Template body should contain the %s placeholder exactly once", tplTag))
|
|
}
|
|
}
|
|
@@ -243,7 +247,7 @@ func validateTemplate(o models.Template) error {
|
|
return errors.New("invalid length for `name`")
|
|
return errors.New("invalid length for `name`")
|
|
}
|
|
}
|
|
|
|
|
|
- if strings.Count(o.Body, tplTag) != 1 {
|
|
|
|
|
|
+ if !regexpTplTag.MatchString(o.Body) {
|
|
return fmt.Errorf("template body should contain the %s placeholder exactly once", tplTag)
|
|
return fmt.Errorf("template body should contain the %s placeholder exactly once", tplTag)
|
|
}
|
|
}
|
|
|
|
|