From a2f4b76ea069902724c408666a0665100452ad36 Mon Sep 17 00:00:00 2001 From: dragon Date: Mon, 30 Jun 2025 15:32:17 +0800 Subject: [PATCH 1/6] Fix RPM package download routing & Fix missing package version count --- routers/api/packages/api.go | 4 ++-- routers/web/user/package.go | 11 ++++++----- tests/integration/api_packages_rpm_test.go | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index f65c4b99ff88f..a5c1b31e27e86 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -467,8 +467,8 @@ func CommonRoutes() *web.Router { g.MatchPath("HEAD", "//repodata/", rpm.CheckRepositoryFileExistence) g.MatchPath("GET", "//repodata/", rpm.GetRepositoryFile) g.MatchPath("PUT", "//upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile) - g.MatchPath("HEAD,GET", "//package///", rpm.DownloadPackageFile) - g.MatchPath("DELETE", "//package///", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) + g.MatchPath("HEAD,GET", "//package////<*>", rpm.DownloadPackageFile) + g.MatchPath("DELETE", "//package////<*>", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/rubygems", func() { diff --git a/routers/web/user/package.go b/routers/web/user/package.go index fd33a81901fdc..a84b3002b1931 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -301,16 +301,17 @@ func ViewPackageVersion(ctx *context.Context) { PackageID: pd.Package.ID, IsTagged: true, }) - default: + } + if pd.Package.Type != packages_model.TypeContainer { pvs, pvsTotal, err = packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{ Paginator: db.NewAbsoluteListOptions(0, 5), PackageID: pd.Package.ID, IsInternal: optional.Some(false), }) - } - if err != nil { - ctx.ServerError("", err) - return + if err != nil { + ctx.ServerError("", err) + return + } } ctx.Data["LatestVersions"] = pvs diff --git a/tests/integration/api_packages_rpm_test.go b/tests/integration/api_packages_rpm_test.go index 469bd1fc6c7ce..880419bf96df8 100644 --- a/tests/integration/api_packages_rpm_test.go +++ b/tests/integration/api_packages_rpm_test.go @@ -157,7 +157,8 @@ gpgkey=%sapi/packages/%s/rpm/repository.key`, t.Run("Download", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture)) + rpmFileName := fmt.Sprintf("%s-%s-%s.rpm", packageName, packageVersion, packageArchitecture) + req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture, rpmFileName)) resp := MakeRequest(t, req, http.StatusOK) assert.Equal(t, content, resp.Body.Bytes()) From 215d7454258a473ac9e029ca5c35d1570b702a56 Mon Sep 17 00:00:00 2001 From: dragon Date: Mon, 30 Jun 2025 15:51:14 +0800 Subject: [PATCH 2/6] fix lint --- routers/web/user/package.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/routers/web/user/package.go b/routers/web/user/package.go index a84b3002b1931..216acdf927bc0 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -203,9 +203,6 @@ func ViewPackageVersion(ctx *context.Context) { } ctx.Data["PackageRegistryHost"] = registryHostURL.Host - var pvs []*packages_model.PackageVersion - pvsTotal := int64(0) - switch pd.Package.Type { case packages_model.TypeAlpine: branches := make(container.Set[string]) @@ -296,24 +293,26 @@ func ViewPackageVersion(ctx *context.Context) { } } ctx.Data["ContainerImageMetadata"] = imageMetadata + } + var pvs []*packages_model.PackageVersion + var pvsTotal int64 + if pd.Package.Type == packages_model.TypeContainer { pvs, pvsTotal, err = container_model.SearchImageTags(ctx, &container_model.ImageTagsSearchOptions{ Paginator: db.NewAbsoluteListOptions(0, 5), PackageID: pd.Package.ID, IsTagged: true, }) - } - if pd.Package.Type != packages_model.TypeContainer { + } else { pvs, pvsTotal, err = packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{ Paginator: db.NewAbsoluteListOptions(0, 5), PackageID: pd.Package.ID, IsInternal: optional.Some(false), }) - if err != nil { - ctx.ServerError("", err) - return - } } - + if err != nil { + ctx.ServerError("", err) + return + } ctx.Data["LatestVersions"] = pvs ctx.Data["TotalVersionCount"] = pvsTotal From c89af8e5a4faf62719473a9ebab2d8498822ad7e Mon Sep 17 00:00:00 2001 From: dragon Date: Mon, 30 Jun 2025 16:36:44 +0800 Subject: [PATCH 3/6] fix typo --- tests/integration/api_packages_rpm_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/api_packages_rpm_test.go b/tests/integration/api_packages_rpm_test.go index 880419bf96df8..6dea57cff67e2 100644 --- a/tests/integration/api_packages_rpm_test.go +++ b/tests/integration/api_packages_rpm_test.go @@ -157,7 +157,7 @@ gpgkey=%sapi/packages/%s/rpm/repository.key`, t.Run("Download", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - rpmFileName := fmt.Sprintf("%s-%s-%s.rpm", packageName, packageVersion, packageArchitecture) + rpmFileName := fmt.Sprintf("%s-%s.%s.rpm", packageName, packageVersion, packageArchitecture) req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture, rpmFileName)) resp := MakeRequest(t, req, http.StatusOK) From 645d190062f7aaee667bc3f82a2bd3224f5bf0bb Mon Sep 17 00:00:00 2001 From: dragon Date: Mon, 30 Jun 2025 17:00:50 +0800 Subject: [PATCH 4/6] fix test & keep delete path --- routers/api/packages/api.go | 2 +- tests/integration/api_packages_rpm_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index a5c1b31e27e86..3524fda751d77 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -468,7 +468,7 @@ func CommonRoutes() *web.Router { g.MatchPath("GET", "//repodata/", rpm.GetRepositoryFile) g.MatchPath("PUT", "//upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile) g.MatchPath("HEAD,GET", "//package////<*>", rpm.DownloadPackageFile) - g.MatchPath("DELETE", "//package////<*>", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) + g.MatchPath("DELETE", "//package///", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/rubygems", func() { diff --git a/tests/integration/api_packages_rpm_test.go b/tests/integration/api_packages_rpm_test.go index 6dea57cff67e2..656ace8c9071f 100644 --- a/tests/integration/api_packages_rpm_test.go +++ b/tests/integration/api_packages_rpm_test.go @@ -448,7 +448,8 @@ gpgkey=%sapi/packages/%s/rpm/repository.key`, pub, err := openpgp.ReadArmoredKeyRing(gpgResp.Body) require.NoError(t, err) - req = NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture)) + rpmFileName := fmt.Sprintf("%s-%s.%s.rpm", packageName, packageVersion, packageArchitecture) + req = NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture, rpmFileName)) resp := MakeRequest(t, req, http.StatusOK) _, sigs, err := rpmutils.Verify(resp.Body, pub) From 818f95f04e6bc042a1a1a9190e4f09395ad6cbd0 Mon Sep 17 00:00:00 2001 From: Exploding Dragon Date: Mon, 30 Jun 2025 17:54:32 +0800 Subject: [PATCH 5/6] Update routers/api/packages/api.go Co-authored-by: wxiaoguang Signed-off-by: Exploding Dragon --- routers/api/packages/api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 3524fda751d77..c8fb2c44c1be5 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -467,6 +467,7 @@ func CommonRoutes() *web.Router { g.MatchPath("HEAD", "//repodata/", rpm.CheckRepositoryFileExistence) g.MatchPath("GET", "//repodata/", rpm.GetRepositoryFile) g.MatchPath("PUT", "//upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile) + // this URL pattern is only used internally in the RPM index, it is generated by us g.MatchPath("HEAD,GET", "//package////<*>", rpm.DownloadPackageFile) g.MatchPath("DELETE", "//package///", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) }, reqPackageAccess(perm.AccessModeRead)) From 1377b6546eb550a32020b455cd797ea5c22be636 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Mon, 30 Jun 2025 18:59:19 +0800 Subject: [PATCH 6/6] clarify --- routers/api/packages/api.go | 5 +++-- tests/integration/api_packages_rpm_test.go | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index c8fb2c44c1be5..878e0f99452c1 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -467,8 +467,9 @@ func CommonRoutes() *web.Router { g.MatchPath("HEAD", "//repodata/", rpm.CheckRepositoryFileExistence) g.MatchPath("GET", "//repodata/", rpm.GetRepositoryFile) g.MatchPath("PUT", "//upload", reqPackageAccess(perm.AccessModeWrite), rpm.UploadPackageFile) - // this URL pattern is only used internally in the RPM index, it is generated by us - g.MatchPath("HEAD,GET", "//package////<*>", rpm.DownloadPackageFile) + // this URL pattern is only used internally in the RPM index, it is generated by us, the filename part is not really used (can be anything) + g.MatchPath("HEAD,GET", "//package///", rpm.DownloadPackageFile) + g.MatchPath("HEAD,GET", "//package////", rpm.DownloadPackageFile) g.MatchPath("DELETE", "//package///", reqPackageAccess(perm.AccessModeWrite), rpm.DeletePackageFile) }, reqPackageAccess(perm.AccessModeRead)) diff --git a/tests/integration/api_packages_rpm_test.go b/tests/integration/api_packages_rpm_test.go index 656ace8c9071f..bd1959f64ea4f 100644 --- a/tests/integration/api_packages_rpm_test.go +++ b/tests/integration/api_packages_rpm_test.go @@ -157,10 +157,14 @@ gpgkey=%sapi/packages/%s/rpm/repository.key`, t.Run("Download", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - rpmFileName := fmt.Sprintf("%s-%s.%s.rpm", packageName, packageVersion, packageArchitecture) - req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture, rpmFileName)) + // download the package without the file name + req := NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s", groupURL, packageName, packageVersion, packageArchitecture)) resp := MakeRequest(t, req, http.StatusOK) + assert.Equal(t, content, resp.Body.Bytes()) + // download the package with a file name (it can be anything) + req = NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s/any-file-name", groupURL, packageName, packageVersion, packageArchitecture)) + resp = MakeRequest(t, req, http.StatusOK) assert.Equal(t, content, resp.Body.Bytes()) })