directory.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package cmd
  2. import (
  3. "context"
  4. "time"
  5. "github.com/spf13/cobra"
  6. "github.com/zricethezav/gitleaks/v8/logging"
  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. initDiagnostics()
  30. var err error
  31. // setup config (aka, the thing that defines rules)
  32. cfg := Config(cmd)
  33. // start timer
  34. start := time.Now()
  35. detector := Detector(cmd, cfg, source)
  36. // set follow symlinks flag
  37. if detector.FollowSymlinks, err = cmd.Flags().GetBool("follow-symlinks"); err != nil {
  38. logging.Fatal().Err(err).Send()
  39. }
  40. // set exit code
  41. exitCode, err := cmd.Flags().GetInt("exit-code")
  42. if err != nil {
  43. logging.Fatal().Err(err).Msg("could not get exit code")
  44. }
  45. findings, err := detector.DetectSource(
  46. context.Background(),
  47. &sources.Files{
  48. Config: &cfg,
  49. FollowSymlinks: detector.FollowSymlinks,
  50. MaxFileSize: detector.MaxTargetMegaBytes * 1_000_000,
  51. Path: source,
  52. Sema: detector.Sema,
  53. MaxArchiveDepth: detector.MaxArchiveDepth,
  54. },
  55. )
  56. if err != nil {
  57. logging.Error().Err(err).Msg("failed scan directory")
  58. }
  59. findingSummaryAndExit(detector, findings, exitCode, start, err)
  60. }