Skip to content

Commit 0a9a86b

Browse files
KN4CK3Rlafrikswxiaoguang
authored
Respect REQUIRE_SIGNIN_VIEW for packages (#20873)
Fix #20863 When REQUIRE_SIGNIN_VIEW = true, even with public repositories, you can only see them after you login. The packages should not be accessed without login. Co-authored-by: Lauris BH <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
1 parent d9bc688 commit 0a9a86b

File tree

2 files changed

+62
-33
lines changed

2 files changed

+62
-33
lines changed

modules/context/package.go

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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.

tests/integration/api_packages_generic_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"code.gitea.io/gitea/models/packages"
1515
"code.gitea.io/gitea/models/unittest"
1616
user_model "code.gitea.io/gitea/models/user"
17+
"code.gitea.io/gitea/modules/setting"
1718
"code.gitea.io/gitea/tests"
1819

1920
"github.com/stretchr/testify/assert"
@@ -126,6 +127,18 @@ func TestPackageGeneric(t *testing.T) {
126127
req := NewRequest(t, "GET", url+"/not.found")
127128
MakeRequest(t, req, http.StatusNotFound)
128129
})
130+
131+
t.Run("RequireSignInView", func(t *testing.T) {
132+
defer tests.PrintCurrentTest(t)()
133+
134+
setting.Service.RequireSignInView = true
135+
defer func() {
136+
setting.Service.RequireSignInView = false
137+
}()
138+
139+
req = NewRequest(t, "GET", url+"/dummy.bin")
140+
MakeRequest(t, req, http.StatusUnauthorized)
141+
})
129142
})
130143

131144
t.Run("Delete", func(t *testing.T) {

0 commit comments

Comments
 (0)