Skip to content

Commit 59be704

Browse files
lunnytechknowlogick
authored andcommitted
Fix team members API (#6714)
1 parent e0172f0 commit 59be704

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

integrations/api_team_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
func TestAPITeam(t *testing.T) {
1818
prepareTestEnv(t)
19+
1920
teamUser := models.AssertExistsAndLoadBean(t, &models.TeamUser{}).(*models.TeamUser)
2021
team := models.AssertExistsAndLoadBean(t, &models.Team{ID: teamUser.TeamID}).(*models.Team)
2122
user := models.AssertExistsAndLoadBean(t, &models.User{ID: teamUser.UID}).(*models.User)
@@ -29,4 +30,16 @@ func TestAPITeam(t *testing.T) {
2930
DecodeJSON(t, resp, &apiTeam)
3031
assert.EqualValues(t, team.ID, apiTeam.ID)
3132
assert.Equal(t, team.Name, apiTeam.Name)
33+
34+
// non team member user will not access the teams details
35+
teamUser2 := models.AssertExistsAndLoadBean(t, &models.TeamUser{ID: 3}).(*models.TeamUser)
36+
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: teamUser2.UID}).(*models.User)
37+
38+
session = loginUser(t, user2.Name)
39+
token = getTokenForLoggedInUser(t, session)
40+
req = NewRequestf(t, "GET", "/api/v1/teams/%d?token="+token, teamUser.TeamID)
41+
resp = session.MakeRequest(t, req, http.StatusForbidden)
42+
43+
req = NewRequestf(t, "GET", "/api/v1/teams/%d", teamUser.TeamID)
44+
resp = session.MakeRequest(t, req, http.StatusUnauthorized)
3245
}

routers/api/v1/api.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,43 @@ func reqOrgOwnership() macaron.Handler {
286286
}
287287
}
288288

289+
// reqTeamMembership user should be an team member, or a site admin
290+
func reqTeamMembership() macaron.Handler {
291+
return func(ctx *context.APIContext) {
292+
if ctx.Context.IsUserSiteAdmin() {
293+
return
294+
}
295+
if ctx.Org.Team == nil {
296+
ctx.Error(500, "", "reqTeamMembership: unprepared context")
297+
return
298+
}
299+
300+
var orgID = ctx.Org.Team.OrgID
301+
isOwner, err := models.IsOrganizationOwner(orgID, ctx.User.ID)
302+
if err != nil {
303+
ctx.Error(500, "IsOrganizationOwner", err)
304+
return
305+
} else if isOwner {
306+
return
307+
}
308+
309+
if isTeamMember, err := models.IsTeamMember(orgID, ctx.Org.Team.ID, ctx.User.ID); err != nil {
310+
ctx.Error(500, "IsTeamMember", err)
311+
return
312+
} else if !isTeamMember {
313+
isOrgMember, err := models.IsOrganizationMember(orgID, ctx.User.ID)
314+
if err != nil {
315+
ctx.Error(500, "IsOrganizationMember", err)
316+
} else if isOrgMember {
317+
ctx.Error(403, "", "Must be a team member")
318+
} else {
319+
ctx.NotFound()
320+
}
321+
return
322+
}
323+
}
324+
}
325+
289326
// reqOrgMembership user should be an organization member, or a site admin
290327
func reqOrgMembership() macaron.Handler {
291328
return func(ctx *context.APIContext) {
@@ -775,7 +812,7 @@ func RegisterRoutes(m *macaron.Macaron) {
775812
Put(org.AddTeamRepository).
776813
Delete(org.RemoveTeamRepository)
777814
})
778-
}, orgAssignment(false, true), reqToken(), reqOrgMembership())
815+
}, orgAssignment(false, true), reqToken(), reqTeamMembership())
779816

780817
m.Any("/*", func(ctx *context.APIContext) {
781818
ctx.NotFound()

0 commit comments

Comments
 (0)