filesatcommit.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package scan
  2. import (
  3. "github.com/go-git/go-git/v5"
  4. "github.com/go-git/go-git/v5/plumbing/object"
  5. "github.com/zricethezav/gitleaks/v7/report"
  6. )
  7. // FilesAtCommitScanner is a files at commit scanner. This differs from CommitScanner
  8. // as CommitScanner generates patches that are scanned. FilesAtCommitScanner instead looks at
  9. // files available at a commit's worktree and scans the entire content of said files.
  10. // Apologies for the awful struct name...
  11. type FilesAtCommitScanner struct {
  12. BaseScanner
  13. repo *git.Repository
  14. commit *object.Commit
  15. repoName string
  16. }
  17. // NewFilesAtCommitScanner creates and returns a files at commit scanner
  18. func NewFilesAtCommitScanner(base BaseScanner, repo *git.Repository, commit *object.Commit) *FilesAtCommitScanner {
  19. fs := &FilesAtCommitScanner{
  20. BaseScanner: base,
  21. repo: repo,
  22. commit: commit,
  23. repoName: getRepoName(base.opts),
  24. }
  25. fs.scannerType = typeFilesAtCommitScanner
  26. return fs
  27. }
  28. // Scan kicks off a FilesAtCommitScanner Scan
  29. func (fs *FilesAtCommitScanner) Scan() (report.Report, error) {
  30. var scannerReport report.Report
  31. fIter, err := fs.commit.Files()
  32. if err != nil {
  33. return scannerReport, err
  34. }
  35. err = fIter.ForEach(func(f *object.File) error {
  36. bin, err := f.IsBinary()
  37. if bin {
  38. return nil
  39. } else if err != nil {
  40. return err
  41. }
  42. content, err := f.Contents()
  43. if err != nil {
  44. return err
  45. }
  46. scannerReport.Leaks = append(scannerReport.Leaks, checkRules(fs.BaseScanner, fs.commit, fs.repoName, f.Name, content)...)
  47. return nil
  48. })
  49. scannerReport.Commits = 1
  50. return scannerReport, err
  51. }