Skip to content

Commit bdf3be5

Browse files
KN4CK3Rlafrikswxiaoguangtechknowlogick
authored
Respect REQUIRE_SIGNIN_VIEW for packages (#20873) (#21232)
Backport of #20873 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]> Co-authored-by: techknowlogick <[email protected]>
1 parent e50473e commit bdf3be5

File tree

2 files changed

+62
-33
lines changed

2 files changed

+62
-33
lines changed

integrations/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

1819
"github.com/stretchr/testify/assert"
1920
)
@@ -79,6 +80,18 @@ func TestPackageGeneric(t *testing.T) {
7980
assert.Equal(t, int64(1), pvs[0].DownloadCount)
8081
})
8182

83+
t.Run("RequireSignInView", func(t *testing.T) {
84+
defer PrintCurrentTest(t)()
85+
86+
setting.Service.RequireSignInView = true
87+
defer func() {
88+
setting.Service.RequireSignInView = false
89+
}()
90+
91+
req := NewRequest(t, "GET", url)
92+
MakeRequest(t, req, http.StatusUnauthorized)
93+
})
94+
8295
t.Run("Delete", func(t *testing.T) {
8396
defer PrintCurrentTest(t)()
8497

modules/context/package.go

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

Comments
 (0)