4
0

gitlab.go 2.3 KB

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