Skip to content

Commit a3c75ac

Browse files
KN4CK3Rwxiaoguang6543
authored
Make NuGet service index publicly accessible (go-gitea#21242) (go-gitea#21277)
Backport of go-gitea#21242 Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: 6543 <[email protected]>
1 parent 14bc4d7 commit a3c75ac

File tree

2 files changed

+75
-53
lines changed

2 files changed

+75
-53
lines changed

integrations/api_packages_nuget_test.go

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
user_model "code.gitea.io/gitea/models/user"
2020
nuget_module "code.gitea.io/gitea/modules/packages/nuget"
2121
"code.gitea.io/gitea/modules/setting"
22+
"code.gitea.io/gitea/modules/structs"
2223
"code.gitea.io/gitea/routers/api/packages/nuget"
2324

2425
"github.com/stretchr/testify/assert"
@@ -65,39 +66,58 @@ func TestPackageNuGet(t *testing.T) {
6566
t.Run("ServiceIndex", func(t *testing.T) {
6667
defer PrintCurrentTest(t)()
6768

68-
req := NewRequest(t, "GET", fmt.Sprintf("%s/index.json", url))
69-
req = AddBasicAuthHeader(req, user.Name)
70-
MakeRequest(t, req, http.StatusOK)
69+
privateUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{Visibility: structs.VisibleTypePrivate}).(*user_model.User)
7170

72-
req = NewRequest(t, "GET", fmt.Sprintf("%s/index.json", url))
73-
req = addNuGetAPIKeyHeader(req, token)
74-
resp := MakeRequest(t, req, http.StatusOK)
71+
cases := []struct {
72+
Owner string
73+
UseBasicAuth bool
74+
UseTokenAuth bool
75+
}{
76+
{privateUser.Name, false, false},
77+
{privateUser.Name, true, false},
78+
{privateUser.Name, false, true},
79+
{user.Name, false, false},
80+
{user.Name, true, false},
81+
{user.Name, false, true},
82+
}
7583

76-
var result nuget.ServiceIndexResponse
77-
DecodeJSON(t, resp, &result)
84+
for _, c := range cases {
85+
url := fmt.Sprintf("/api/packages/%s/nuget", c.Owner)
7886

79-
assert.Equal(t, "3.0.0", result.Version)
80-
assert.NotEmpty(t, result.Resources)
81-
82-
root := setting.AppURL + url[1:]
83-
for _, r := range result.Resources {
84-
switch r.Type {
85-
case "SearchQueryService":
86-
fallthrough
87-
case "SearchQueryService/3.0.0-beta":
88-
fallthrough
89-
case "SearchQueryService/3.0.0-rc":
90-
assert.Equal(t, root+"/query", r.ID)
91-
case "RegistrationsBaseUrl":
92-
fallthrough
93-
case "RegistrationsBaseUrl/3.0.0-beta":
94-
fallthrough
95-
case "RegistrationsBaseUrl/3.0.0-rc":
96-
assert.Equal(t, root+"/registration", r.ID)
97-
case "PackageBaseAddress/3.0.0":
98-
assert.Equal(t, root+"/package", r.ID)
99-
case "PackagePublish/2.0.0":
100-
assert.Equal(t, root, r.ID)
87+
req := NewRequest(t, "GET", fmt.Sprintf("%s/index.json", url))
88+
if c.UseBasicAuth {
89+
req = AddBasicAuthHeader(req, user.Name)
90+
} else if c.UseTokenAuth {
91+
req = addNuGetAPIKeyHeader(req, token)
92+
}
93+
resp := MakeRequest(t, req, http.StatusOK)
94+
95+
var result nuget.ServiceIndexResponse
96+
DecodeJSON(t, resp, &result)
97+
98+
assert.Equal(t, "3.0.0", result.Version)
99+
assert.NotEmpty(t, result.Resources)
100+
101+
root := setting.AppURL + url[1:]
102+
for _, r := range result.Resources {
103+
switch r.Type {
104+
case "SearchQueryService":
105+
fallthrough
106+
case "SearchQueryService/3.0.0-beta":
107+
fallthrough
108+
case "SearchQueryService/3.0.0-rc":
109+
assert.Equal(t, root+"/query", r.ID)
110+
case "RegistrationsBaseUrl":
111+
fallthrough
112+
case "RegistrationsBaseUrl/3.0.0-beta":
113+
fallthrough
114+
case "RegistrationsBaseUrl/3.0.0-rc":
115+
assert.Equal(t, root+"/registration", r.ID)
116+
case "PackageBaseAddress/3.0.0":
117+
assert.Equal(t, root+"/package", r.ID)
118+
case "PackagePublish/2.0.0":
119+
assert.Equal(t, root, r.ID)
120+
}
101121
}
102122
}
103123
})

routers/api/packages/api.go

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func Routes() *web.Route {
6666
r.Get("/p2/{vendorname}/{projectname}.json", composer.PackageMetadata)
6767
r.Get("/files/{package}/{version}/{filename}", composer.DownloadPackageFile)
6868
r.Put("", reqPackageAccess(perm.AccessModeWrite), composer.UploadPackage)
69-
})
69+
}, reqPackageAccess(perm.AccessModeRead))
7070
r.Group("/conan", func() {
7171
r.Group("/v1", func() {
7272
r.Get("/ping", conan.Ping)
@@ -154,7 +154,7 @@ func Routes() *web.Route {
154154
}, conan.ExtractPathParameters)
155155
})
156156
})
157-
})
157+
}, reqPackageAccess(perm.AccessModeRead))
158158
r.Group("/generic", func() {
159159
r.Group("/{packagename}/{packageversion}/{filename}", func() {
160160
r.Get("", generic.DownloadPackageFile)
@@ -163,33 +163,35 @@ func Routes() *web.Route {
163163
r.Delete("", generic.DeletePackage)
164164
}, reqPackageAccess(perm.AccessModeWrite))
165165
})
166-
})
166+
}, reqPackageAccess(perm.AccessModeRead))
167167
r.Group("/helm", func() {
168168
r.Get("/index.yaml", helm.Index)
169169
r.Get("/{filename}", helm.DownloadPackageFile)
170170
r.Post("/api/charts", reqPackageAccess(perm.AccessModeWrite), helm.UploadPackage)
171-
})
171+
}, reqPackageAccess(perm.AccessModeRead))
172172
r.Group("/maven", func() {
173173
r.Put("/*", reqPackageAccess(perm.AccessModeWrite), maven.UploadPackageFile)
174174
r.Get("/*", maven.DownloadPackageFile)
175-
})
175+
}, reqPackageAccess(perm.AccessModeRead))
176176
r.Group("/nuget", func() {
177-
r.Get("/index.json", nuget.ServiceIndex)
178-
r.Get("/query", nuget.SearchService)
179-
r.Group("/registration/{id}", func() {
180-
r.Get("/index.json", nuget.RegistrationIndex)
181-
r.Get("/{version}", nuget.RegistrationLeaf)
182-
})
183-
r.Group("/package/{id}", func() {
184-
r.Get("/index.json", nuget.EnumeratePackageVersions)
185-
r.Get("/{version}/{filename}", nuget.DownloadPackageFile)
186-
})
177+
r.Get("/index.json", nuget.ServiceIndex) // Needs to be unauthenticated for the NuGet client.
187178
r.Group("", func() {
188-
r.Put("/", nuget.UploadPackage)
189-
r.Put("/symbolpackage", nuget.UploadSymbolPackage)
190-
r.Delete("/{id}/{version}", nuget.DeletePackage)
191-
}, reqPackageAccess(perm.AccessModeWrite))
192-
r.Get("/symbols/{filename}/{guid:[0-9a-f]{32}}FFFFFFFF/{filename2}", nuget.DownloadSymbolFile)
179+
r.Get("/query", nuget.SearchService)
180+
r.Group("/registration/{id}", func() {
181+
r.Get("/index.json", nuget.RegistrationIndex)
182+
r.Get("/{version}", nuget.RegistrationLeaf)
183+
})
184+
r.Group("/package/{id}", func() {
185+
r.Get("/index.json", nuget.EnumeratePackageVersions)
186+
r.Get("/{version}/{filename}", nuget.DownloadPackageFile)
187+
})
188+
r.Group("", func() {
189+
r.Put("/", nuget.UploadPackage)
190+
r.Put("/symbolpackage", nuget.UploadSymbolPackage)
191+
r.Delete("/{id}/{version}", nuget.DeletePackage)
192+
}, reqPackageAccess(perm.AccessModeWrite))
193+
r.Get("/symbols/{filename}/{guid:[0-9a-f]{32}}FFFFFFFF/{filename2}", nuget.DownloadSymbolFile)
194+
}, reqPackageAccess(perm.AccessModeRead))
193195
})
194196
r.Group("/npm", func() {
195197
r.Group("/@{scope}/{id}", func() {
@@ -216,12 +218,12 @@ func Routes() *web.Route {
216218
r.Delete("", npm.DeletePackageTag)
217219
}, reqPackageAccess(perm.AccessModeWrite))
218220
})
219-
})
221+
}, reqPackageAccess(perm.AccessModeRead))
220222
r.Group("/pypi", func() {
221223
r.Post("/", reqPackageAccess(perm.AccessModeWrite), pypi.UploadPackageFile)
222224
r.Get("/files/{id}/{version}/{filename}", pypi.DownloadPackageFile)
223225
r.Get("/simple/{id}", pypi.PackageMetadata)
224-
})
226+
}, reqPackageAccess(perm.AccessModeRead))
225227
r.Group("/rubygems", func() {
226228
r.Get("/specs.4.8.gz", rubygems.EnumeratePackages)
227229
r.Get("/latest_specs.4.8.gz", rubygems.EnumeratePackagesLatest)
@@ -233,7 +235,7 @@ func Routes() *web.Route {
233235
r.Delete("/yank", rubygems.DeletePackage)
234236
}, reqPackageAccess(perm.AccessModeWrite))
235237
})
236-
}, context_service.UserAssignmentWeb(), context.PackageAssignment(), reqPackageAccess(perm.AccessModeRead))
238+
}, context_service.UserAssignmentWeb(), context.PackageAssignment())
237239

238240
return r
239241
}

0 commit comments

Comments
 (0)