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..d2c2711 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 } @@ -116,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 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) + } + } +}