4
0

directory.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package cmd
  2. import (
  3. "time"
  4. "github.com/rs/zerolog/log"
  5. "github.com/spf13/cobra"
  6. "github.com/zricethezav/gitleaks/v8/report"
  7. "github.com/zricethezav/gitleaks/v8/sources"
  8. )
  9. func init() {
  10. rootCmd.AddCommand(directoryCmd)
  11. directoryCmd.Flags().Bool("follow-symlinks", false, "scan files that are symlinks to other files")
  12. }
  13. var directoryCmd = &cobra.Command{
  14. Use: "dir [flags] [path]",
  15. Aliases: []string{"file", "directory"},
  16. Short: "scan directories or files for secrets",
  17. Run: runDirectory,
  18. }
  19. func runDirectory(cmd *cobra.Command, args []string) {
  20. // grab source
  21. source := "."
  22. if len(args) == 1 {
  23. source = args[0]
  24. if source == "" {
  25. source = "."
  26. }
  27. }
  28. initConfig(source)
  29. var (
  30. findings []report.Finding
  31. err error
  32. )
  33. // setup config (aka, the thing that defines rules)
  34. cfg := Config(cmd)
  35. // start timer
  36. start := time.Now()
  37. detector := Detector(cmd, cfg, source)
  38. // set exit code
  39. exitCode, err := cmd.Flags().GetInt("exit-code")
  40. if err != nil {
  41. log.Fatal().Err(err).Msg("could not get exit code")
  42. }
  43. var paths <-chan sources.ScanTarget
  44. paths, err = sources.DirectoryTargets(source, detector.Sema, detector.FollowSymlinks)
  45. if err != nil {
  46. log.Fatal().Err(err)
  47. }
  48. findings, err = detector.DetectFiles(paths)
  49. if err != nil {
  50. // don't exit on error, just log it
  51. log.Error().Err(err).Msg("failed scan directory")
  52. }
  53. findingSummaryAndExit(findings, cmd, cfg, exitCode, start, err)
  54. }