Explorar o código

types.InSlice() -> slices.Contains() (#2246)

mmetc %!s(int64=2) %!d(string=hai) anos
pai
achega
92a9d6c321

+ 3 - 5
cmd/crowdsec-cli/bouncers.go

@@ -11,6 +11,7 @@ import (
 	"github.com/fatih/color"
 	"github.com/fatih/color"
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
+	"golang.org/x/exp/slices"
 
 
 	middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
 	middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
 	"github.com/crowdsecurity/crowdsec/pkg/database"
 	"github.com/crowdsecurity/crowdsec/pkg/database"
@@ -122,7 +123,6 @@ func runBouncersAdd(cmd *cobra.Command, args []string) error {
 	return nil
 	return nil
 }
 }
 
 
-
 func NewBouncersAddCmd() *cobra.Command {
 func NewBouncersAddCmd() *cobra.Command {
 	cmdBouncersAdd := &cobra.Command{
 	cmdBouncersAdd := &cobra.Command{
 		Use:   "add MyBouncerName [--length 16]",
 		Use:   "add MyBouncerName [--length 16]",
@@ -133,7 +133,7 @@ cscli bouncers add MyBouncerName -l 24
 cscli bouncers add MyBouncerName -k <random-key>`,
 cscli bouncers add MyBouncerName -k <random-key>`,
 		Args:              cobra.ExactArgs(1),
 		Args:              cobra.ExactArgs(1),
 		DisableAutoGenTag: true,
 		DisableAutoGenTag: true,
-		RunE: runBouncersAdd,
+		RunE:              runBouncersAdd,
 	}
 	}
 
 
 	flags := cmdBouncersAdd.Flags()
 	flags := cmdBouncersAdd.Flags()
@@ -144,7 +144,6 @@ cscli bouncers add MyBouncerName -k <random-key>`,
 	return cmdBouncersAdd
 	return cmdBouncersAdd
 }
 }
 
 
-
 func runBouncersDelete(cmd *cobra.Command, args []string) error {
 func runBouncersDelete(cmd *cobra.Command, args []string) error {
 	for _, bouncerID := range args {
 	for _, bouncerID := range args {
 		err := dbClient.DeleteBouncer(bouncerID)
 		err := dbClient.DeleteBouncer(bouncerID)
@@ -157,7 +156,6 @@ func runBouncersDelete(cmd *cobra.Command, args []string) error {
 	return nil
 	return nil
 }
 }
 
 
-
 func NewBouncersDeleteCmd() *cobra.Command {
 func NewBouncersDeleteCmd() *cobra.Command {
 	cmdBouncersDelete := &cobra.Command{
 	cmdBouncersDelete := &cobra.Command{
 		Use:               "delete MyBouncerName",
 		Use:               "delete MyBouncerName",
@@ -178,7 +176,7 @@ func NewBouncersDeleteCmd() *cobra.Command {
 			}
 			}
 			ret := make([]string, 0)
 			ret := make([]string, 0)
 			for _, bouncer := range bouncers {
 			for _, bouncer := range bouncers {
-				if strings.Contains(bouncer.Name, toComplete) && !inSlice(bouncer.Name, args) {
+				if strings.Contains(bouncer.Name, toComplete) && !slices.Contains(args, bouncer.Name) {
 					ret = append(ret, bouncer.Name)
 					ret = append(ret, bouncer.Name)
 				}
 				}
 			}
 			}

+ 16 - 15
cmd/crowdsec-cli/lapi.go

@@ -12,6 +12,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
+	"golang.org/x/exp/slices"
 	"gopkg.in/yaml.v2"
 	"gopkg.in/yaml.v2"
 
 
 	"github.com/crowdsecurity/go-cs-lib/pkg/version"
 	"github.com/crowdsecurity/go-cs-lib/pkg/version"
@@ -259,7 +260,7 @@ cscli lapi context add --key file_source --value evt.Line.Src
 			}
 			}
 			data := csConfig.Crowdsec.ContextToSend[keyToAdd]
 			data := csConfig.Crowdsec.ContextToSend[keyToAdd]
 			for _, val := range valuesToAdd {
 			for _, val := range valuesToAdd {
-				if !inSlice(val, data) {
+				if !slices.Contains(data, val) {
 					log.Infof("value '%s' added to key '%s'", val, keyToAdd)
 					log.Infof("value '%s' added to key '%s'", val, keyToAdd)
 					data = append(data, val)
 					data = append(data, val)
 				}
 				}
@@ -333,7 +334,7 @@ cscli lapi context detect crowdsecurity/sshd-logs
 
 
 			fieldByParsers := make(map[string][]string)
 			fieldByParsers := make(map[string][]string)
 			for _, node := range csParsers.Nodes {
 			for _, node := range csParsers.Nodes {
-				if !detectAll && !inSlice(node.Name, args) {
+				if !detectAll && !slices.Contains(args, node.Name) {
 					continue
 					continue
 				}
 				}
 				if !detectAll {
 				if !detectAll {
@@ -344,7 +345,7 @@ cscli lapi context detect crowdsecurity/sshd-logs
 
 
 				subNodeFields := detectSubNode(node, *csParsers.Ctx)
 				subNodeFields := detectSubNode(node, *csParsers.Ctx)
 				for _, field := range subNodeFields {
 				for _, field := range subNodeFields {
-					if !inSlice(field, fieldByParsers[node.Name]) {
+					if !slices.Contains(fieldByParsers[node.Name], field) {
 						fieldByParsers[node.Name] = append(fieldByParsers[node.Name], field)
 						fieldByParsers[node.Name] = append(fieldByParsers[node.Name], field)
 					}
 					}
 				}
 				}
@@ -412,7 +413,7 @@ cscli lapi context delete --value evt.Line.Src
 			for _, value := range valuesToDelete {
 			for _, value := range valuesToDelete {
 				valueFound := false
 				valueFound := false
 				for key, context := range csConfig.Crowdsec.ContextToSend {
 				for key, context := range csConfig.Crowdsec.ContextToSend {
-					if inSlice(value, context) {
+					if slices.Contains(context, value) {
 						valueFound = true
 						valueFound = true
 						csConfig.Crowdsec.ContextToSend[key] = removeFromSlice(value, context)
 						csConfig.Crowdsec.ContextToSend[key] = removeFromSlice(value, context)
 						log.Infof("value '%s' has been removed from key '%s'", value, key)
 						log.Infof("value '%s' has been removed from key '%s'", value, key)
@@ -444,13 +445,13 @@ func detectStaticField(GrokStatics []types.ExtraField) []string {
 	for _, static := range GrokStatics {
 	for _, static := range GrokStatics {
 		if static.Parsed != "" {
 		if static.Parsed != "" {
 			fieldName := fmt.Sprintf("evt.Parsed.%s", static.Parsed)
 			fieldName := fmt.Sprintf("evt.Parsed.%s", static.Parsed)
-			if !inSlice(fieldName, ret) {
+			if !slices.Contains(ret, fieldName) {
 				ret = append(ret, fieldName)
 				ret = append(ret, fieldName)
 			}
 			}
 		}
 		}
 		if static.Meta != "" {
 		if static.Meta != "" {
 			fieldName := fmt.Sprintf("evt.Meta.%s", static.Meta)
 			fieldName := fmt.Sprintf("evt.Meta.%s", static.Meta)
-			if !inSlice(fieldName, ret) {
+			if !slices.Contains(ret, fieldName) {
 				ret = append(ret, fieldName)
 				ret = append(ret, fieldName)
 			}
 			}
 		}
 		}
@@ -459,7 +460,7 @@ func detectStaticField(GrokStatics []types.ExtraField) []string {
 			if !strings.HasPrefix(fieldName, "evt.") {
 			if !strings.HasPrefix(fieldName, "evt.") {
 				fieldName = "evt." + fieldName
 				fieldName = "evt." + fieldName
 			}
 			}
-			if !inSlice(fieldName, ret) {
+			if !slices.Contains(ret, fieldName) {
 				ret = append(ret, fieldName)
 				ret = append(ret, fieldName)
 			}
 			}
 		}
 		}
@@ -473,7 +474,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 	if node.Grok.RunTimeRegexp != nil {
 	if node.Grok.RunTimeRegexp != nil {
 		for _, capturedField := range node.Grok.RunTimeRegexp.Names() {
 		for _, capturedField := range node.Grok.RunTimeRegexp.Names() {
 			fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
 			fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
-			if !inSlice(fieldName, ret) {
+			if !slices.Contains(ret, fieldName) {
 				ret = append(ret, fieldName)
 				ret = append(ret, fieldName)
 			}
 			}
 		}
 		}
@@ -486,7 +487,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 		}
 		}
 		for _, capturedField := range grokCompiled.Names() {
 		for _, capturedField := range grokCompiled.Names() {
 			fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
 			fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
-			if !inSlice(fieldName, ret) {
+			if !slices.Contains(ret, fieldName) {
 				ret = append(ret, fieldName)
 				ret = append(ret, fieldName)
 			}
 			}
 		}
 		}
@@ -495,7 +496,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 	if len(node.Grok.Statics) > 0 {
 	if len(node.Grok.Statics) > 0 {
 		staticsField := detectStaticField(node.Grok.Statics)
 		staticsField := detectStaticField(node.Grok.Statics)
 		for _, staticField := range staticsField {
 		for _, staticField := range staticsField {
-			if !inSlice(staticField, ret) {
+			if !slices.Contains(ret, staticField) {
 				ret = append(ret, staticField)
 				ret = append(ret, staticField)
 			}
 			}
 		}
 		}
@@ -504,7 +505,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 	if len(node.Statics) > 0 {
 	if len(node.Statics) > 0 {
 		staticsField := detectStaticField(node.Statics)
 		staticsField := detectStaticField(node.Statics)
 		for _, staticField := range staticsField {
 		for _, staticField := range staticsField {
-			if !inSlice(staticField, ret) {
+			if !slices.Contains(ret, staticField) {
 				ret = append(ret, staticField)
 				ret = append(ret, staticField)
 			}
 			}
 		}
 		}
@@ -520,7 +521,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 		if subnode.Grok.RunTimeRegexp != nil {
 		if subnode.Grok.RunTimeRegexp != nil {
 			for _, capturedField := range subnode.Grok.RunTimeRegexp.Names() {
 			for _, capturedField := range subnode.Grok.RunTimeRegexp.Names() {
 				fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
 				fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
-				if !inSlice(fieldName, ret) {
+				if !slices.Contains(ret, fieldName) {
 					ret = append(ret, fieldName)
 					ret = append(ret, fieldName)
 				}
 				}
 			}
 			}
@@ -532,7 +533,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 			}
 			}
 			for _, capturedField := range grokCompiled.Names() {
 			for _, capturedField := range grokCompiled.Names() {
 				fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
 				fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
-				if !inSlice(fieldName, ret) {
+				if !slices.Contains(ret, fieldName) {
 					ret = append(ret, fieldName)
 					ret = append(ret, fieldName)
 				}
 				}
 			}
 			}
@@ -541,7 +542,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 		if len(subnode.Grok.Statics) > 0 {
 		if len(subnode.Grok.Statics) > 0 {
 			staticsField := detectStaticField(subnode.Grok.Statics)
 			staticsField := detectStaticField(subnode.Grok.Statics)
 			for _, staticField := range staticsField {
 			for _, staticField := range staticsField {
-				if !inSlice(staticField, ret) {
+				if !slices.Contains(ret, staticField) {
 					ret = append(ret, staticField)
 					ret = append(ret, staticField)
 				}
 				}
 			}
 			}
@@ -550,7 +551,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
 		if len(subnode.Statics) > 0 {
 		if len(subnode.Statics) > 0 {
 			staticsField := detectStaticField(subnode.Statics)
 			staticsField := detectStaticField(subnode.Statics)
 			for _, staticField := range staticsField {
 			for _, staticField := range staticsField {
-				if !inSlice(staticField, ret) {
+				if !slices.Contains(ret, staticField) {
 					ret = append(ret, staticField)
 					ret = append(ret, staticField)
 				}
 				}
 			}
 			}

+ 4 - 3
cmd/crowdsec-cli/machines.go

@@ -18,6 +18,7 @@ import (
 	"github.com/google/uuid"
 	"github.com/google/uuid"
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
+	"golang.org/x/exp/slices"
 	"gopkg.in/yaml.v2"
 	"gopkg.in/yaml.v2"
 
 
 	"github.com/crowdsecurity/machineid"
 	"github.com/crowdsecurity/machineid"
@@ -33,8 +34,8 @@ var (
 )
 )
 
 
 func generatePassword(length int) string {
 func generatePassword(length int) string {
-	upper  := "ABCDEFGHIJKLMNOPQRSTUVWXY"
-	lower  := "abcdefghijklmnopqrstuvwxyz"
+	upper := "ABCDEFGHIJKLMNOPQRSTUVWXY"
+	lower := "abcdefghijklmnopqrstuvwxyz"
 	digits := "0123456789"
 	digits := "0123456789"
 
 
 	charset := upper + lower + digits
 	charset := upper + lower + digits
@@ -344,7 +345,7 @@ func NewMachinesDeleteCmd() *cobra.Command {
 			}
 			}
 			ret := make([]string, 0)
 			ret := make([]string, 0)
 			for _, machine := range machines {
 			for _, machine := range machines {
-				if strings.Contains(machine.MachineId, toComplete) && !inSlice(machine.MachineId, args) {
+				if strings.Contains(machine.MachineId, toComplete) && !slices.Contains(args, machine.MachineId) {
 					ret = append(ret, machine.MachineId)
 					ret = append(ret, machine.MachineId)
 				}
 				}
 			}
 			}

+ 2 - 1
cmd/crowdsec-cli/main.go

@@ -12,6 +12,7 @@ import (
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra/doc"
 	"github.com/spf13/cobra/doc"
+	"golang.org/x/exp/slices"
 
 
 	"github.com/crowdsecurity/crowdsec/pkg/csconfig"
 	"github.com/crowdsecurity/crowdsec/pkg/csconfig"
 	"github.com/crowdsecurity/crowdsec/pkg/cwhub"
 	"github.com/crowdsecurity/crowdsec/pkg/cwhub"
@@ -52,7 +53,7 @@ func initConfig() {
 		log.SetLevel(log.ErrorLevel)
 		log.SetLevel(log.ErrorLevel)
 	}
 	}
 
 
-	if !inSlice(os.Args[1], NoNeedConfig) {
+	if !slices.Contains(NoNeedConfig, os.Args[1]) {
 		csConfig, mergedConfig, err = csconfig.NewConfig(ConfigFilePath, false, false, true)
 		csConfig, mergedConfig, err = csconfig.NewConfig(ConfigFilePath, false, false, true)
 		if err != nil {
 		if err != nil {
 			log.Fatal(err)
 			log.Fatal(err)

+ 3 - 2
cmd/crowdsec-cli/simulation.go

@@ -6,6 +6,7 @@ import (
 
 
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
+	"golang.org/x/exp/slices"
 	"gopkg.in/yaml.v2"
 	"gopkg.in/yaml.v2"
 
 
 	"github.com/crowdsecurity/crowdsec/pkg/cwhub"
 	"github.com/crowdsecurity/crowdsec/pkg/cwhub"
@@ -161,7 +162,7 @@ func NewSimulationEnableCmd() *cobra.Command {
 					if !item.Installed {
 					if !item.Installed {
 						log.Warningf("'%s' isn't enabled", scenario)
 						log.Warningf("'%s' isn't enabled", scenario)
 					}
 					}
-					isExcluded := inSlice(scenario, csConfig.Cscli.SimulationConfig.Exclusions)
+					isExcluded := slices.Contains(csConfig.Cscli.SimulationConfig.Exclusions, scenario)
 					if *csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
 					if *csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
 						log.Warning("global simulation is already enabled")
 						log.Warning("global simulation is already enabled")
 						continue
 						continue
@@ -210,7 +211,7 @@ func NewSimulationDisableCmd() *cobra.Command {
 		Run: func(cmd *cobra.Command, args []string) {
 		Run: func(cmd *cobra.Command, args []string) {
 			if len(args) > 0 {
 			if len(args) > 0 {
 				for _, scenario := range args {
 				for _, scenario := range args {
-					isExcluded := inSlice(scenario, csConfig.Cscli.SimulationConfig.Exclusions)
+					isExcluded := slices.Contains(csConfig.Cscli.SimulationConfig.Exclusions, scenario)
 					if !*csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
 					if !*csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
 						log.Warningf("%s isn't in simulation mode", scenario)
 						log.Warningf("%s isn't in simulation mode", scenario)
 						continue
 						continue

+ 2 - 11
cmd/crowdsec-cli/utils.go

@@ -19,6 +19,7 @@ import (
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/cobra"
 	"github.com/texttheater/golang-levenshtein/levenshtein"
 	"github.com/texttheater/golang-levenshtein/levenshtein"
+	"golang.org/x/exp/slices"
 	"gopkg.in/yaml.v2"
 	"gopkg.in/yaml.v2"
 
 
 	"github.com/crowdsecurity/go-cs-lib/pkg/trace"
 	"github.com/crowdsecurity/go-cs-lib/pkg/trace"
@@ -37,15 +38,6 @@ func printHelp(cmd *cobra.Command) {
 	}
 	}
 }
 }
 
 
-func inSlice(s string, slice []string) bool {
-	for _, str := range slice {
-		if s == str {
-			return true
-		}
-	}
-	return false
-}
-
 func indexOf(s string, slice []string) int {
 func indexOf(s string, slice []string) int {
 	for i, elem := range slice {
 	for i, elem := range slice {
 		if s == elem {
 		if s == elem {
@@ -115,7 +107,7 @@ func compAllItems(itemType string, args []string, toComplete string) ([]string,
 	comp := make([]string, 0)
 	comp := make([]string, 0)
 	hubItems := cwhub.GetHubStatusForItemType(itemType, "", true)
 	hubItems := cwhub.GetHubStatusForItemType(itemType, "", true)
 	for _, item := range hubItems {
 	for _, item := range hubItems {
-		if !inSlice(item.Name, args) && strings.Contains(item.Name, toComplete) {
+		if !slices.Contains(args, item.Name) && strings.Contains(item.Name, toComplete) {
 			comp = append(comp, item.Name)
 			comp = append(comp, item.Name)
 		}
 		}
 	}
 	}
@@ -748,7 +740,6 @@ func getDBClient() (*database.Client, error) {
 	return ret, nil
 	return ret, nil
 }
 }
 
 
-
 func removeFromSlice(val string, slice []string) []string {
 func removeFromSlice(val string, slice []string) []string {
 	var i int
 	var i int
 	var value string
 	var value string

+ 4 - 3
go.mod

@@ -51,8 +51,8 @@ require (
 	github.com/sirupsen/logrus v1.9.2
 	github.com/sirupsen/logrus v1.9.2
 	github.com/spf13/cobra v1.7.0
 	github.com/spf13/cobra v1.7.0
 	github.com/stretchr/testify v1.8.3
 	github.com/stretchr/testify v1.8.3
-	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
-	golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
+	golang.org/x/crypto v0.1.0
+	golang.org/x/mod v0.6.0
 	google.golang.org/grpc v1.47.0
 	google.golang.org/grpc v1.47.0
 	google.golang.org/protobuf v1.28.1
 	google.golang.org/protobuf v1.28.1
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
@@ -71,6 +71,7 @@ require (
 	github.com/bluele/gcache v0.0.2
 	github.com/bluele/gcache v0.0.2
 	github.com/cespare/xxhash/v2 v2.1.2
 	github.com/cespare/xxhash/v2 v2.1.2
 	github.com/coreos/go-systemd/v22 v22.5.0
 	github.com/coreos/go-systemd/v22 v22.5.0
+	github.com/crowdsecurity/go-cs-lib v0.0.0-20230522120244-fa545c12e7ee
 	github.com/goccy/go-yaml v1.9.7
 	github.com/goccy/go-yaml v1.9.7
 	github.com/gofrs/uuid v4.0.0+incompatible
 	github.com/gofrs/uuid v4.0.0+incompatible
 	github.com/golang-jwt/jwt/v4 v4.2.0
 	github.com/golang-jwt/jwt/v4 v4.2.0
@@ -84,6 +85,7 @@ require (
 	github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c
 	github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c
 	github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26
 	github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26
 	github.com/wasilibs/go-re2 v0.2.1
 	github.com/wasilibs/go-re2 v0.2.1
+	golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
 	golang.org/x/sys v0.7.0
 	golang.org/x/sys v0.7.0
 	gopkg.in/yaml.v3 v3.0.1
 	gopkg.in/yaml.v3 v3.0.1
 	k8s.io/apiserver v0.22.5
 	k8s.io/apiserver v0.22.5
@@ -101,7 +103,6 @@ require (
 	github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
 	github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
 	github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
-	github.com/crowdsecurity/go-cs-lib v0.0.0-20230522120244-fa545c12e7ee // indirect
 	github.com/docker/distribution v2.8.2+incompatible // indirect
 	github.com/docker/distribution v2.8.2+incompatible // indirect
 	github.com/docker/go-units v0.4.0 // indirect
 	github.com/docker/go-units v0.4.0 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect

+ 6 - 3
go.sum

@@ -1011,8 +1011,9 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1023,6 +1024,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
+golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1045,8 +1048,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
+golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
 golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

+ 4 - 2
pkg/alertcontext/alertcontext.go

@@ -7,10 +7,12 @@ import (
 
 
 	"github.com/antonmedv/expr"
 	"github.com/antonmedv/expr"
 	"github.com/antonmedv/expr/vm"
 	"github.com/antonmedv/expr/vm"
+	log "github.com/sirupsen/logrus"
+	"golang.org/x/exp/slices"
+
 	"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
 	"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
 	"github.com/crowdsecurity/crowdsec/pkg/models"
 	"github.com/crowdsecurity/crowdsec/pkg/models"
 	"github.com/crowdsecurity/crowdsec/pkg/types"
 	"github.com/crowdsecurity/crowdsec/pkg/types"
-	log "github.com/sirupsen/logrus"
 )
 )
 
 
 const (
 const (
@@ -131,7 +133,7 @@ func EventToContext(events []types.Event) (models.Meta, []error) {
 					errors = append(errors, fmt.Errorf("unexpected return type for %s : %T", key, output))
 					errors = append(errors, fmt.Errorf("unexpected return type for %s : %T", key, output))
 					continue
 					continue
 				}
 				}
-				if val != "" && !types.InSlice(val, tmpContext[key]) {
+				if val != "" && !slices.Contains(tmpContext[key], val) {
 					tmpContext[key] = append(tmpContext[key], val)
 					tmpContext[key] = append(tmpContext[key], val)
 				}
 				}
 			}
 			}

+ 2 - 1
pkg/apiserver/apic.go

@@ -15,6 +15,7 @@ import (
 	"github.com/go-openapi/strfmt"
 	"github.com/go-openapi/strfmt"
 	"github.com/pkg/errors"
 	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
 	log "github.com/sirupsen/logrus"
+	"golang.org/x/exp/slices"
 	"gopkg.in/tomb.v2"
 	"gopkg.in/tomb.v2"
 
 
 	"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
 	"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
@@ -84,7 +85,7 @@ func (a *apic) FetchScenariosListFromDB() ([]string, error) {
 		machineScenarios := strings.Split(v.Scenarios, ",")
 		machineScenarios := strings.Split(v.Scenarios, ",")
 		log.Debugf("%d scenarios for machine %d", len(machineScenarios), v.ID)
 		log.Debugf("%d scenarios for machine %d", len(machineScenarios), v.ID)
 		for _, sv := range machineScenarios {
 		for _, sv := range machineScenarios {
-			if !types.InSlice(sv, scenarios) && sv != "" {
+			if !slices.Contains(scenarios, sv) && sv != "" {
 				scenarios = append(scenarios, sv)
 				scenarios = append(scenarios, sv)
 			}
 			}
 		}
 		}

+ 0 - 9
pkg/types/utils.go

@@ -192,15 +192,6 @@ func BoolPtr(b bool) *bool {
 	return &b
 	return &b
 }
 }
 
 
-func InSlice(str string, slice []string) bool {
-	for _, item := range slice {
-		if str == item {
-			return true
-		}
-	}
-	return false
-}
-
 func UtcNow() time.Time {
 func UtcNow() time.Time {
 	return time.Now().UTC()
 	return time.Now().UTC()
 }
 }