Skip to content

Commit 74bbec3

Browse files
ethantkoeniglunny
authored andcommitted
Fix permission bugs in team API (#647)
1 parent fcf02e4 commit 74bbec3

File tree

4 files changed

+137
-121
lines changed

4 files changed

+137
-121
lines changed

models/user.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ func (u *User) IsUserOrgOwner(orgID int64) bool {
470470
return IsOrganizationOwner(orgID, u.ID)
471471
}
472472

473-
// IsPublicMember returns true if user public his/her membership in give organization.
473+
// IsPublicMember returns true if user public his/her membership in given organization.
474474
func (u *User) IsPublicMember(orgID int64) bool {
475475
return IsPublicMembership(orgID, u.ID)
476476
}

routers/api/v1/admin/org_team.go

Lines changed: 0 additions & 88 deletions
This file was deleted.

routers/api/v1/api.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,8 @@ func RegisterRoutes(m *macaron.Macaron) {
405405
Put(org.PublicizeMember).
406406
Delete(org.ConcealMember)
407407
})
408-
m.Combo("/teams").Get(org.ListTeams)
408+
m.Combo("/teams").Get(org.ListTeams).
409+
Post("", bind(api.CreateTeamOption{}), org.CreateTeam)
409410
m.Group("/hooks", func() {
410411
m.Combo("").Get(org.ListHooks).
411412
Post(bind(api.CreateHookOption{}), org.CreateHook)
@@ -415,9 +416,19 @@ func RegisterRoutes(m *macaron.Macaron) {
415416
}, reqOrgMembership())
416417
}, orgAssignment(true))
417418
m.Group("/teams/:teamid", func() {
418-
m.Get("", org.GetTeam)
419-
m.Get("/members", org.GetTeamMembers)
420-
m.Get("/repos", org.GetTeamRepos)
419+
m.Combo("").Get(org.GetTeam).
420+
Patch(bind(api.EditTeamOption{}), org.EditTeam).
421+
Delete(org.DeleteTeam)
422+
m.Group("/members", func() {
423+
m.Get("", org.GetTeamMembers)
424+
m.Combo("/:username").Put(org.AddTeamMember).
425+
Delete(org.RemoveTeamMember)
426+
})
427+
m.Group("/repos", func() {
428+
m.Get("", org.GetTeamRepos)
429+
m.Combo("/:reponame").Put(admin.AddTeamRepository).
430+
Delete(admin.RemoveTeamRepository)
431+
})
421432
}, orgAssignment(false, true))
422433

