@@ -6,26 +6,41 @@ import (
66 "io/ioutil"
77 "log"
88 "strconv"
9+ "strings"
910 "sync"
1011
1112 "github.com/securego/gosec/v2"
1213 "github.com/securego/gosec/v2/rules"
1314 "golang.org/x/tools/go/analysis"
1415 "golang.org/x/tools/go/packages"
1516
17+ "github.com/golangci/golangci-lint/pkg/config"
1618 "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
1719 "github.com/golangci/golangci-lint/pkg/lint/linter"
1820 "github.com/golangci/golangci-lint/pkg/result"
1921)
2022
2123const gosecName = "gosec"
2224
23- func NewGosec () * goanalysis.Linter {
25+ func NewGosec (settings * config. GoSecSettings ) * goanalysis.Linter {
2426 var mu sync.Mutex
2527 var resIssues []goanalysis.Issue
2628
2729 gasConfig := gosec .NewConfig ()
28- enabledRules := rules .Generate ()
30+
31+ var filters []rules.RuleFilter
32+ if settings != nil {
33+ filters = gosecRuleFilters (settings .Includes , settings .Excludes )
34+
35+ for k , v := range settings .Config {
36+ // Uses ToUpper because the parsing of the map's key change the key to lowercase.
37+ // The value is not impacted by that: the case is respected.
38+ gasConfig .Set (strings .ToUpper (k ), v )
39+ }
40+ }
41+
42+ ruleDefinitions := rules .Generate (filters ... )
43+
2944 logger := log .New (ioutil .Discard , "" , 0 )
3045
3146 analyzer := & analysis.Analyzer {
@@ -40,7 +55,8 @@ func NewGosec() *goanalysis.Linter {
4055 ).WithContextSetter (func (lintCtx * linter.Context ) {
4156 analyzer .Run = func (pass * analysis.Pass ) (interface {}, error ) {
4257 gosecAnalyzer := gosec .NewAnalyzer (gasConfig , true , logger )
43- gosecAnalyzer .LoadRules (enabledRules .Builders ())
58+ gosecAnalyzer .LoadRules (ruleDefinitions .Builders ())
59+
4460 pkg := & packages.Package {
4561 Fset : pass .Fset ,
4662 Syntax : pass .Files ,
@@ -95,3 +111,18 @@ func NewGosec() *goanalysis.Linter {
95111 return resIssues
96112 }).WithLoadMode (goanalysis .LoadModeTypesInfo )
97113}
114+
115+ // based on https://github.com/securego/gosec/blob/569328eade2ccbad4ce2d0f21ee158ab5356a5cf/cmd/gosec/main.go#L170-L188
116+ func gosecRuleFilters (includes , excludes []string ) []rules.RuleFilter {
117+ var filters []rules.RuleFilter
118+
119+ if len (includes ) > 0 {
120+ filters = append (filters , rules .NewRuleFilter (false , includes ... ))
121+ }
122+
123+ if len (excludes ) > 0 {
124+ filters = append (filters , rules .NewRuleFilter (true , excludes ... ))
125+ }
126+
127+ return filters
128+ }
0 commit comments