Skip to content

Commit f19f59a

Browse files
Modified Gitrob scan to include all GitHub organization private repositories.
1 parent 331a415 commit f19f59a

File tree

5 files changed

+83
-4
lines changed

5 files changed

+83
-4
lines changed

common/interfaces.go

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ package common
33
type IClient interface {
44
GetUserOrOrganization(login string) (*Owner, error)
55
GetRepositoriesFromOwner(target Owner) ([]*Repository, error)
6+
GetRepositoriesFromOrganization(target Owner) ([]*Repository, error)
67
GetOrganizationMembers(target Owner) ([]*Owner, error)
78
}

core/analysis.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,19 @@ func GatherRepositories(sess *Session) {
6464
for i := 0; i < threadNum; i++ {
6565
go func() {
6666
for {
67+
var repos []*common.Repository
68+
var err error
6769
target, ok := <-ch
6870
if !ok {
6971
wg.Done()
7072
return
7173
}
72-
repos, err := sess.Client.GetRepositoriesFromOwner(*target)
74+
//repos, err := sess.Client.GetRepositoriesFromOwner(*target)
75+
if *target.Type == "Organization" {
76+
repos, err = sess.Client.GetRepositoriesFromOrganization(*target)
77+
} else {
78+
repos, err = sess.Client.GetRepositoriesFromOwner(*target)
79+
}
7380
if err != nil {
7481
sess.Out.Error(" Failed to retrieve repositories from %s: %s\n", *target.Login, err)
7582
}
@@ -216,23 +223,25 @@ func findSecrets(sess *Session, repo *common.Repository, commit *object.Commit,
216223
func cloneRepository(sess *Session, repo *common.Repository, threadId int) (*git.Repository, string, error) {
217224
sess.Out.Debug("[THREAD #%d][%s] Cloning repository...\n", threadId, *repo.CloneURL)
218225

226+
userName := "oauth2"
227+
219228
cloneConfig := common.CloneConfiguration{
220229
Url: repo.CloneURL,
221230
Branch: repo.DefaultBranch,
222231
Depth: sess.Options.CommitDepth,
223-
Token: &sess.GitLab.AccessToken,
224232
InMemClone: sess.Options.InMemClone,
233+
Username: &userName,
225234
}
226235

227236
var clone *git.Repository
228237
var path string
229238
var err error
230239

231240
if sess.IsGithubSession {
241+
cloneConfig.Token = &sess.Github.AccessToken
232242
clone, path, err = github.CloneRepository(&cloneConfig)
233243
} else {
234-
userName := "oauth2"
235-
cloneConfig.Username = &userName
244+
cloneConfig.Token = &sess.GitLab.AccessToken
236245
clone, path, err = gitlab.CloneRepository(&cloneConfig)
237246
}
238247
if err != nil {

github/apiClient.go

+37
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,43 @@ func (c Client) GetRepositoriesFromOwner(target common.Owner) ([]*common.Reposit
8181
return allRepos, nil
8282
}
8383

84+
func (c Client) GetRepositoriesFromOrganization(target common.Owner) ([]*common.Repository, error) {
85+
var allRepos []*common.Repository
86+
ctx := context.Background()
87+
opt := &github.RepositoryListByOrgOptions{
88+
Type: "sources",
89+
}
90+
91+
for {
92+
repos, resp, err := c.apiClient.Repositories.ListByOrg(ctx, *target.Login, opt)
93+
if err != nil {
94+
return allRepos, err
95+
}
96+
for _, repo := range repos {
97+
if !*repo.Fork {
98+
r := common.Repository{
99+
Owner: repo.Owner.Login,
100+
ID: repo.ID,
101+
Name: repo.Name,
102+
FullName: repo.FullName,
103+
CloneURL: repo.SSHURL,
104+
URL: repo.HTMLURL,
105+
DefaultBranch: repo.DefaultBranch,
106+
Description: repo.Description,
107+
Homepage: repo.Homepage,
108+
}
109+
allRepos = append(allRepos, &r)
110+
}
111+
}
112+
if resp.NextPage == 0 {
113+
break
114+
}
115+
opt.Page = resp.NextPage
116+
}
117+
118+
return allRepos, nil
119+
}
120+
84121
func (c Client) GetOrganizationMembers(target common.Owner) ([]*common.Owner, error) {
85122
var allMembers []*common.Owner
86123
ctx := context.Background()

github/git.go

+9
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package github
22

33
import (
44
"fmt"
5+
"strings"
56
"gopkg.in/src-d/go-git.v4/storage/memory"
67
"io/ioutil"
78

89
"gitrob/common"
910

1011
"gopkg.in/src-d/go-git.v4"
1112
"gopkg.in/src-d/go-git.v4/plumbing"
13+
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
1214
)
1315

1416
func CloneRepository(cloneConfig *common.CloneConfiguration) (*git.Repository, string, error) {
@@ -19,8 +21,15 @@ func CloneRepository(cloneConfig *common.CloneConfiguration) (*git.Repository, s
1921
ReferenceName: plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", *cloneConfig.Branch)),
2022
SingleBranch: true,
2123
Tags: git.NoTags,
24+
Auth: &http.BasicAuth{
25+
Username: *cloneConfig.Username,
26+
Password: *cloneConfig.Token,
27+
},
2228
}
2329

30+
cloneOptions.URL = strings.Replace(cloneOptions.URL, "[email protected]:", "https://github.com/", -1)
31+
32+
2433
var repository *git.Repository
2534
var err error
2635
var dir string

gitlab/apiClient.go

+23
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,29 @@ func (c Client) GetRepositoriesFromOwner(target common.Owner) ([]*common.Reposit
112112
return allProjects, nil
113113
}
114114

115+
func (c Client) GetRepositoriesFromOrganization(target common.Owner) ([]*common.Repository, error) {
116+
var allProjects []*common.Repository
117+
id := int(*target.ID)
118+
if *target.Type == common.TargetTypeUser {
119+
userProjects, err := c.getUserProjects(id)
120+
if err != nil {
121+
return nil, err
122+
}
123+
for _, project := range userProjects {
124+
allProjects = append(allProjects, project)
125+
}
126+
} else {
127+
groupProjects, err := c.getGroupProjects(target)
128+
if err != nil {
129+
return nil, err
130+
}
131+
for _, project := range groupProjects {
132+
allProjects = append(allProjects, project)
133+
}
134+
}
135+
return allProjects, nil
136+
}
137+
115138
func (c Client) getUser(login string) (*gitlab.User, error) {
116139
users, _, err := c.apiClient.Users.ListUsers(&gitlab.ListUsersOptions{Username: gitlab.String(login)})
117140
if err != nil {

0 commit comments

Comments
 (0)