4
0

protect.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package cmd
  2. import (
  3. "time"
  4. "github.com/spf13/cobra"
  5. "github.com/zricethezav/gitleaks/v8/cmd/scm"
  6. "github.com/zricethezav/gitleaks/v8/detect"
  7. "github.com/zricethezav/gitleaks/v8/logging"
  8. "github.com/zricethezav/gitleaks/v8/report"
  9. "github.com/zricethezav/gitleaks/v8/sources"
  10. )
  11. func init() {
  12. protectCmd.Flags().Bool("staged", false, "detect secrets in a --staged state")
  13. protectCmd.Flags().String("log-opts", "", "git log options")
  14. protectCmd.Flags().StringP("source", "s", ".", "path to source")
  15. rootCmd.AddCommand(protectCmd)
  16. }
  17. var protectCmd = &cobra.Command{
  18. Use: "protect",
  19. Short: "protect secrets in code",
  20. Run: runProtect,
  21. Hidden: true,
  22. }
  23. func runProtect(cmd *cobra.Command, args []string) {
  24. // start timer
  25. start := time.Now()
  26. source := mustGetStringFlag(cmd, "source")
  27. // setup config (aka, the thing that defines rules)
  28. initConfig(source)
  29. initDiagnostics()
  30. cfg := Config(cmd)
  31. // create detector
  32. detector := Detector(cmd, cfg, source)
  33. // parse flags
  34. exitCode := mustGetIntFlag(cmd, "exit-code")
  35. staged := mustGetBoolFlag(cmd, "staged")
  36. // start git scan
  37. var (
  38. findings []report.Finding
  39. err error
  40. gitCmd *sources.GitCmd
  41. remote *detect.RemoteInfo
  42. )
  43. if gitCmd, err = sources.NewGitDiffCmdContext(cmd.Context(), source, staged); err != nil {
  44. logging.Fatal().Err(err).Msg("could not create Git diff cmd")
  45. }
  46. remote = &detect.RemoteInfo{Platform: scm.NoPlatform}
  47. if findings, err = detector.DetectGit(gitCmd, remote); err != nil {
  48. // don't exit on error, just log it
  49. logging.Error().Err(err).Msg("failed to scan Git repository")
  50. }
  51. findingSummaryAndExit(detector, findings, exitCode, start, err)
  52. }