directory.go 1.6 KB

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