@@ -280,6 +280,43 @@ func reqOrgMembership() macaron.Handler {
280280 }
281281}
282282
283+ // reqTeamMembership user should be an team member, or a site admin
284+ func reqTeamMembership () macaron.Handler {
285+ return func (ctx * context.APIContext ) {
286+ if ctx .User .IsAdmin {
287+ return
288+ }
289+ if ctx .Org .Team == nil {
290+ ctx .Error (500 , "" , "reqTeamMembership: unprepared context" )
291+ return
292+ }
293+
294+ var orgID = ctx .Org .Team .OrgID
295+ isOwner , err := models .IsOrganizationOwner (orgID , ctx .User .ID )
296+ if err != nil {
297+ ctx .Error (500 , "IsOrganizationOwner" , err )
298+ return
299+ } else if isOwner {
300+ return
301+ }
302+
303+ if isTeamMember , err := models .IsTeamMember (orgID , ctx .Org .Team .ID , ctx .User .ID ); err != nil {
304+ ctx .Error (500 , "IsTeamMember" , err )
305+ return
306+ } else if ! isTeamMember {
307+ isOrgMember , err := models .IsOrganizationMember (orgID , ctx .User .ID )
308+ if err != nil {
309+ ctx .Error (500 , "IsOrganizationMember" , err )
310+ } else if isOrgMember {
311+ ctx .Error (403 , "" , "Must be a team member" )
312+ } else {
313+ ctx .Status (404 )
314+ }
315+ return
316+ }
317+ }
318+ }
319+
283320func reqOrgOwnership () macaron.Handler {
284321 return func (ctx * context.APIContext ) {
285322 var orgID int64
@@ -686,7 +723,7 @@ func RegisterRoutes(m *macaron.Macaron) {
686723 Put (org .AddTeamRepository ).
687724 Delete (org .RemoveTeamRepository )
688725 })
689- }, orgAssignment (false , true ), reqToken (), reqOrgMembership ())
726+ }, orgAssignment (false , true ), reqToken (), reqTeamMembership ())
690727
691728 m .Any ("/*" , func (ctx * context.Context ) {
692729 ctx .Error (404 )
0 commit comments