1
0
mirror of https://github.com/amir20/dozzle.git synced 2025-12-21 13:23:07 +01:00

fix: fixes searching escaped html and by unescaping before searching (#3838)

This commit is contained in:
Amir Raminfar
2025-04-24 11:27:53 -07:00
committed by GitHub
parent effeb5aa52
commit 5433939690
4 changed files with 48 additions and 19 deletions

View File

@@ -10,6 +10,11 @@ import (
orderedmap "github.com/wk8/go-ordered-map/v2"
)
const (
MarkerStart = "\uE000"
MarkerEnd = "\uE001"
)
func ParseRegex(search string) (*regexp.Regexp, error) {
flags := ""
@@ -30,7 +35,7 @@ func Search(re *regexp.Regexp, logEvent *container.LogEvent) bool {
switch value := logEvent.Message.(type) {
case string:
if re.MatchString(value) {
logEvent.Message = re.ReplaceAllString(value, "<mark>$0</mark>")
logEvent.Message = re.ReplaceAllString(value, MarkerStart+"$0"+MarkerEnd)
return true
}
@@ -56,9 +61,9 @@ func searchMapAny(re *regexp.Regexp, orderedMap *orderedmap.OrderedMap[string, a
for pair := orderedMap.Oldest(); pair != nil; pair = pair.Next() {
switch value := pair.Value.(type) {
case string:
if re.MatchString(value) {
if replaced, matched := searchString(re, value); matched {
found = true
orderedMap.Set(pair.Key, re.ReplaceAllString(value, "<mark>$0</mark>"))
orderedMap.Set(pair.Key, replaced)
}
case []any:
@@ -84,7 +89,7 @@ func searchMapAny(re *regexp.Regexp, orderedMap *orderedmap.OrderedMap[string, a
case int, float64, bool:
formatted := fmt.Sprintf("%v", value)
if re.MatchString(formatted) {
orderedMap.Set(pair.Key, re.ReplaceAllString(formatted, "<mark>$0</mark>"))
orderedMap.Set(pair.Key, re.ReplaceAllString(formatted, MarkerStart+"$0"+MarkerEnd))
found = true
}
@@ -101,11 +106,10 @@ func searchMap(re *regexp.Regexp, data map[string]interface{}) bool {
for key, value := range data {
switch value := value.(type) {
case string:
if re.MatchString(value) {
data[key] = re.ReplaceAllString(value, "<mark>$0</mark>")
if replaced, matched := searchString(re, value); matched {
found = true
data[key] = replaced
}
case []any:
if searchArray(re, value) {
found = true
@@ -119,7 +123,7 @@ func searchMap(re *regexp.Regexp, data map[string]interface{}) bool {
case int, float64, bool:
formatted := fmt.Sprintf("%v", value)
if re.MatchString(formatted) {
data[key] = re.ReplaceAllString(formatted, "<mark>$0</mark>")
data[key] = re.ReplaceAllString(formatted, MarkerStart+"$0"+MarkerEnd)
found = true
}
default:
@@ -133,9 +137,9 @@ func searchMap(re *regexp.Regexp, data map[string]interface{}) bool {
func searchMapString(re *regexp.Regexp, orderedMap *orderedmap.OrderedMap[string, string]) bool {
found := false
for pair := orderedMap.Oldest(); pair != nil; pair = pair.Next() {
if re.MatchString(pair.Value) {
orderedMap.Set(pair.Key, re.ReplaceAllString(pair.Value, "<mark>$0</mark>"))
if replaced, matched := searchString(re, pair.Value); matched {
found = true
orderedMap.Set(pair.Key, replaced)
}
}
return found
@@ -146,14 +150,14 @@ func searchArray(re *regexp.Regexp, data []any) bool {
for i, value := range data {
switch value := value.(type) {
case string:
if re.MatchString(value) {
data[i] = re.ReplaceAllString(value, "<mark>$0</mark>")
if replaced, matched := searchString(re, value); matched {
found = true
data[i] = replaced
}
case int, float64, bool:
formatted := fmt.Sprintf("%v", value)
if re.MatchString(formatted) {
data[i] = re.ReplaceAllString(formatted, "<mark>$0</mark>")
data[i] = re.ReplaceAllString(formatted, MarkerStart+"$0"+MarkerEnd)
found = true
}
case []any:
@@ -169,3 +173,12 @@ func searchArray(re *regexp.Regexp, data []any) bool {
return found
}
func searchString(re *regexp.Regexp, value string) (string, bool) {
if re.MatchString(value) {
replaced := re.ReplaceAllString(value, MarkerStart+"$0"+MarkerEnd)
return replaced, true
}
return value, false
}

View File

@@ -0,0 +1,61 @@
package support_web
import (
"html"
"strings"
"github.com/amir20/dozzle/internal/container"
"github.com/amir20/dozzle/internal/support/search"
"github.com/rs/zerolog/log"
orderedmap "github.com/wk8/go-ordered-map/v2"
)
func EscapeHTMLValues(logEvent *container.LogEvent) {
switch value := logEvent.Message.(type) {
case string:
value = html.EscapeString(value)
value = strings.ReplaceAll(value, search.MarkerStart, "<mark>")
logEvent.Message = strings.ReplaceAll(value, search.MarkerEnd, "</mark>")
case *orderedmap.OrderedMap[string, any]:
escapeAnyMap(value)
case *orderedmap.OrderedMap[string, string]:
escapeStringMap(value)
case map[string]interface{}:
panic("not implemented")
case map[string]string:
panic("not implemented")
default:
log.Debug().Type("type", value).Msg("unknown logEvent type")
}
}
func escapeAnyMap(orderedMap *orderedmap.OrderedMap[string, any]) {
for pair := orderedMap.Oldest(); pair != nil; pair = pair.Next() {
switch value := pair.Value.(type) {
case string:
value = html.EscapeString(value)
value = strings.ReplaceAll(value, search.MarkerStart, "<mark>")
value = strings.ReplaceAll(value, search.MarkerEnd, "</mark>")
orderedMap.Set(pair.Key, value)
case *orderedmap.OrderedMap[string, any]:
escapeAnyMap(value)
case *orderedmap.OrderedMap[string, string]:
escapeStringMap(value)
}
}
}
func escapeStringMap(orderedMap *orderedmap.OrderedMap[string, string]) {
for pair := orderedMap.Oldest(); pair != nil; pair = pair.Next() {
value := html.EscapeString(pair.Value)
value = strings.ReplaceAll(value, search.MarkerStart, "<mark>")
value = strings.ReplaceAll(value, search.MarkerEnd, "</mark>")
orderedMap.Set(pair.Key, value)
}
}