generate.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. "fmt"
  7. "regexp"
  8. "strings"
  9. )
  10. const (
  11. // case insensitive prefix
  12. caseInsensitive = `(?i)`
  13. // identifier prefix (just an ignore group)
  14. identifierCaseInsensitivePrefix = `(?i:`
  15. identifierCaseInsensitiveSuffix = `)`
  16. identifierPrefix = `(?:`
  17. identifierSuffix = `)(?:[0-9a-z\-_\t .]{0,20})(?:[\s|']|[\s|"]){0,3}`
  18. // commonly used assignment operators or function call
  19. operator = `(?:=|>|:{1,3}=|\|\|:|<=|=>|:|\?=)`
  20. // boundaries for the secret
  21. // \x60 = `
  22. secretPrefixUnique = `\b(`
  23. secretPrefix = `(?:'|\"|\s|=|\x60){0,5}(`
  24. secretSuffix = `)(?:['|\"|\n|\r|\s|\x60|;]|$)`
  25. )
  26. func GenerateSemiGenericRegex(identifiers []string, secretRegex string, isCaseInsensitive bool) *regexp.Regexp {
  27. var sb strings.Builder
  28. // The identifiers should always be case-insensitive.
  29. // This is inelegant but prevents an extraneous `(?i:)` from being added to the pattern; it could be removed.
  30. if isCaseInsensitive {
  31. sb.WriteString(caseInsensitive)
  32. writeIdentifiers(&sb, identifiers)
  33. } else {
  34. sb.WriteString(identifierCaseInsensitivePrefix)
  35. writeIdentifiers(&sb, identifiers)
  36. sb.WriteString(identifierCaseInsensitiveSuffix)
  37. }
  38. sb.WriteString(operator)
  39. sb.WriteString(secretPrefix)
  40. sb.WriteString(secretRegex)
  41. sb.WriteString(secretSuffix)
  42. return regexp.MustCompile(sb.String())
  43. }
  44. func writeIdentifiers(sb *strings.Builder, identifiers []string) {
  45. sb.WriteString(identifierPrefix)
  46. sb.WriteString(strings.Join(identifiers, "|"))
  47. sb.WriteString(identifierSuffix)
  48. }
  49. func GenerateUniqueTokenRegex(secretRegex string, isCaseInsensitive bool) *regexp.Regexp {
  50. var sb strings.Builder
  51. if isCaseInsensitive {
  52. sb.WriteString(caseInsensitive)
  53. }
  54. sb.WriteString(secretPrefixUnique)
  55. sb.WriteString(secretRegex)
  56. sb.WriteString(secretSuffix)
  57. return regexp.MustCompile(sb.String())
  58. }
  59. func GenerateSampleSecret(identifier string, secret string) string {
  60. return fmt.Sprintf("%s_api_token = \"%s\"", identifier, secret)
  61. }