report.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package manager
  2. import (
  3. "encoding/csv"
  4. "encoding/json"
  5. "os"
  6. "time"
  7. "github.com/zricethezav/gitleaks/v6/version"
  8. log "github.com/sirupsen/logrus"
  9. )
  10. // Report saves gitleaks leaks to a json specified by --report={report.json}
  11. func (manager *Manager) Report() error {
  12. close(manager.leakChan)
  13. close(manager.metadata.timings)
  14. if log.IsLevelEnabled(log.DebugLevel) {
  15. manager.DebugOutput()
  16. }
  17. if manager.Opts.Report != "" {
  18. if len(manager.GetLeaks()) == 0 {
  19. log.Infof("no leaks found, skipping writing report")
  20. return nil
  21. }
  22. file, err := os.Create(manager.Opts.Report)
  23. if err != nil {
  24. return err
  25. }
  26. switch manager.Opts.ReportFormat {
  27. case "json":
  28. encoder := json.NewEncoder(file)
  29. encoder.SetIndent("", " ")
  30. err = encoder.Encode(manager.leaks)
  31. if err != nil {
  32. return err
  33. }
  34. case "csv":
  35. w := csv.NewWriter(file)
  36. _ = w.Write([]string{"repo", "line", "commit", "offender", "rule", "tags", "commitMsg", "author", "email", "file", "date"})
  37. for _, leak := range manager.GetLeaks() {
  38. w.Write([]string{leak.Repo, leak.Line, leak.Commit, leak.Offender, leak.Rule, leak.Tags, leak.Message, leak.Author, leak.Email, leak.File, leak.Date.Format(time.RFC3339)})
  39. }
  40. w.Flush()
  41. case "sarif":
  42. s := Sarif{
  43. Schema: "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.5.json",
  44. Version: "2.1.0",
  45. Runs: []Runs{
  46. {
  47. Tool: Tool{
  48. Driver: Driver{
  49. Name: "Gitleaks",
  50. SemanticVersion: version.Version,
  51. Rules: manager.configToRules(),
  52. },
  53. },
  54. Results: manager.leaksToResults(),
  55. },
  56. },
  57. }
  58. encoder := json.NewEncoder(file)
  59. encoder.SetIndent("", " ")
  60. err = encoder.Encode(s)
  61. if err != nil {
  62. return err
  63. }
  64. }
  65. _ = file.Close()
  66. log.Infof("report written to %s", manager.Opts.Report)
  67. }
  68. return nil
  69. }