github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/terraform/options.go (about) 1 package terraform 2 3 import ( 4 "strings" 5 6 "github.com/khulnasoft-lab/defsec/pkg/scan" 7 "github.com/khulnasoft-lab/defsec/pkg/scanners/options" 8 "github.com/khulnasoft-lab/defsec/pkg/scanners/terraform/executor" 9 "github.com/khulnasoft-lab/defsec/pkg/scanners/terraform/parser" 10 "github.com/khulnasoft-lab/defsec/pkg/severity" 11 "github.com/khulnasoft-lab/defsec/pkg/state" 12 ) 13 14 type ConfigurableTerraformScanner interface { 15 options.ConfigurableScanner 16 SetForceAllDirs(bool) 17 AddExecutorOptions(options ...executor.Option) 18 AddParserOptions(options ...options.ParserOption) 19 SetEmbeddedLibrariesEnabled(enabled bool) 20 } 21 22 func ScannerWithTFVarsPaths(paths ...string) options.ScannerOption { 23 return func(s options.ConfigurableScanner) { 24 if tf, ok := s.(ConfigurableTerraformScanner); ok { 25 tf.AddParserOptions(parser.OptionWithTFVarsPaths(paths...)) 26 } 27 } 28 } 29 30 func ScannerWithAlternativeIDProvider(f func(string) []string) options.ScannerOption { 31 return func(s options.ConfigurableScanner) { 32 if tf, ok := s.(ConfigurableTerraformScanner); ok { 33 tf.AddExecutorOptions(executor.OptionWithAlternativeIDProvider(f)) 34 } 35 } 36 } 37 38 func ScannerWithSeverityOverrides(overrides map[string]string) options.ScannerOption { 39 return func(s options.ConfigurableScanner) { 40 if tf, ok := s.(ConfigurableTerraformScanner); ok { 41 tf.AddExecutorOptions(executor.OptionWithSeverityOverrides(overrides)) 42 } 43 } 44 } 45 46 func ScannerWithNoIgnores() options.ScannerOption { 47 return func(s options.ConfigurableScanner) { 48 if tf, ok := s.(ConfigurableTerraformScanner); ok { 49 tf.AddExecutorOptions(executor.OptionNoIgnores()) 50 } 51 } 52 } 53 54 func ScannerWithExcludedRules(ruleIDs []string) options.ScannerOption { 55 return func(s options.ConfigurableScanner) { 56 if tf, ok := s.(ConfigurableTerraformScanner); ok { 57 tf.AddExecutorOptions(executor.OptionExcludeRules(ruleIDs)) 58 } 59 } 60 } 61 62 func ScannerWithExcludeIgnores(ruleIDs []string) options.ScannerOption { 63 return func(s options.ConfigurableScanner) { 64 if tf, ok := s.(ConfigurableTerraformScanner); ok { 65 tf.AddExecutorOptions(executor.OptionExcludeIgnores(ruleIDs)) 66 } 67 } 68 } 69 70 func ScannerWithIncludedRules(ruleIDs []string) options.ScannerOption { 71 return func(s options.ConfigurableScanner) { 72 if tf, ok := s.(ConfigurableTerraformScanner); ok { 73 tf.AddExecutorOptions(executor.OptionIncludeRules(ruleIDs)) 74 } 75 } 76 } 77 78 func ScannerWithStopOnRuleErrors(stop bool) options.ScannerOption { 79 return func(s options.ConfigurableScanner) { 80 if tf, ok := s.(ConfigurableTerraformScanner); ok { 81 tf.AddExecutorOptions(executor.OptionStopOnErrors(stop)) 82 } 83 } 84 } 85 86 func ScannerWithWorkspaceName(name string) options.ScannerOption { 87 return func(s options.ConfigurableScanner) { 88 if tf, ok := s.(ConfigurableTerraformScanner); ok { 89 tf.AddParserOptions(parser.OptionWithWorkspaceName(name)) 90 tf.AddExecutorOptions(executor.OptionWithWorkspaceName(name)) 91 } 92 } 93 } 94 95 func ScannerWithSingleThread(single bool) options.ScannerOption { 96 return func(s options.ConfigurableScanner) { 97 if tf, ok := s.(ConfigurableTerraformScanner); ok { 98 tf.AddExecutorOptions(executor.OptionWithSingleThread(single)) 99 } 100 } 101 } 102 103 func ScannerWithAllDirectories(all bool) options.ScannerOption { 104 return func(s options.ConfigurableScanner) { 105 if tf, ok := s.(ConfigurableTerraformScanner); ok { 106 tf.SetForceAllDirs(all) 107 } 108 } 109 } 110 111 func ScannerWithStopOnHCLError(stop bool) options.ScannerOption { 112 return func(s options.ConfigurableScanner) { 113 if tf, ok := s.(ConfigurableTerraformScanner); ok { 114 tf.AddParserOptions(parser.OptionStopOnHCLError(stop)) 115 } 116 } 117 } 118 119 func ScannerWithSkipDownloaded(skip bool) options.ScannerOption { 120 return func(s options.ConfigurableScanner) { 121 if !skip { 122 return 123 } 124 if tf, ok := s.(ConfigurableTerraformScanner); ok { 125 tf.AddExecutorOptions(executor.OptionWithResultsFilter(func(results scan.Results) scan.Results { 126 for i, result := range results { 127 prefix := result.Range().GetSourcePrefix() 128 switch { 129 case prefix == "": 130 case strings.HasPrefix(prefix, "."): 131 default: 132 results[i].OverrideStatus(scan.StatusIgnored) 133 } 134 } 135 return results 136 })) 137 } 138 } 139 } 140 141 func ScannerWithResultsFilter(f func(scan.Results) scan.Results) options.ScannerOption { 142 return func(s options.ConfigurableScanner) { 143 if tf, ok := s.(ConfigurableTerraformScanner); ok { 144 tf.AddExecutorOptions(executor.OptionWithResultsFilter(f)) 145 } 146 } 147 } 148 149 func ScannerWithMinimumSeverity(minimum severity.Severity) options.ScannerOption { 150 min := severityAsOrdinal(minimum) 151 return func(s options.ConfigurableScanner) { 152 if tf, ok := s.(ConfigurableTerraformScanner); ok { 153 tf.AddExecutorOptions(executor.OptionWithResultsFilter(func(results scan.Results) scan.Results { 154 for i, result := range results { 155 if severityAsOrdinal(result.Severity()) < min { 156 results[i].OverrideStatus(scan.StatusIgnored) 157 } 158 } 159 return results 160 })) 161 } 162 } 163 } 164 165 func severityAsOrdinal(sev severity.Severity) int { 166 switch sev { 167 case severity.Critical: 168 return 4 169 case severity.High: 170 return 3 171 case severity.Medium: 172 return 2 173 case severity.Low: 174 return 1 175 default: 176 return 0 177 } 178 } 179 180 func ScannerWithStateFunc(f ...func(*state.State)) options.ScannerOption { 181 return func(s options.ConfigurableScanner) { 182 if tf, ok := s.(ConfigurableTerraformScanner); ok { 183 tf.AddExecutorOptions(executor.OptionWithStateFunc(f...)) 184 } 185 } 186 } 187 188 func ScannerWithDownloadsAllowed(allowed bool) options.ScannerOption { 189 return func(s options.ConfigurableScanner) { 190 if tf, ok := s.(ConfigurableTerraformScanner); ok { 191 tf.AddParserOptions(parser.OptionWithDownloads(allowed)) 192 } 193 } 194 } 195 196 func ScannerWithEmbeddedLibraries(embedded bool) options.ScannerOption { 197 return func(s options.ConfigurableScanner) { 198 if tf, ok := s.(ConfigurableTerraformScanner); ok { 199 tf.SetEmbeddedLibrariesEnabled(embedded) 200 } 201 } 202 }