423434
m.Any("/*", func(ctx *context.Context) {
@@ -427,7 +438,6 @@ func RegisterRoutes(m *macaron.Macaron) {
427438
m.Group("/admin", func() {
428439
m.Group("/users", func() {
429440
m.Post("", bind(api.CreateUserOption{}), admin.CreateUser)
430-
431441
m.Group("/:username", func() {
432442
m.Combo("").Patch(bind(api.EditUserOption{}), admin.EditUser).
433443
Delete(admin.DeleteUser)
@@ -436,20 +446,6 @@ func RegisterRoutes(m *macaron.Macaron) {
436446
m.Post("/repos", bind(api.CreateRepoOption{}), admin.CreateRepo)
437447
})
438448
})
439-
440-
m.Group("/orgs/:orgname", func() {
441-
m.Group("/teams", func() {
442-
m.Post("", orgAssignment(true), bind(api.CreateTeamOption{}), admin.CreateTeam)
443-
})
444-
})
445-
m.Group("/teams", func() {
446-
m.Group("/:teamid", func() {
447-
m.Combo("").Patch(bind(api.EditTeamOption{}), admin.EditTeam).
448-
Delete(admin.DeleteTeam)
449-
m.Combo("/members/:username").Put(admin.AddTeamMember).Delete(admin.RemoveTeamMember)
450-
m.Combo("/repos/:reponame").Put(admin.AddTeamRepository).Delete(admin.RemoveTeamRepository)
451-
}, orgAssignment(false, true))
452-
})
453449
}, reqAdmin())
454450
}, context.APIContexter())
455451
}

routers/api/v1/org/team.go

Lines changed: 121 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@ import (
1010
"code.gitea.io/gitea/models"
1111
"code.gitea.io/gitea/modules/context"
1212
"code.gitea.io/gitea/routers/api/v1/convert"
13+
"code.gitea.io/gitea/routers/api/v1/user"
1314
)
1415

1516
// ListTeams list all the teams of an organization
1617
func ListTeams(ctx *context.APIContext) {
1718
org := ctx.Org.Organization
19+
if !org.IsOrgMember(ctx.User.ID) {
20+
ctx.Error(403, "", "Must be a member of the organization")
21+
return
22+
}
1823
if err := org.GetTeams(); err != nil {
1924
ctx.Error(500, "GetTeams", err)
2025
return
@@ -29,26 +34,20 @@ func ListTeams(ctx *context.APIContext) {
2934

3035
// GetTeam api for get a team
3136
func GetTeam(ctx *context.APIContext) {
32-
ctx.JSON(200, convert.ToTeam(ctx.Org.Team))
33-
}
34-
35-
// GetTeamMembers api for get a team's members
36-
func GetTeamMembers(ctx *context.APIContext) {
37-
team := ctx.Org.Team
38-
if err := team.GetMembers(); err != nil {
39-
ctx.Error(500, "GetTeamMembers", err)
37+
if !models.IsOrganizationMember(ctx.Org.Team.OrgID, ctx.User.ID) {
38+
ctx.Status(404)
4039
return
4140
}
42-
members := make([]*api.User, len(team.Members))
43-
for i, member := range team.Members {
44-
members[i] = member.APIFormat()
45-
}
46-
ctx.JSON(200, members)
41+
ctx.JSON(200, convert.ToTeam(ctx.Org.Team))
4742
}
4843

4944
// GetTeamRepos api for get a team's repos
5045
func GetTeamRepos(ctx *context.APIContext) {
5146
team := ctx.Org.Team
47+
if !models.IsOrganizationMember(team.OrgID, ctx.User.ID) {
48+
ctx.Status(404)
49+
return
50+
}
5251
if err := team.GetRepositories(); err != nil {
5352
ctx.Error(500, "GetTeamRepos", err)
5453
}
@@ -63,3 +62,112 @@ func GetTeamRepos(ctx *context.APIContext) {
6362
}
6463
ctx.JSON(200, repos)
6564
}
65+
66+
// CreateTeam api for create a team
67+
func CreateTeam(ctx *context.APIContext, form api.CreateTeamOption) {
68+
if !ctx.Org.Organization.IsOrgMember(ctx.User.ID) {
69+
ctx.Error(403, "", "Must be an organization member")
70+
}
71+
team := &models.Team{
72+
OrgID: ctx.Org.Organization.ID,
73+
Name: form.Name,
74+
Description: form.Description,
75+
Authorize: models.ParseAccessMode(form.Permission),
76+
}
77+
if err := models.NewTeam(team); err != nil {
78+
if models.IsErrTeamAlreadyExist(err) {
79+
ctx.Error(422, "", err)
80+
} else {
81+
ctx.Error(500, "NewTeam", err)
82+
}
83+
return
84+
}
85+
86+
ctx.JSON(201, convert.ToTeam(team))
87+
}
88+
89+
// EditTeam api for edit a team
90+
func EditTeam(ctx *context.APIContext, form api.EditTeamOption) {
91+
if !ctx.User.IsUserOrgOwner(ctx.Org.Team.OrgID) {
92+
ctx.Error(403, "", "Must be an organization owner")
93+
return
94+
}
95+
team := &models.Team{
96+
ID: ctx.Org.Team.ID,
97+
OrgID: ctx.Org.Team.OrgID,
98+
Name: form.Name,
99+
Description: form.Description,
100+
Authorize: models.ParseAccessMode(form.Permission),
101+
}
102+
if err := models.UpdateTeam(team, true); err != nil {
103+
ctx.Error(500, "EditTeam", err)
104+
return
105+
}
106+
ctx.JSON(200, convert.ToTeam(team))
107+
}
108+
109+
// DeleteTeam api for delete a team
110+
func DeleteTeam(ctx *context.APIContext) {
111+
if !ctx.User.IsUserOrgOwner(ctx.Org.Team.OrgID) {
112+
ctx.Error(403, "", "Must be an organization owner")
113+
return
114+
}
115+
if err := models.DeleteTeam(ctx.Org.Team); err != nil {
116+
ctx.Error(500, "DeleteTeam", err)
117+
return
118+
}
119+
ctx.Status(204)
120+
}
121+
122+
// GetTeamMembers api for get a team's members
123+
func GetTeamMembers(ctx *context.APIContext) {
124+
if !models.IsOrganizationMember(ctx.Org.Team.OrgID, ctx.User.ID) {
125+
ctx.Status(404)
126+
return
127+
}
128+
team := ctx.Org.Team
129+
if err := team.GetMembers(); err != nil {
130+
ctx.Error(500, "GetTeamMembers", err)
131+
return
132+
}
133+
members := make([]*api.User, len(team.Members))
134+
for i, member := range team.Members {
135+
members[i] = member.APIFormat()
136+
}
137+
ctx.JSON(200, members)
138+
}
139+
140+
// AddTeamMember api for add a member to a team
141+
func AddTeamMember(ctx *context.APIContext) {
142+
if !ctx.User.IsUserOrgOwner(ctx.Org.Team.OrgID) {
143+
ctx.Error(403, "", "Must be an organization owner")
144+
return
145+
}
146+
u := user.GetUserByParams(ctx)
147+
if ctx.Written() {
148+
return
149+
}
150+
if err := ctx.Org.Team.AddMember(u.ID); err != nil {
151+
ctx.Error(500, "AddMember", err)
152+
return
153+
}
154+
ctx.Status(204)
155+
}
156+
157+
// RemoveTeamMember api for remove one member from a team
158+
func RemoveTeamMember(ctx *context.APIContext) {
159+
if !ctx.User.IsUserOrgOwner(ctx.Org.Team.OrgID) {
160+
ctx.Error(403, "", "Must be an organization owner")
161+
return
162+
}
163+
u := user.GetUserByParams(ctx)
164+
if ctx.Written() {
165+
return
166+
}
167+
168+
if err := ctx.Org.Team.RemoveMember(u.ID); err != nil {
169+
ctx.Error(500, "RemoveMember", err)
170+
return
171+
}
172+
ctx.Status(204)
173+
}

0 commit comments

Comments
 (0)