@@ -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
290327func 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