gitlab.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package hosts
  2. import (
  3. "context"
  4. "fmt"
  5. log "github.com/sirupsen/logrus"
  6. "github.com/xanzy/go-gitlab"
  7. "github.com/zricethezav/gitleaks-ng/audit"
  8. "github.com/zricethezav/gitleaks-ng/manager"
  9. "github.com/zricethezav/gitleaks-ng/options"
  10. "sync"
  11. )
  12. type GitlabError struct {
  13. Err string
  14. Repo string
  15. Commit string
  16. }
  17. func (gitlabError *GitlabError) Error() string {
  18. return fmt.Sprintf("repo: %s, err: %s",
  19. gitlabError.Repo, gitlabError.Err)
  20. }
  21. type Gitlab struct {
  22. client *gitlab.Client
  23. errChan chan GitlabError
  24. manager manager.Manager
  25. ctx context.Context
  26. wg sync.WaitGroup
  27. }
  28. func NewGitlabClient(m manager.Manager) *Gitlab {
  29. return &Gitlab{
  30. manager: m,
  31. ctx: context.Background(),
  32. client: gitlab.NewClient(nil, options.GetAccessToken(m.Opts)),
  33. errChan: make(chan GitlabError),
  34. }
  35. }
  36. // Audit will audit a github user or organization's repos.
  37. func (g *Gitlab) Audit() {
  38. var (
  39. projects []*gitlab.Project
  40. resp *gitlab.Response
  41. err error
  42. )
  43. page := 1
  44. listOpts := gitlab.ListOptions{
  45. PerPage: 100,
  46. Page: page,
  47. }
  48. for {
  49. var _projects []*gitlab.Project
  50. if g.manager.Opts.User != "" {
  51. glOpts := &gitlab.ListProjectsOptions{
  52. ListOptions: listOpts,
  53. }
  54. projects, resp, err = g.client.Projects.ListUserProjects(g.manager.Opts.User, glOpts)
  55. } else if g.manager.Opts.Organization != "" {
  56. glOpts := &gitlab.ListGroupProjectsOptions{
  57. ListOptions: listOpts,
  58. }
  59. projects, resp, err = g.client.Groups.ListGroupProjects(g.manager.Opts.Organization, glOpts)
  60. }
  61. if err != nil {
  62. log.Error(err)
  63. }
  64. projects = append(projects, _projects...)
  65. if resp == nil {
  66. break
  67. }
  68. if page >= resp.TotalPages {
  69. // exit when we've seen all pages
  70. break
  71. }
  72. page = resp.NextPage
  73. }
  74. // iterate of gitlab projects
  75. for _, p := range projects {
  76. r := audit.NewRepo(&g.manager)
  77. cloneOpts := g.manager.CloneOptions
  78. cloneOpts.URL = p.HTTPURLToRepo
  79. err := r.Clone(cloneOpts)
  80. r.Name = p.Name
  81. if err = r.Audit(); err != nil {
  82. log.Error(err)
  83. }
  84. }
  85. }
  86. // Audit(MR)PR TODO
  87. func (g *Gitlab) AuditPR() {
  88. log.Error("AuditPR is not implemented in Gitlab host yet...")
  89. }