From f6ff33d4da6a578273b647ff78d243f64243568c Mon Sep 17 00:00:00 2001 From: Gianluca Date: Thu, 1 Oct 2020 15:16:37 +0200 Subject: [PATCH] fix: check the type before to cast it to string on filters --- filters/cache.go | 2 +- filters/echo.go | 5 +++-- filters/hash.go | 12 +++++++++++- filters/mail.go | 13 ++++++++++++- filters/pdf.go | 2 +- filters/url.go | 12 +++++++++++- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/filters/cache.go b/filters/cache.go index d32c686..388c512 100644 --- a/filters/cache.go +++ b/filters/cache.go @@ -62,7 +62,7 @@ func (f *Cache) DoFilter(msg *data.Message) (bool, error) { var text interface{} if f.target == "main" { - text = msg.GetMessage().(string) + text = msg.GetMessage() } else if v, ok := msg.GetExtra()[f.target]; ok { text = v } else { diff --git a/filters/echo.go b/filters/echo.go index 3b6bee2..461800c 100644 --- a/filters/echo.go +++ b/filters/echo.go @@ -34,10 +34,11 @@ func NewEchoFilter(p map[string]string) (Filter, error) { // DoFilter is the mandatory method used to "filter" the input data.Message func (f *Echo) DoFilter(msg *data.Message) (bool, error) { - text := msg.GetMessage() + var text string + data := msg.GetMessage() if f.printExtra { for k, v := range msg.GetExtra() { - text = fmt.Sprintf("%s [%s: %s] ", text, k, v) + text = fmt.Sprintf("%#v [%#v: %#v] ", data, k, v) } } log.Info("%s", text) diff --git a/filters/hash.go b/filters/hash.go index 77f102e..4c5dbfc 100644 --- a/filters/hash.go +++ b/filters/hash.go @@ -1,6 +1,7 @@ package filters import ( + "fmt" "regexp" "github.com/Matrix86/driplane/data" @@ -63,7 +64,16 @@ func NewHashFilter(p map[string]string) (Filter, error) { // DoFilter is the mandatory method used to "filter" the input data.Message func (f *Hash) DoFilter(msg *data.Message) (bool, error) { - text := msg.GetTarget(f.target).(string) + var text string + + if v, ok := msg.GetTarget(f.target).(string); ok { + text = v + } else if v, ok := msg.GetTarget(f.target).([]byte); ok { + text = string(v) + } else { + // ERROR this filter can't be used with different types + return false, fmt.Errorf("received data is not a string") + } match := f.regex.FindAllStringSubmatch(text, -1) if match != nil { for _, m := range match { diff --git a/filters/mail.go b/filters/mail.go index 7ca0a5d..2e86cb2 100644 --- a/filters/mail.go +++ b/filters/mail.go @@ -2,6 +2,7 @@ package filters import ( "crypto/tls" + "fmt" "html/template" "strconv" "strings" @@ -81,7 +82,17 @@ func NewMailFilter(p map[string]string) (Filter, error) { // DoFilter is the mandatory method used to "filter" the input data.Message func (f *Mail) DoFilter(msg *data.Message) (bool, error) { var err error - text := msg.GetMessage().(string) + var text string + + if v, ok := msg.GetMessage().(string); ok { + text = v + } else if v, ok := msg.GetMessage().([]byte); ok { + text = string(v) + } else { + // ERROR this filter can't be used with different types + return false, fmt.Errorf("received data is not a string") + } + if f.template != nil { text, err = msg.ApplyPlaceholder(f.template) if err != nil { diff --git a/filters/pdf.go b/filters/pdf.go index add92b5..8f1761c 100644 --- a/filters/pdf.go +++ b/filters/pdf.go @@ -70,7 +70,7 @@ func (f *PDF) DoFilter(msg *data.Message) (bool, error) { } else { if _, ok := msg.GetTarget(f.target).([]byte); !ok { // ERROR this filter can't be used with different types - return false, fmt.Errorf("received data is not a string") + return false, fmt.Errorf("received data is not a []byte") } buf := bytes.NewBuffer(msg.GetTarget(f.target).([]byte)) diff --git a/filters/url.go b/filters/url.go index 4ca34f9..178d2b5 100644 --- a/filters/url.go +++ b/filters/url.go @@ -1,6 +1,7 @@ package filters import ( + "fmt" "regexp" "strings" @@ -58,7 +59,16 @@ func NewURLFilter(p map[string]string) (Filter, error) { // DoFilter is the mandatory method used to "filter" the input data.Message func (f *URL) DoFilter(msg *data.Message) (bool, error) { - text := msg.GetTarget(f.target).(string) + var text string + + if v, ok := msg.GetTarget(f.target).(string); ok { + text = v + } else if v, ok := msg.GetTarget(f.target).([]byte); ok { + text = string(v) + } else { + // ERROR this filter can't be used with different types + return false, fmt.Errorf("received data is not a string") + } found := false match := f.rURL.FindAllStringSubmatch(text, -1)