validate.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // == WARNING ==
  2. // These functions are used to generate GitLeak's default config.
  3. // You are free to use these in your own project, HOWEVER, no API stability is guaranteed.
  4. package utils
  5. import (
  6. "github.com/rs/zerolog/log"
  7. "github.com/zricethezav/gitleaks/v8/config"
  8. "github.com/zricethezav/gitleaks/v8/detect"
  9. "strings"
  10. )
  11. func Validate(rule config.Rule, truePositives []string, falsePositives []string) *config.Rule {
  12. r := &rule
  13. d := createSingleRuleDetector(r)
  14. for _, tp := range truePositives {
  15. if len(d.DetectString(tp)) != 1 {
  16. log.Fatal().
  17. Str("rule", r.RuleID).
  18. Str("value", tp).
  19. Str("regex", r.Regex.String()).
  20. Msg("Failed to Validate. True positive was not detected by regex.")
  21. }
  22. }
  23. for _, fp := range falsePositives {
  24. if len(d.DetectString(fp)) != 0 {
  25. log.Fatal().
  26. Str("rule", r.RuleID).
  27. Str("value", fp).
  28. Str("regex", r.Regex.String()).
  29. Msg("Failed to Validate. False positive was detected by regex.")
  30. }
  31. }
  32. return r
  33. }
  34. func ValidateWithPaths(rule config.Rule, truePositives map[string]string, falsePositives map[string]string) *config.Rule {
  35. r := &rule
  36. d := createSingleRuleDetector(r)
  37. for path, tp := range truePositives {
  38. f := detect.Fragment{Raw: tp, FilePath: path}
  39. if len(d.Detect(f)) != 1 {
  40. log.Fatal().
  41. Str("rule", r.RuleID).
  42. Str("value", tp).
  43. Str("regex", r.Regex.String()).
  44. Str("path", r.Path.String()).
  45. Msg("Failed to Validate. True positive was not detected by regex and/or path.")
  46. }
  47. }
  48. for path, fp := range falsePositives {
  49. f := detect.Fragment{Raw: fp, FilePath: path}
  50. if len(d.Detect(f)) != 0 {
  51. log.Fatal().
  52. Str("rule", r.RuleID).
  53. Str("value", fp).
  54. Str("regex", r.Regex.String()).
  55. Str("path", r.Path.String()).
  56. Msg("Failed to Validate. False positive was detected by regex and/or path.")
  57. }
  58. }
  59. return r
  60. }
  61. func createSingleRuleDetector(r *config.Rule) *detect.Detector {
  62. // normalize keywords like in the config package
  63. var (
  64. uniqueKeywords = make(map[string]struct{})
  65. keywords []string
  66. )
  67. for _, keyword := range r.Keywords {
  68. k := strings.ToLower(keyword)
  69. if _, ok := uniqueKeywords[k]; ok {
  70. continue
  71. }
  72. keywords = append(keywords, k)
  73. uniqueKeywords[k] = struct{}{}
  74. }
  75. r.Keywords = keywords
  76. rules := map[string]config.Rule{
  77. r.RuleID: *r,
  78. }
  79. return detect.NewDetector(config.Config{
  80. Rules: rules,
  81. Keywords: uniqueKeywords,
  82. })
  83. }