From ba12aed5726e088a236c4e75ad59650c5c51d5fd Mon Sep 17 00:00:00 2001 From: dragon Date: Fri, 6 Dec 2024 14:51:49 +0800 Subject: [PATCH] cleanup package route --- routers/api/packages/api.go | 64 ++---------------------- routers/api/packages/arch/arch.go | 45 ++++++++++++----- routers/web/user/package.go | 4 +- templates/package/content/arch.tmpl | 2 +- templates/package/content/container.tmpl | 4 +- 5 files changed, 42 insertions(+), 77 deletions(-) diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index 1337ce4569..b6666c9269 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -153,66 +153,10 @@ func CommonRoutes() *web.Route { }) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/arch", func() { - r.Group("/repository.key", func() { - r.Head("", arch.GetRepositoryKey) - r.Get("", arch.GetRepositoryKey) - }) - - r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) { - pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") - groupLen := len(pathGroups) - isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET" - isPut := ctx.Req.Method == "PUT" - isDelete := ctx.Req.Method == "DELETE" - if isGetHead { - if groupLen < 2 { - ctx.Status(http.StatusNotFound) - return - } - if groupLen == 2 { - ctx.SetParams("group", "") - ctx.SetParams("arch", pathGroups[0]) - ctx.SetParams("file", pathGroups[1]) - } else { - ctx.SetParams("group", strings.Join(pathGroups[:groupLen-2], "/")) - ctx.SetParams("arch", pathGroups[groupLen-2]) - ctx.SetParams("file", pathGroups[groupLen-1]) - } - arch.GetPackageOrDB(ctx) - return - } else if isPut { - ctx.SetParams("group", strings.Join(pathGroups, "/")) - reqPackageAccess(perm.AccessModeWrite)(ctx) - if ctx.Written() { - return - } - arch.PushPackage(ctx) - return - } else if isDelete { - if groupLen < 3 { - ctx.Status(http.StatusBadRequest) - return - } - if groupLen == 3 { - ctx.SetParams("group", "") - ctx.SetParams("package", pathGroups[0]) - ctx.SetParams("version", pathGroups[1]) - ctx.SetParams("arch", pathGroups[2]) - } else { - ctx.SetParams("group", strings.Join(pathGroups[:groupLen-3], "/")) - ctx.SetParams("package", pathGroups[groupLen-3]) - ctx.SetParams("version", pathGroups[groupLen-2]) - ctx.SetParams("arch", pathGroups[groupLen-1]) - } - reqPackageAccess(perm.AccessModeWrite)(ctx) - if ctx.Written() { - return - } - arch.RemovePackage(ctx) - return - } - ctx.Status(http.StatusNotFound) - }) + r.Methods("HEAD,GET", "/repository.key", arch.GetRepositoryKey) + r.Methods("HEAD,GET", "*", arch.GetPackageOrDB) + r.Methods("PUT", "*", reqPackageAccess(perm.AccessModeWrite), arch.PushPackage) + r.Methods("DELETE", "*", reqPackageAccess(perm.AccessModeWrite), arch.RemovePackage) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/cargo", func() { r.Group("/api/v1/crates", func() { diff --git a/routers/api/packages/arch/arch.go b/routers/api/packages/arch/arch.go index ecd2281884..3f1614b752 100644 --- a/routers/api/packages/arch/arch.go +++ b/routers/api/packages/arch/arch.go @@ -59,7 +59,7 @@ func GetRepositoryKey(ctx *context.Context) { } func PushPackage(ctx *context.Context) { - group := ctx.Params("group") + group := strings.Trim(ctx.Params("*"), "/") releaser := refreshLocker(ctx, group) defer releaser() upload, needToClose, err := ctx.UploadStream() @@ -183,11 +183,21 @@ func PushPackage(ctx *context.Context) { } func GetPackageOrDB(ctx *context.Context) { - var ( - file = ctx.Params("file") - group = ctx.Params("group") - arch = ctx.Params("arch") - ) + pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") + groupLen := len(pathGroups) + if groupLen < 2 { + ctx.Status(http.StatusNotFound) + return + } + var file, group, arch string + if groupLen == 2 { + arch = pathGroups[0] + file = pathGroups[1] + } else { + group = strings.Join(pathGroups[:groupLen-2], "/") + arch = pathGroups[groupLen-2] + file = pathGroups[groupLen-1] + } if archPkgOrSig.MatchString(file) { pkg, u, pf, err := arch_service.GetPackageFile(ctx, group, file, ctx.Package.Owner.ID) if err != nil { @@ -220,12 +230,23 @@ func GetPackageOrDB(ctx *context.Context) { } func RemovePackage(ctx *context.Context) { - var ( - group = ctx.Params("group") - pkg = ctx.Params("package") - ver = ctx.Params("version") - pkgArch = ctx.Params("arch") - ) + pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") + groupLen := len(pathGroups) + if groupLen < 3 { + ctx.Status(http.StatusBadRequest) + return + } + var group, pkg, ver, pkgArch string + if groupLen == 3 { + pkg = pathGroups[0] + ver = pathGroups[1] + pkgArch = pathGroups[2] + } else { + group = strings.Join(pathGroups[:groupLen-3], "/") + pkg = pathGroups[groupLen-3] + ver = pathGroups[groupLen-2] + pkgArch = pathGroups[groupLen-1] + } releaser := refreshLocker(ctx, group) defer releaser() pv, err := packages_model.GetVersionByNameAndVersion( diff --git a/routers/web/user/package.go b/routers/web/user/package.go index d47a36e165..cb4735da7e 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -177,10 +177,11 @@ func ViewPackageVersion(ctx *context.Context) { ctx.Data["Title"] = pd.Package.Name ctx.Data["IsPackagesPage"] = true ctx.Data["PackageDescriptor"] = pd + ctx.Data["PackageRegistryHost"] = setting.Packages.RegistryHost switch pd.Package.Type { case packages_model.TypeContainer: - ctx.Data["RegistryHost"] = setting.Packages.RegistryHost + case packages_model.TypeAlpine: branches := make(container.Set[string]) repositories := make(container.Set[string]) @@ -203,7 +204,6 @@ func ViewPackageVersion(ctx *context.Context) { ctx.Data["Repositories"] = util.Sorted(repositories.Values()) ctx.Data["Architectures"] = util.Sorted(architectures.Values()) case packages_model.TypeArch: - ctx.Data["RegistryHost"] = setting.Packages.RegistryHost ctx.Data["SignMail"] = fmt.Sprintf("%s@noreply.%s", ctx.Package.Owner.Name, setting.Packages.RegistryHost) groups := make(container.Set[string]) for _, f := range pd.Files { diff --git a/templates/package/content/arch.tmpl b/templates/package/content/arch.tmpl index 6138b1d698..6a041d323b 100644 --- a/templates/package/content/arch.tmpl +++ b/templates/package/content/arch.tmpl @@ -25,7 +25,7 @@ pacman-key --lsign-key '{{$.SignMail}}' {{end -}}{{- if gt $GroupSize 1 -}} # {{ctx.Locale.Tr "packages.arch.pacman.repo.multi.item" .}} {{end -}} -[{{$.PackageDescriptor.Owner.LowerName}}.{{$.RegistryHost}}] +[{{$.PackageDescriptor.Owner.LowerName}}.{{$.PackageRegistryHost}}] SigLevel = Required Server = {{end -}} diff --git a/templates/package/content/container.tmpl b/templates/package/content/container.tmpl index b5fdcfeb1b..95ac6f8b8e 100644 --- a/templates/package/content/container.tmpl +++ b/templates/package/content/container.tmpl @@ -5,13 +5,13 @@
{{if eq .PackageDescriptor.Metadata.Type "helm"}} -
helm pull oci://{{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}
+
helm pull oci://{{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}
{{else}} {{$separator := ":"}} {{if not .PackageDescriptor.Metadata.IsTagged}} {{$separator = "@"}} {{end}} -
docker pull {{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}
+
docker pull {{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}
{{end}}