From e17781b592c5d43c8b88510c53646f88542c3f84 Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 7 May 2024 08:16:17 -0700 Subject: [PATCH 1/2] fix: event filter wildcard test --- s3event/event.go | 2 +- s3event/filter.go | 9 ++++++-- s3event/filter_test.go | 52 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 s3event/filter_test.go diff --git a/s3event/event.go b/s3event/event.go index 475f447..e172836 100644 --- a/s3event/event.go +++ b/s3event/event.go @@ -117,7 +117,7 @@ type EventConfig struct { } func InitEventSender(cfg *EventConfig) (S3EventSender, error) { - filter, err := parseEventFilters(cfg.FilterConfigFilePath) + filter, err := parseEventFiltersFile(cfg.FilterConfigFilePath) if err != nil { return nil, fmt.Errorf("parse event filter config file %w", err) } diff --git a/s3event/filter.go b/s3event/filter.go index 356ccd1..ae454da 100644 --- a/s3event/filter.go +++ b/s3event/filter.go @@ -17,6 +17,7 @@ package s3event import ( "encoding/json" "fmt" + "io" "os" "path/filepath" "strings" @@ -69,7 +70,7 @@ var supportedEventFilters = map[EventType]struct{}{ type EventFilter map[EventType]bool -func parseEventFilters(path string) (EventFilter, error) { +func parseEventFiltersFile(path string) (EventFilter, error) { // if no filter config file path is specified return nil map if path == "" { return nil, nil @@ -87,8 +88,12 @@ func parseEventFilters(path string) (EventFilter, error) { } defer file.Close() + return parseEventFilters(file) +} + +func parseEventFilters(r io.Reader) (EventFilter, error) { var filter EventFilter - if err := json.NewDecoder(file).Decode(&filter); err != nil { + if err := json.NewDecoder(r).Decode(&filter); err != nil { return nil, err } diff --git a/s3event/filter_test.go b/s3event/filter_test.go new file mode 100644 index 0000000..3bc43bc --- /dev/null +++ b/s3event/filter_test.go @@ -0,0 +1,52 @@ +package s3event + +import ( + "strings" + "testing" +) + +func TestFilterWildcardCreated(t *testing.T) { + filterString := `{"s3:ObjectCreated:*": true}` + strReader := strings.NewReader(filterString) + + ef, err := parseEventFilters(strReader) + if err != nil { + t.Fatalf("failed to parse event filter: %v", err) + } + + created := []string{ + "s3:ObjectCreated:Put", + "s3:ObjectCreated:Post", + "s3:ObjectCreated:Copy", + "s3:ObjectCreated:CompleteMultipartUpload", + } + + for _, event := range created { + allowed := ef.Filter(EventType(event)) + if !allowed { + t.Errorf("expected event to be allowed: %s", event) + } + } +} + +func TestFilterWildcardRemoved(t *testing.T) { + filterString := `{"s3:ObjectRemoved:*": true}` + strReader := strings.NewReader(filterString) + + ef, err := parseEventFilters(strReader) + if err != nil { + t.Fatalf("failed to parse event filter: %v", err) + } + + removed := []string{ + "s3:ObjectRemoved:Delete", + "s3:ObjectRemoved:DeleteObjects", + } + + for _, event := range removed { + allowed := ef.Filter(EventType(event)) + if !allowed { + t.Errorf("expected event to be allowed: %s", event) + } + } +} From 9fa26d9eb278aaa2094c6966f3e0b1b82e483f78 Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Tue, 7 May 2024 11:52:33 -0400 Subject: [PATCH 2/2] fix: Fixed s3 event filtering wildcard case bug --- s3event/filter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/s3event/filter.go b/s3event/filter.go index ae454da..d2c2711 100644 --- a/s3event/filter.go +++ b/s3event/filter.go @@ -121,7 +121,7 @@ func (ef EventFilter) Filter(event EventType) bool { } // check wildcard match - wildCardEv := EventType(string(event[strings.LastIndex(string(event), ":")+1]) + "*") + wildCardEv := EventType(string(event[:strings.LastIndex(string(event), ":")+1]) + "*") wildcard, found := ef[wildCardEv] if found { return wildcard