parent.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package scan
  2. import (
  3. "io/ioutil"
  4. "path/filepath"
  5. "github.com/zricethezav/gitleaks/v7/report"
  6. "github.com/go-git/go-git/v5"
  7. log "github.com/sirupsen/logrus"
  8. )
  9. // ParentScanner is a parent directory scanner
  10. type ParentScanner struct {
  11. BaseScanner
  12. }
  13. // NewParentScanner creates and returns a directory scanner
  14. func NewParentScanner(base BaseScanner) *ParentScanner {
  15. ds := &ParentScanner{
  16. BaseScanner: base,
  17. }
  18. ds.scannerType = typeDirScanner
  19. return ds
  20. }
  21. // Scan kicks off a ParentScanner scan. This uses the directory from --path to discovery repos
  22. func (ds *ParentScanner) Scan() (report.Report, error) {
  23. var scannerReport report.Report
  24. log.Debugf("scanning repos in %s\n", ds.opts.Path)
  25. files, err := ioutil.ReadDir(ds.opts.Path)
  26. if err != nil {
  27. return scannerReport, err
  28. }
  29. for _, f := range files {
  30. if !f.IsDir() {
  31. continue
  32. }
  33. repo, err := git.PlainOpen(filepath.Join(ds.opts.Path, f.Name()))
  34. if err != nil {
  35. if err.Error() == "repository does not exist" {
  36. log.Debugf("%s is not a git repository", f.Name())
  37. continue
  38. }
  39. return scannerReport, err
  40. }
  41. skip := false
  42. for _, allowListedRepo := range ds.cfg.Allowlist.Repos {
  43. if regexMatched(f.Name(), allowListedRepo) {
  44. skip = true
  45. }
  46. }
  47. if skip {
  48. continue
  49. }
  50. rs := NewRepoScanner(ds.BaseScanner, repo)
  51. rs.repoName = f.Name()
  52. repoReport, err := rs.Scan()
  53. if err != nil {
  54. return scannerReport, err
  55. }
  56. scannerReport.Leaks = append(scannerReport.Leaks, repoReport.Leaks...)
  57. scannerReport.Commits += repoReport.Commits
  58. }
  59. return scannerReport, nil
  60. }