@@ -11,6 +11,7 @@ import (
1111 "code.gitea.io/gitea/models/organization"
1212 packages_model "code.gitea.io/gitea/models/packages"
1313 "code.gitea.io/gitea/models/perm"
14+ "code.gitea.io/gitea/models/unit"
1415 user_model "code.gitea.io/gitea/models/user"
1516 "code.gitea.io/gitea/modules/structs"
1617)
@@ -52,14 +53,30 @@ func packageAssignment(ctx *Context, errCb func(int, string, interface{})) {
5253 }
5354
5455 if ctx .Package .Owner .IsOrganization () {
56+ org := organization .OrgFromUser (ctx .Package .Owner )
57+
5558 // 1. Get user max authorize level for the org (may be none, if user is not member of the org)
5659 if ctx .Doer != nil {
5760 var err error
58- ctx .Package .AccessMode , err = organization . OrgFromUser ( ctx . Package . Owner ) .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
61+ ctx .Package .AccessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
5962 if err != nil {
6063 errCb (http .StatusInternalServerError , "GetOrgUserMaxAuthorizeLevel" , err )
6164 return
6265 }
66+ // If access mode is less than write check every team for more permissions
67+ if ctx .Package .AccessMode < perm .AccessModeWrite {
68+ teams , err := organization .GetUserOrgTeams (ctx , org .ID , ctx .Doer .ID )
69+ if err != nil {
70+ errCb (http .StatusInternalServerError , "GetUserOrgTeams" , err )
71+ return
72+ }
73+ for _ , t := range teams {
74+ perm := t .UnitAccessModeCtx (ctx , unit .TypePackages )
75+ if ctx .Package .AccessMode < perm {
76+ ctx .Package .AccessMode = perm
77+ }
78+ }
79+ }
6380 }
6481 // 2. If authorize level is none, check if org is visible to user
6582 if ctx .Package .AccessMode == perm .AccessModeNone && organization .HasOrgOrUserVisible (ctx , ctx .Package .Owner , ctx .Doer ) {
0 commit comments