diff --git a/apiserver/events/events.go b/apiserver/events/events.go index 66cee19b..30e0b386 100644 --- a/apiserver/events/events.go +++ b/apiserver/events/events.go @@ -3,6 +3,7 @@ package events import ( "context" "encoding/json" + "errors" "fmt" "log/slog" "sync" @@ -163,8 +164,14 @@ func (e *EventHandler) HandleClientMessages(message []byte) error { return nil } - if len(opt.Filters) == 0 && !opt.SendEverything { - slog.DebugContext(e.ctx, "no filters provided; ignoring") + if err := opt.Validate(); err != nil { + if errors.Is(err, common.ErrNoFiltersProvided) { + slog.DebugContext(e.ctx, "no filters provided; ignoring") + return nil + } + slog.ErrorContext(e.ctx, "invalid filter", "error", err) + e.client.Write([]byte("invalid filter")) + e.Stop() return nil } diff --git a/apiserver/events/params.go b/apiserver/events/params.go index c3f9403b..7ecabaa8 100644 --- a/apiserver/events/params.go +++ b/apiserver/events/params.go @@ -11,9 +11,20 @@ type Filter struct { func (f Filter) Validate() error { switch f.EntityType { - case common.RepositoryEntityType, common.OrganizationEntityType, common.EnterpriseEntityType, common.PoolEntityType, common.UserEntityType, common.InstanceEntityType, common.JobEntityType, common.ControllerEntityType, common.GithubCredentialsEntityType, common.GithubEndpointEntityType: + case common.RepositoryEntityType, common.OrganizationEntityType, common.EnterpriseEntityType, + common.PoolEntityType, common.UserEntityType, common.InstanceEntityType, + common.JobEntityType, common.ControllerEntityType, common.GithubCredentialsEntityType, + common.GithubEndpointEntityType: default: - return nil + return common.ErrInvalidEntityType + } + + for _, op := range f.Operations { + switch op { + case common.CreateOperation, common.UpdateOperation, common.DeleteOperation: + default: + return common.ErrInvalidOperationType + } } return nil } @@ -22,3 +33,18 @@ type Options struct { SendEverything bool `json:"send_everything"` Filters []Filter `json:"filters"` } + +func (o Options) Validate() error { + if o.SendEverything { + return nil + } + if len(o.Filters) == 0 { + return common.ErrNoFiltersProvided + } + for _, f := range o.Filters { + if err := f.Validate(); err != nil { + return err + } + } + return nil +} diff --git a/database/common/errors.go b/database/common/errors.go index 4b2d165a..df2d936a 100644 --- a/database/common/errors.go +++ b/database/common/errors.go @@ -9,6 +9,7 @@ var ( ErrConsumerAlreadyRegistered = fmt.Errorf("consumer already registered") ErrWatcherAlreadyStarted = fmt.Errorf("watcher already started") ErrWatcherNotInitialized = fmt.Errorf("watcher not initialized") - ErrInvalidOperation = fmt.Errorf("invalid operation") + ErrInvalidOperationType = fmt.Errorf("invalid operation") ErrInvalidEntityType = fmt.Errorf("invalid entity type") + ErrNoFiltersProvided = fmt.Errorf("no filters provided") )