@@ -13,6 +13,7 @@ import (
1313 "code.gitea.io/gitea/models/perm"
1414 "code.gitea.io/gitea/models/unit"
1515 user_model "code.gitea.io/gitea/models/user"
16+ "code.gitea.io/gitea/modules/setting"
1617 "code.gitea.io/gitea/modules/structs"
1718)
1819
@@ -52,69 +53,84 @@ func packageAssignment(ctx *Context, errCb func(int, string, interface{})) {
5253 Owner : ctx .ContextUser ,
5354 }
5455
56+ var err error
57+ ctx .Package .AccessMode , err = determineAccessMode (ctx )
58+ if err != nil {
59+ errCb (http .StatusInternalServerError , "determineAccessMode" , err )
60+ return
61+ }
62+
63+ packageType := ctx .Params ("type" )
64+ name := ctx .Params ("name" )
65+ version := ctx .Params ("version" )
66+ if packageType != "" && name != "" && version != "" {
67+ pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .Type (packageType ), name , version )
68+ if err != nil {
69+ if err == packages_model .ErrPackageNotExist {
70+ errCb (http .StatusNotFound , "GetVersionByNameAndVersion" , err )
71+ } else {
72+ errCb (http .StatusInternalServerError , "GetVersionByNameAndVersion" , err )
73+ }
74+ return
75+ }
76+
77+ ctx .Package .Descriptor , err = packages_model .GetPackageDescriptor (ctx , pv )
78+ if err != nil {
79+ errCb (http .StatusInternalServerError , "GetPackageDescriptor" , err )
80+ return
81+ }
82+ }
83+ }
84+
85+ func determineAccessMode (ctx * Context ) (perm.AccessMode , error ) {
86+ accessMode := perm .AccessModeNone
87+
88+ if setting .Service .RequireSignInView && ctx .Doer == nil {
89+ return accessMode , nil
90+ }
91+
5592 if ctx .Package .Owner .IsOrganization () {
5693 org := organization .OrgFromUser (ctx .Package .Owner )
5794
5895 // 1. Get user max authorize level for the org (may be none, if user is not member of the org)
5996 if ctx .Doer != nil {
6097 var err error
61- ctx . Package . AccessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
98+ accessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
6299 if err != nil {
63- errCb (http .StatusInternalServerError , "GetOrgUserMaxAuthorizeLevel" , err )
64- return
100+ return accessMode , err
65101 }
66102 // If access mode is less than write check every team for more permissions
67- if ctx . Package . AccessMode < perm .AccessModeWrite {
103+ if accessMode < perm .AccessModeWrite {
68104 teams , err := organization .GetUserOrgTeams (ctx , org .ID , ctx .Doer .ID )
69105 if err != nil {
70- errCb (http .StatusInternalServerError , "GetUserOrgTeams" , err )
71- return
106+ return accessMode , err
72107 }
73108 for _ , t := range teams {
74109 perm := t .UnitAccessModeCtx (ctx , unit .TypePackages )
75- if ctx . Package . AccessMode < perm {
76- ctx . Package . AccessMode = perm
110+ if accessMode < perm {
111+ accessMode = perm
77112 }
78113 }
79114 }
80115 }
81116 // 2. If authorize level is none, check if org is visible to user
82- if ctx . Package . AccessMode == perm .AccessModeNone && organization .HasOrgOrUserVisible (ctx , ctx .Package .Owner , ctx .Doer ) {
83- ctx . Package . AccessMode = perm .AccessModeRead
117+ if accessMode == perm .AccessModeNone && organization .HasOrgOrUserVisible (ctx , ctx .Package .Owner , ctx .Doer ) {
118+ accessMode = perm .AccessModeRead
84119 }
85120 } else {
86121 if ctx .Doer != nil && ! ctx .Doer .IsGhost () {
87122 // 1. Check if user is package owner
88123 if ctx .Doer .ID == ctx .Package .Owner .ID {
89- ctx . Package . AccessMode = perm .AccessModeOwner
124+ accessMode = perm .AccessModeOwner
90125 } else if ctx .Package .Owner .Visibility == structs .VisibleTypePublic || ctx .Package .Owner .Visibility == structs .VisibleTypeLimited { // 2. Check if package owner is public or limited
91- ctx . Package . AccessMode = perm .AccessModeRead
126+ accessMode = perm .AccessModeRead
92127 }
93128 } else if ctx .Package .Owner .Visibility == structs .VisibleTypePublic { // 3. Check if package owner is public
94- ctx . Package . AccessMode = perm .AccessModeRead
129+ accessMode = perm .AccessModeRead
95130 }
96131 }
97132
98- packageType := ctx .Params ("type" )
99- name := ctx .Params ("name" )
100- version := ctx .Params ("version" )
101- if packageType != "" && name != "" && version != "" {
102- pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .Type (packageType ), name , version )
103- if err != nil {
104- if err == packages_model .ErrPackageNotExist {
105- errCb (http .StatusNotFound , "GetVersionByNameAndVersion" , err )
106- } else {
107- errCb (http .StatusInternalServerError , "GetVersionByNameAndVersion" , err )
108- }
109- return
110- }
111-
112- ctx .Package .Descriptor , err = packages_model .GetPackageDescriptor (ctx , pv )
113- if err != nil {
114- errCb (http .StatusInternalServerError , "GetPackageDescriptor" , err )
115- return
116- }
117- }
133+ return accessMode , nil
118134}
119135
120136// PackageContexter initializes a package context for a request.
0 commit comments