Skip to content

Commit 5bb0980

Browse files
KN4CK3Rwxiaoguang
andcommitted
Make NuGet service index publicly accessible (go-gitea#21242)
Addition to go-gitea#20734, Fixes go-gitea#20717 The `/index.json` endpoint needs to be accessible even if the registry is private. The NuGet client uses this endpoint without authentification. The old fix only works if the NuGet cli is used with `--source <name>` but not with `--source <url>/index.json`. Co-authored-by: wxiaoguang <[email protected]>
1 parent 43b4c38 commit 5bb0980

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})
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)