1// Licensed under the Apache License, Version 2.0 (the "License"); 2// you may not use this file except in compliance with the License. 3// You may obtain a copy of the License at 4// 5// http://www.apache.org/licenses/LICENSE-2.0 6// 7// Unless required by applicable law or agreed to in writing, software 8// distributed under the License is distributed on an "AS IS" BASIS, 9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10// See the License for the specific language governing permissions and 11// limitations under the License. 12 13package gosec 14 15import ( 16 "go/ast" 17 "reflect" 18) 19 20// The Rule interface used by all rules supported by gosec. 21type Rule interface { 22 ID() string 23 Match(ast.Node, *Context) (*Issue, error) 24} 25 26// RuleBuilder is used to register a rule definition with the analyzer 27type RuleBuilder func(id string, c Config) (Rule, []ast.Node) 28 29// A RuleSet maps lists of rules to the type of AST node they should be run on. 30// The analyzer will only invoke rules contained in the list associated with the 31// type of AST node it is currently visiting. 32type RuleSet map[reflect.Type][]Rule 33 34// NewRuleSet constructs a new RuleSet 35func NewRuleSet() RuleSet { 36 return make(RuleSet) 37} 38 39// Register adds a trigger for the supplied rule for the the 40// specified ast nodes. 41func (r RuleSet) Register(rule Rule, nodes ...ast.Node) { 42 for _, n := range nodes { 43 t := reflect.TypeOf(n) 44 if rules, ok := r[t]; ok { 45 r[t] = append(rules, rule) 46 } else { 47 r[t] = []Rule{rule} 48 } 49 } 50} 51 52// RegisteredFor will return all rules that are registered for a 53// specified ast node. 54func (r RuleSet) RegisteredFor(n ast.Node) []Rule { 55 if rules, found := r[reflect.TypeOf(n)]; found { 56 return rules 57 } 58 return []Rule{} 59} 60