@@ -13,6 +13,7 @@ import (
13
13
"code.gitea.io/gitea/models/perm"
14
14
"code.gitea.io/gitea/models/unit"
15
15
user_model "code.gitea.io/gitea/models/user"
16
+ "code.gitea.io/gitea/modules/setting"
16
17
"code.gitea.io/gitea/modules/structs"
17
18
)
18
19
@@ -52,69 +53,84 @@ func packageAssignment(ctx *Context, errCb func(int, string, interface{})) {
52
53
Owner : ctx .ContextUser ,
53
54
}
54
55
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
+
55
92
if ctx .Package .Owner .IsOrganization () {
56
93
org := organization .OrgFromUser (ctx .Package .Owner )
57
94
58
95
// 1. Get user max authorize level for the org (may be none, if user is not member of the org)
59
96
if ctx .Doer != nil {
60
97
var err error
61
- ctx . Package . AccessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
98
+ accessMode , err = org .GetOrgUserMaxAuthorizeLevel (ctx .Doer .ID )
62
99
if err != nil {
63
- errCb (http .StatusInternalServerError , "GetOrgUserMaxAuthorizeLevel" , err )
64
- return
100
+ return accessMode , err
65
101
}
66
102
// 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 {
68
104
teams , err := organization .GetUserOrgTeams (ctx , org .ID , ctx .Doer .ID )
69
105
if err != nil {
70
- errCb (http .StatusInternalServerError , "GetUserOrgTeams" , err )
71
- return
106
+ return accessMode , err
72
107
}
73
108
for _ , t := range teams {
74
109
perm := t .UnitAccessModeCtx (ctx , unit .TypePackages )
75
- if ctx . Package . AccessMode < perm {
76
- ctx . Package . AccessMode = perm
110
+ if accessMode < perm {
111
+ accessMode = perm
77
112
}
78
113
}
79
114
}
80
115
}
81
116
// 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
84
119
}
85
120
} else {
86
121
if ctx .Doer != nil && ! ctx .Doer .IsGhost () {
87
122
// 1. Check if user is package owner
88
123
if ctx .Doer .ID == ctx .Package .Owner .ID {
89
- ctx . Package . AccessMode = perm .AccessModeOwner
124
+ accessMode = perm .AccessModeOwner
90
125
} 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
92
127
}
93
128
} 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
95
130
}
96
131
}
97
132
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
118
134
}
119
135
120
136
// PackageContexter initializes a package context for a request.
0 commit comments