@@ -14,6 +14,7 @@ import (
1414 "code.gitea.io/gitea/models/perm"
1515 "code.gitea.io/gitea/models/unit"
1616 user_model "code.gitea.io/gitea/models/user"
17+ "code.gitea.io/gitea/modules/setting"
1718 "code.gitea.io/gitea/modules/structs"
1819 "code.gitea.io/gitea/modules/templates"
1920)
@@ -54,69 +55,84 @@ func packageAssignment(ctx *Context, errCb func(int, string, interface{})) {
5455 Owner : ctx .ContextUser ,
5556 }
5657
58+ var err error
59+ ctx .Package .AccessMode , err = determineAccessMode (ctx )
60+ if err != nil {
61+ errCb (http .StatusInternalServerError , "determineAccessMode" , err )
62+ return
63+ }
64+
65+ packageType := ctx .Params ("type" )
66+ name := ctx .Params ("name" )
67+ version := ctx .Params ("version" )
68+ if packageType != "" && name != "" && version != "" {
69+ pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .Type (packageType ), name , version )
70+ if err != nil {
71+ if err == packages_model .ErrPackageNotExist {
72+ errCb (http .StatusNotFound , "GetVersionByNameAndVersion" , err )
73+ } else {
74+ errCb (http .StatusInternalServerError , "GetVersionByNameAndVersion" , err )
75+ }
76+ return
77+ }
78+
79+ ctx .Package .Descriptor , err = packages_model .GetPackageDescriptor (ctx , pv )
80+ if err != nil {
81+ errCb (http .StatusInternalServerError , "GetPackageDescriptor" , err )
82+ return
83+ }
84+ }
85+ }
86+
87+ func determineAccessMode (ctx * Context ) (perm.AccessMode , error ) {
88+ accessMode := perm .AccessModeNone
89+
90+ if setting .Service .RequireSignInView && ctx .Doer == nil {
91+ return accessMode , nil
92+ }
93+
5794 if ctx .Package .Owner .IsOrganization () {
5895 org := organization .OrgFromUser (ctx .Package .Owner )
5996
6097 // 1. Get user max authorize level for the org (may be none, if user is not member of the org)
6198 if ctx .Doer != nil {
6299 var err error
63- ctx . Package . AccessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
100+ accessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
64101 if err != nil {
65- errCb (http .StatusInternalServerError , "GetOrgUserMaxAuthorizeLevel" , err )
66- return
102+ return accessMode , err
67103 }
68104 // If access mode is less than write check every team for more permissions
69- if ctx . Package . AccessMode < perm .AccessModeWrite {
105+ if accessMode < perm .AccessModeWrite {
70106 teams , err := organization .GetUserOrgTeams (ctx , org .ID , ctx .Doer .ID )
71107 if err != nil {
72- errCb (http .StatusInternalServerError , "GetUserOrgTeams" , err )
73- return
108+ return accessMode , err
74109 }
75110 for _ , t := range teams {
76111 perm := t .UnitAccessModeCtx (ctx , unit .TypePackages )
77- if ctx . Package . AccessMode < perm {
78- ctx . Package . AccessMode = perm
112+ if accessMode < perm {
113+ accessMode = perm
79114 }
80115 }
81116 }
82117 }
83118 // 2. If authorize level is none, check if org is visible to user
84- if ctx . Package . AccessMode == perm .AccessModeNone && organization .HasOrgOrUserVisible (ctx , ctx .Package .Owner , ctx .Doer ) {
85- ctx . Package . AccessMode = perm .AccessModeRead
119+ if accessMode == perm .AccessModeNone && organization .HasOrgOrUserVisible (ctx , ctx .Package .Owner , ctx .Doer ) {
120+ accessMode = perm .AccessModeRead
86121 }
87122 } else {
88123 if ctx .Doer != nil && ! ctx .Doer .IsGhost () {
89124 // 1. Check if user is package owner
90125 if ctx .Doer .ID == ctx .Package .Owner .ID {
91- ctx . Package . AccessMode = perm .AccessModeOwner
126+ accessMode = perm .AccessModeOwner
92127 } else if ctx .Package .Owner .Visibility == structs .VisibleTypePublic || ctx .Package .Owner .Visibility == structs .VisibleTypeLimited { // 2. Check if package owner is public or limited
93- ctx . Package . AccessMode = perm .AccessModeRead
128+ accessMode = perm .AccessModeRead
94129 }
95130 } else if ctx .Package .Owner .Visibility == structs .VisibleTypePublic { // 3. Check if package owner is public
96- ctx . Package . AccessMode = perm .AccessModeRead
131+ accessMode = perm .AccessModeRead
97132 }
98133 }
99134
100- packageType := ctx .Params ("type" )
101- name := ctx .Params ("name" )
102- version := ctx .Params ("version" )
103- if packageType != "" && name != "" && version != "" {
104- pv , err := packages_model .GetVersionByNameAndVersion (ctx , ctx .Package .Owner .ID , packages_model .Type (packageType ), name , version )
105- if err != nil {
106- if err == packages_model .ErrPackageNotExist {
107- errCb (http .StatusNotFound , "GetVersionByNameAndVersion" , err )
108- } else {
109- errCb (http .StatusInternalServerError , "GetVersionByNameAndVersion" , err )
110- }
111- return
112- }
113-
114- ctx .Package .Descriptor , err = packages_model .GetPackageDescriptor (ctx , pv )
115- if err != nil {
116- errCb (http .StatusInternalServerError , "GetPackageDescriptor" , err )
117- return
118- }
119- }
135+ return accessMode , nil
120136}
121137
122138// PackageContexter initializes a package context for a request.
0 commit comments