Skip to content

Commit 2198396

Browse files
mrsdizzietechknowlogick
authored andcommitted
Allow collaborators to view repo owned by private org (#6965) (#6968)
* Allow collaborators to view repo owned private org (#6965) Handle case where an orginization is private but a user who is not a member of the orgninization has been added as a collaborator of a repo within that org Fixes #6962 * Match release/v1.8 fixtures
1 parent e069a75 commit 2198396

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

integrations/org_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ func TestPrivateOrg(t *testing.T) {
9292
req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
9393
session.MakeRequest(t, req, http.StatusNotFound)
9494

95+
// non-org member who is collaborator on repo in private org
96+
session = loginUser(t, "user4")
97+
req = NewRequest(t, "GET", "/privated_org")
98+
session.MakeRequest(t, req, http.StatusNotFound)
99+
req = NewRequest(t, "GET", "/privated_org/public_repo_on_private_org") // colab of this repo
100+
session.MakeRequest(t, req, http.StatusOK)
101+
req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
102+
session.MakeRequest(t, req, http.StatusNotFound)
103+
95104
// site admin
96105
session = loginUser(t, "user1")
97106
req = NewRequest(t, "GET", "/privated_org")

models/fixtures/collaboration.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,9 @@
99
repo_id: 4
1010
user_id: 4
1111
mode: 2 # write
12+
13+
-
14+
id: 3
15+
repo_id: 38
16+
user_id: 4
17+
mode: 2 # write

models/repo_permission.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,17 @@ func getUserRepoPermission(e Engine, repo *Repository, user *User) (perm Permiss
107107
repo.mustOwner(e)
108108
}
109109

110-
if repo.Owner.IsOrganization() && !HasOrgVisible(repo.Owner, user) {
110+
var isCollaborator bool
111+
if user != nil {
112+
isCollaborator, err = repo.isCollaborator(e, user.ID)
113+
if err != nil {
114+
return perm, err
115+
}
116+
}
117+
118+
// Prevent strangers from checking out public repo of private orginization
119+
// Allow user if they are collaborator of a repo within a private orginization but not a member of the orginization itself
120+
if repo.Owner.IsOrganization() && !HasOrgVisible(repo.Owner, user) && !isCollaborator {
111121
perm.AccessMode = AccessModeNone
112122
return
113123
}
@@ -146,9 +156,7 @@ func getUserRepoPermission(e Engine, repo *Repository, user *User) (perm Permiss
146156
perm.UnitsMode = make(map[UnitType]AccessMode)
147157

148158
// Collaborators on organization
149-
if isCollaborator, err := repo.isCollaborator(e, user.ID); err != nil {
150-
return perm, err
151-
} else if isCollaborator {
159+
if isCollaborator {
152160
for _, u := range repo.Units {
153161
perm.UnitsMode[u.Type] = perm.AccessMode
154162
}

0 commit comments

Comments
 (0)