mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-01 20:59:45 +09:00
fix: npm route (#39488)
This commit is contained in:
+17
-30
@@ -405,37 +405,24 @@ func CommonRoutes() *web.Router {
|
||||
}, reqPackageAccess(perm.AccessModeRead))
|
||||
})
|
||||
r.Group("/npm", func() {
|
||||
// HINT: NPM-ROUTE-PATH-PATTERN: search this keyword to see more details
|
||||
scopeRegexp := `^@` + npm_module.RegexpNamePart + `$`
|
||||
idRegexp := `^(@` + npm_module.RegexpNamePart + `%2[fF])?` + npm_module.RegexpNamePart + `$`
|
||||
addPackageHandlers := func() {
|
||||
r.Get("", npm.PackageMetadata)
|
||||
r.Put("", reqPackageAccess(perm.AccessModeWrite), npm.UploadPackage)
|
||||
r.Get("/{version}", npm.PackageVersionMetadata)
|
||||
r.Group("/-/{version}/{filename}", func() {
|
||||
r.Get("", npm.DownloadPackageFile)
|
||||
r.Delete("/-rev/{revision}", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackageVersion)
|
||||
})
|
||||
r.Get("/-/{filename}", npm.DownloadPackageFileByName)
|
||||
r.Group("/-rev/{revision}", func() {
|
||||
r.Delete("", npm.DeletePackage)
|
||||
r.Put("", npm.DeletePreview)
|
||||
}, reqPackageAccess(perm.AccessModeWrite))
|
||||
}
|
||||
r.Group("/{scope:"+scopeRegexp+"}/{id:"+idRegexp+"}", addPackageHandlers)
|
||||
r.Group("/{id:"+idRegexp+"}", addPackageHandlers)
|
||||
r.Get("/-/v1/search", npm.PackageSearch)
|
||||
r.PathGroup("/*", func(g *web.RouterPathGroup) {
|
||||
// HINT: NPM-ROUTE-PATH-PATTERN: search this keyword to see more details
|
||||
packageId := `/<id:(@` + npm_module.RegexpNamePart + `/)?` + npm_module.RegexpNamePart + ">"
|
||||
g.UseUnescapedPath()
|
||||
g.MatchPath("DELETE", packageId+"/-/<version>/<filename>/-rev/<revision>", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackageVersion)
|
||||
g.MatchPath("GET", packageId+"/-/<version>/<filename>", npm.DownloadPackageFile)
|
||||
g.MatchPath("GET", packageId+"/-/<filename>", npm.DownloadPackageFileByName)
|
||||
g.MatchPath("DELETE", packageId+"/-rev/<revision>", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackage)
|
||||
g.MatchPath("PUT", packageId+"/-rev/<revision>", reqPackageAccess(perm.AccessModeWrite), npm.DeletePreview)
|
||||
g.MatchPath("GET", packageId+"/<version>", npm.PackageVersionMetadata)
|
||||
g.MatchPath("GET", packageId, npm.PackageMetadata)
|
||||
g.MatchPath("PUT", packageId, reqPackageAccess(perm.AccessModeWrite), npm.UploadPackage)
|
||||
|
||||
addPackageDistTagsHandlers := func() {
|
||||
r.Get("", npm.ListPackageTags)
|
||||
r.Group("/{tag}", func() {
|
||||
r.Put("", npm.AddPackageTag)
|
||||
r.Delete("", npm.DeletePackageTag)
|
||||
}, reqPackageAccess(perm.AccessModeWrite))
|
||||
}
|
||||
r.Group("/-/package/{scope:"+scopeRegexp+"}/{id:"+idRegexp+"}/dist-tags", addPackageDistTagsHandlers)
|
||||
r.Group("/-/package/{id:"+idRegexp+"}/dist-tags", addPackageDistTagsHandlers)
|
||||
r.Group("/-/v1/search", func() {
|
||||
r.Get("", npm.PackageSearch)
|
||||
packageDistTags := "/-/package" + packageId + "/dist-tags"
|
||||
g.MatchPath("GET", packageDistTags, npm.ListPackageTags)
|
||||
g.MatchPath("PUT", packageDistTags+"/<tag>", reqPackageAccess(perm.AccessModeWrite), npm.AddPackageTag)
|
||||
g.MatchPath("DELETE", packageDistTags+"/<tag>", reqPackageAccess(perm.AccessModeWrite), npm.DeletePackageTag)
|
||||
})
|
||||
}, reqPackageAccess(perm.AccessModeRead))
|
||||
r.Group("/pub", func() {
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"bytes"
|
||||
std_ctx "context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -44,21 +43,12 @@ func apiError(ctx *context.Context, status int, obj any) {
|
||||
|
||||
// packageNameFromParams gets the package name from the url parameters
|
||||
func packageNameFromParams(ctx *context.Context) string {
|
||||
// Real examples: these 2 both should work:
|
||||
// HINT: NPM-ROUTE-PATH-PATTERN: real examples: these cases all should work:
|
||||
// * "https://registry.npmjs.org/@angular/core"
|
||||
// * "https://registry.npmjs.org/@angular%2Fcore"
|
||||
// * "https://registry.npmjs.org/%40angular%2Fcore"
|
||||
//
|
||||
// HINT: NPM-ROUTE-PATH-PATTERN: The cases for the path parameters:
|
||||
// * ".../TheName/...": id="TheName"
|
||||
// * ".../@TheScope/TheName/...": scope="@TheScope", id="TheName"
|
||||
// * ".../@TheScope%2FTheName/...": id="@TheScope/TheName"
|
||||
scope := ctx.PathParam("scope")
|
||||
fullOrSub := ctx.PathParam("id") // may be a full name or a subpath of the full package name
|
||||
if scope != "" {
|
||||
// now id is the subpath of the full package name, e.g. "core" in "@angular/core"
|
||||
return fmt.Sprintf("%s/%s", scope, fullOrSub)
|
||||
}
|
||||
return fullOrSub // id is the full package name, e.g.: "@angular/core" or "lodash"
|
||||
return ctx.PathParam("id") // id is the full package name, e.g.: "@angular/core" or "lodash"
|
||||
}
|
||||
|
||||
func buildNpmRegistryURL(ctx std_ctx.Context, owner *user_model.User) string {
|
||||
|
||||
Reference in New Issue
Block a user