diff --git a/.buildbaselog b/.buildbaselog index bd588da0e10..07e77405173 100644 --- a/.buildbaselog +++ b/.buildbaselog @@ -8,6 +8,9 @@ * Add date here... Add signature here... - Add your reason here... +* Aug 27 2026 +- Refresh base image + * Jul 01 2026 - Refresh base image diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 299846ca748..765c34f3eed 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -56,7 +56,7 @@ jobs: - name: Set up Go 1.26 uses: actions/setup-go@v5 with: - go-version: 1.26.4 + go-version: 1.26.7 id: go - uses: actions/checkout@v6 with: diff --git a/.gitignore b/.gitignore index 37478aa6dc0..058692d4ff3 100644 --- a/.gitignore +++ b/.gitignore @@ -54,8 +54,20 @@ src/portal/cypress/screenshots **/robotvars.py src/core/conf/app.conf -src/server/v2.0/models/ -src/server/v2.0/restapi/ +# go-swagger output ("make gen_apis"). Everything is ignored except the +# zz_generated_placeholder.go files, which are committed so that the packages +# resolve before code generation has run. The patterns are written level by +# level because git cannot re-include a file whose parent directory is excluded. +src/server/v2.0/models/* +!src/server/v2.0/models/zz_generated_placeholder.go +src/server/v2.0/restapi/* +!src/server/v2.0/restapi/zz_generated_placeholder.go +!src/server/v2.0/restapi/operations/ +src/server/v2.0/restapi/operations/* +!src/server/v2.0/restapi/operations/zz_generated_placeholder.go +!src/server/v2.0/restapi/operations/*/ +src/server/v2.0/restapi/operations/*/* +!src/server/v2.0/restapi/operations/*/zz_generated_placeholder.go .editorconfig harborclient/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f63ec53f9d0..937eb7ecf70 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -169,7 +169,7 @@ Harbor backend is written in [Go](http://golang.org/). If you don't have a Harbo | 2.12 | 1.23.2 | | 2.13 | 1.23.8 | | 2.14 | 1.24.6 | -| 2.15 | 1.26.4 | +| 2.15 | 1.26.7 | Ensure your GOPATH and PATH have been configured in accordance with the Go environment instructions. diff --git a/Makefile b/Makefile index 3ceab96c438..f01ead40475 100644 --- a/Makefile +++ b/Makefile @@ -125,12 +125,12 @@ PREPARE_VERSION_NAME=versions #versions REGISTRYVERSION=v2.8.3-patch-redis -TRIVYVERSION=v0.72.0 -TRIVYADAPTERVERSION=v0.38.0 +TRIVYVERSION=v0.74.0 +TRIVYADAPTERVERSION=v0.39.0 NODEBUILDIMAGE=node:22.22.3 # version of registry for pulling the source code -REGISTRY_SRC_TAG=v2.8.3-harbor.1 +REGISTRY_SRC_TAG=v2.8.3-harbor.2-rc.5 # source of upstream distribution code DISTRIBUTION_SRC=https://github.com/goharbor/distribution.git @@ -165,7 +165,7 @@ GOINSTALL=$(GOCMD) install GOTEST=$(GOCMD) test GODEP=$(GOTEST) -i GOFMT=gofmt -w -GOBUILDIMAGE=golang:1.26.4 +GOBUILDIMAGE=golang:1.26.7 GOBUILDPATHINCONTAINER=/harbor # go build @@ -332,9 +332,28 @@ SWAGGER_IMAGE_BUILD_CMD=${DOCKERBUILD} -f ${TOOLSPATH}/swagger/Dockerfile --buil # $3 the name of the application define swagger_generate_server @echo "generate all the files for API from $(1)" - @rm -rf $(2)/{models,restapi} + @# Drop the previously generated files but keep the committed + @# zz_generated_placeholder.go of each package (see .gitignore). + @find $(2)/models $(2)/restapi -type f ! -name 'zz_generated_placeholder.go' -delete @mkdir -p $(2) @$(SWAGGER_GENERATE_SERVER) -f $(1) -A $(3) --target $(2) + @missing=; orphaned=; \ + for d in $$(find $(2)/models $(2)/restapi -type d); do \ + if [ ! -f "$$d/zz_generated_placeholder.go" ]; then \ + missing="$$missing $$d"; \ + elif [ -z "$$(find $$d -maxdepth 1 -name '*.go' ! -name 'zz_generated_placeholder.go')" ]; then \ + orphaned="$$orphaned $$d"; \ + fi; \ + done; \ + if [ -n "$$missing" ]; then \ + echo "error: generated package without a committed placeholder:$$missing"; \ + echo "copy a zz_generated_placeholder.go into it, fix the package clause and commit it"; \ + fi; \ + if [ -n "$$orphaned" ]; then \ + echo "error: placeholder for a package go-swagger no longer generates:$$orphaned"; \ + echo "remove the orphaned placeholder"; \ + fi; \ + if [ -n "$$missing$$orphaned" ]; then exit 1; fi endef gen_apis: @@ -490,7 +509,20 @@ package_offline: check_buildinstaller update_prepare_version compile build @rm -rf $(HARBORPKG) @echo "Done." -go_check: gen_apis mocks_check misspell commentfmt lint +go_check: tidy_check gen_apis mocks_check misspell commentfmt lint + +# Dependabot runs "go mod tidy" on a plain checkout, so it must be a no-op there. +# This runs before gen_apis, on a tree that still has no generated code, so that a +# change to the import set of the generated code cannot silently stale the blank +# imports in src/server/v2.0/restapi/zz_generated_placeholder.go. +tidy_check: + @echo checking go mod tidy on a checkout without generated code... + @cd ./src/; if ! go mod tidy -diff; then \ + echo "go mod tidy is not a no-op here, so Dependabot cannot update any Go module."; \ + echo "if the go-swagger import set changed, update the blank imports in"; \ + echo "src/server/v2.0/restapi/zz_generated_placeholder.go to match."; \ + exit 1; \ + fi commentfmt: @echo checking comment format... diff --git a/src/.golangci.yaml b/src/.golangci.yaml index 7260305a79b..d2c3fc91da5 100644 --- a/src/.golangci.yaml +++ b/src/.golangci.yaml @@ -40,6 +40,20 @@ linters: - revive text: "var-naming: avoid package names that conflict with Go standard library package names" path: "(common/http/|lib/errors/|lib/http/)" + # The packages under server/v2.0/restapi/operations are named after the + # swagger tags in api/v2.0/swagger.yaml, some of which contain underscores. + # The generated files are skipped as generated code, the committed + # zz_generated_placeholder.go files are not. + - linters: + - revive + text: "var-naming: don't use an underscore in package name" + path: "server/v2\\.0/restapi/operations/.*/zz_generated_placeholder\\.go$" + # Same placeholders: "scanner" and "user" are swagger tag names that + # happen to match standard library package names. + - linters: + - revive + text: "var-naming: avoid package names that conflict with Go standard library package names" + path: "server/v2\\.0/restapi/operations/.*/zz_generated_placeholder\\.go$" paths: - third_party$ - builtin$ diff --git a/src/common/dao/testutils.go b/src/common/dao/testutils.go index cf2c777ba74..cb28a0639ef 100644 --- a/src/common/dao/testutils.go +++ b/src/common/dao/testutils.go @@ -70,7 +70,7 @@ func PrepareTestForPostgresSQL() { }, } - log.Infof("POSTGRES_HOST: %s, POSTGRES_USR: %s, POSTGRES_PORT: %d, POSTGRES_PWD: %s\n", dbHost, dbUser, dbPort, dbPassword) + log.Infof("POSTGRES_HOST: %s, POSTGRES_USR: %s, POSTGRES_PORT: %d\n", dbHost, dbUser, dbPort) o = initDatabaseForTest(database) } diff --git a/src/common/http/tls.go b/src/common/http/tls.go index 05a8ad044fc..de9d043e0de 100644 --- a/src/common/http/tls.go +++ b/src/common/http/tls.go @@ -66,14 +66,13 @@ func NewServerTLSConfig() *tls.Config { PreferServerCipherSuites: true, CurvePreferences: []tls.CurveID{ tls.CurveP256, - tls.X25519, + tls.CurveP384, + tls.CurveP521, }, MinVersion: tls.VersionTLS12, CipherSuites: []uint16{ tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, }, diff --git a/src/common/security/secret/context.go b/src/common/security/secret/context.go index ff1c2174165..694b3ba5d75 100644 --- a/src/common/security/secret/context.go +++ b/src/common/security/secret/context.go @@ -49,7 +49,7 @@ func (s *SecurityContext) IsAuthenticated() bool { } valid := s.store.IsValid(s.secret) if !valid { - log.Debugf("invalid secret: %s", s.secret) + log.Debug("invalid secret") } return valid diff --git a/src/common/utils/encrypt.go b/src/common/utils/encrypt.go index d25f72c6ab7..ceef92d6386 100644 --- a/src/common/utils/encrypt.go +++ b/src/common/utils/encrypt.go @@ -17,6 +17,7 @@ package utils import ( "crypto/aes" "crypto/cipher" + "crypto/fips140" "crypto/pbkdf2" "crypto/rand" "crypto/sha1" // nolint:gosec // G505: blocklisted import kept for legacy PBKDF2-SHA1 password verification only @@ -61,7 +62,13 @@ const ( // PBKDF2-HMAC-SHA256 with a high iteration count instead (see // pkg/user/manager.go). Please don't use SHA1 to hash any new secrets. var HashAlg = map[string]func() hash.Hash{ - SHA1: sha1.New, // nolint:gosec // G401/G505: weak hash kept only for legacy PBKDF2 password verification + SHA1: func() hash.Hash { + var h hash.Hash + fips140.WithoutEnforcement(func() { + h = sha1.New() + }) + return h + }, // nolint:gosec // G401/G505: weak hash kept only for legacy PBKDF2 password verification SHA256: sha256.New, PBKDF2SHA256: sha256.New, } @@ -88,7 +95,10 @@ func pbkdf2Params(version string) (func() hash.Hash, int) { // Encrypt encrypts the content with salt func Encrypt(content string, salt string, encryptAlg string) string { alg, iterations := pbkdf2Params(encryptAlg) - key, _ := pbkdf2.Key(alg, content, []byte(salt), iterations, 16) + var key []byte + fips140.WithoutEnforcement(func() { + key, _ = pbkdf2.Key(alg, content, []byte(salt), iterations, 16) + }) return fmt.Sprintf("%x", key) } @@ -114,7 +124,10 @@ func ReversibleEncrypt(str, key string) (string, error) { return "", err } - cfb := cipher.NewCFBEncrypter(block, iv) + var cfb cipher.Stream + fips140.WithoutEnforcement(func() { + cfb = cipher.NewCFBEncrypter(block, iv) + }) cfb.XORKeyStream(cipherText[aes.BlockSize:], []byte(str)) encrypted := EncryptHeaderV1 + base64.StdEncoding.EncodeToString(cipherText) return encrypted, nil @@ -154,7 +167,10 @@ func decryptAES(str, key string) (string, error) { iv := cipherText[:aes.BlockSize] cipherText = cipherText[aes.BlockSize:] - cfb := cipher.NewCFBDecrypter(block, iv) + var cfb cipher.Stream + fips140.WithoutEnforcement(func() { + cfb = cipher.NewCFBDecrypter(block, iv) + }) cfb.XORKeyStream(cipherText, cipherText) return string(cipherText), nil } diff --git a/src/common/utils/test/database.go b/src/common/utils/test/database.go index 01e8588d63f..8f561d779d4 100644 --- a/src/common/utils/test/database.go +++ b/src/common/utils/test/database.go @@ -63,7 +63,7 @@ func InitDatabaseFromEnv() { }, } - log.Infof("POSTGRES_HOST: %s, POSTGRES_USR: %s, POSTGRES_PORT: %d, POSTGRES_PWD: %s\n", dbHost, dbUser, dbPort, dbPassword) + log.Infof("POSTGRES_HOST: %s, POSTGRES_USR: %s, POSTGRES_PORT: %d\n", dbHost, dbUser, dbPort) if err := dao.InitDatabase(database); err != nil { log.Fatalf("failed to init database : %v", err) diff --git a/src/common/utils/utils.go b/src/common/utils/utils.go index ab180de610d..0edebae2484 100644 --- a/src/common/utils/utils.go +++ b/src/common/utils/utils.go @@ -51,7 +51,26 @@ func ParseEndpoint(endpoint string) (*url.URL, error) { endpoint = "http://" + endpoint } - return url.ParseRequestURI(endpoint) + u, err := url.ParseRequestURI(endpoint) + if err == nil && u != nil { + u.Host = strings.ToLower(u.Host) + } + return u, err +} + +// EqualURL checks whether two URLs are equal, with case-insensitive host matching per RFC 1035. +func EqualURL(rawURL1, rawURL2 string) bool { + if rawURL1 == rawURL2 { + return true + } + u1, err1 := url.Parse(rawURL1) + u2, err2 := url.Parse(rawURL2) + if err1 != nil || err2 != nil { + return false + } + u1.Host = strings.ToLower(u1.Host) + u2.Host = strings.ToLower(u2.Host) + return u1.String() == u2.String() } // ParseRepository splits a repository into two parts: project and rest @@ -66,19 +85,33 @@ func ParseRepository(repository string) (project, rest string) { return } -// GenerateRandomStringWithLen generates a random string with length -func GenerateRandomStringWithLen(length int) string { +// GenerateRandomStringWithLenAndError generates a random string with length or returns an error if entropy cannot be read +func GenerateRandomStringWithLenAndError(length int) (string, error) { const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" l := len(chars) result := make([]byte, length) _, err := rand.Read(result) if err != nil { - log.Warningf("Error reading random bytes: %v", err) + return "", fmt.Errorf("failed to read random bytes: %w", err) } for i := range length { result[i] = chars[int(result[i])%l] } - return string(result) + return string(result), nil +} + +// GenerateRandomStringOrError generates a random string with 32 byte length or returns an error if entropy cannot be read +func GenerateRandomStringOrError() (string, error) { + return GenerateRandomStringWithLenAndError(32) +} + +// GenerateRandomStringWithLen generates a random string with length +func GenerateRandomStringWithLen(length int) string { + str, err := GenerateRandomStringWithLenAndError(length) + if err != nil { + log.Warningf("Error reading random bytes: %v", err) + } + return str } // GenerateRandomString generate a random string with 32 byte length diff --git a/src/common/utils/utils_test.go b/src/common/utils/utils_test.go index ef102c48ea4..0fd9a1aaaf0 100644 --- a/src/common/utils/utils_test.go +++ b/src/common/utils/utils_test.go @@ -37,6 +37,9 @@ func TestParseEndpoint(t *testing.T) { {"ftp://example.com", true, ""}, {"http://example.com", false, "http://example.com"}, {"https://example.com", false, "https://example.com"}, + {"http://EXAMPLE.COM", false, "http://example.com"}, + {"https://EXAMPLE.COM:8080/Path", false, "https://example.com:8080/Path"}, + {" MIXED.case.com/path/ ", false, "http://mixed.case.com/path"}, {"http://example!@#!?//#", true, ""}, } @@ -51,6 +54,31 @@ func TestParseEndpoint(t *testing.T) { } } +func TestEqualURL(t *testing.T) { + cases := []struct { + url1 string + url2 string + expected bool + }{ + {"http://example.com:8080/v2", "http://example.com:8080/v2", true}, + {"http://EXAMPLE.COM:8080/v2", "http://example.com:8080/v2", true}, + {"http://example.com:8080/V2", "http://example.com:8080/v2", false}, + {"https://core:8080", "https://CORE:8080", true}, + {"http://example.com", "https://example.com", false}, + {"http://example.com:8080", "http://example.com:8081", false}, + {"http://example.com/foo", "http://example.com/bar", false}, + {"://invalid-url-1", "http://example.com", false}, + {"http://example.com", "://invalid-url-2", false}, + {"http://example.com/A%", "http://example.com/a%", false}, + } + + for _, c := range cases { + t.Run(c.url1+"_vs_"+c.url2, func(t *testing.T) { + assert.Equal(t, c.expected, EqualURL(c.url1, c.url2)) + }) + } +} + func TestParseRepository(t *testing.T) { repository := "library/ubuntu" project, rest := ParseRepository(repository) @@ -155,6 +183,15 @@ func TestGenerateRandomString(t *testing.T) { } } +func TestGenerateRandomStringOrError(t *testing.T) { + str, err := GenerateRandomStringOrError() + assert.Nil(t, err) + assert.Equal(t, 32, len(str)) + str2, err := GenerateRandomStringOrError() + assert.Nil(t, err) + assert.NotEqual(t, str, str2) +} + func TestGenerateRandomStringWithLen(t *testing.T) { str := GenerateRandomStringWithLen(16) if len(str) != 16 { @@ -162,6 +199,12 @@ func TestGenerateRandomStringWithLen(t *testing.T) { } } +func TestGenerateRandomStringWithLenAndError(t *testing.T) { + str, err := GenerateRandomStringWithLenAndError(16) + assert.Nil(t, err) + assert.Equal(t, 16, len(str)) +} + func TestTestTCPConn(t *testing.T) { server := httptest.NewServer(nil) defer server.Close() diff --git a/src/controller/artifact/model_test.go b/src/controller/artifact/model_test.go index 06aade823d9..fe846563ea5 100644 --- a/src/controller/artifact/model_test.go +++ b/src/controller/artifact/model_test.go @@ -54,7 +54,7 @@ func TestUnmarshalJSONWithACCUnknownType(t *testing.T) { var artifact []Artifact err := json.Unmarshal(data, &artifact) assert.NotNil(t, err) - assert.Contains(t, err.Error(), "accessory type not support") + assert.Contains(t, err.Error(), `unsupported accessory type ""`) } func TestUnmarshalJSONWithoutACC(t *testing.T) { diff --git a/src/controller/event/handler/webhook/artifact/replication.go b/src/controller/event/handler/webhook/artifact/replication.go index bc6f3fec2d4..296465d30fe 100644 --- a/src/controller/event/handler/webhook/artifact/replication.go +++ b/src/controller/event/handler/webhook/artifact/replication.go @@ -20,6 +20,7 @@ import ( "fmt" "strings" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/controller/event" "github.com/goharbor/harbor/src/controller/event/handler/util" ctlModel "github.com/goharbor/harbor/src/controller/event/model" @@ -232,7 +233,7 @@ func isLocalRegistry(registry *rpModel.Registry) bool { if registry != nil { return registry.Type == rpModel.RegistryTypeHarbor && registry.Name == "Local" && - registry.URL == config.InternalCoreURL() + utils.EqualURL(registry.URL, config.InternalCoreURL()) } return false diff --git a/src/controller/event/handler/webhook/artifact/replication_test.go b/src/controller/event/handler/webhook/artifact/replication_test.go index a1dac0b85b1..f7ed43f1f2b 100644 --- a/src/controller/event/handler/webhook/artifact/replication_test.go +++ b/src/controller/event/handler/webhook/artifact/replication_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/require" common_dao "github.com/goharbor/harbor/src/common/dao" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/controller/event" "github.com/goharbor/harbor/src/controller/project" repctl "github.com/goharbor/harbor/src/controller/replication" @@ -138,6 +139,13 @@ func TestIsLocalRegistry(t *testing.T) { URL: config.InternalCoreURL(), } assert.True(t, isLocalRegistry(reg1)) + // local registry with mixed-case host URL should return true + reg1MixedCase := &rpModel.Registry{ + Type: "harbor", + Name: "Local", + URL: "http://CORE:8080", + } + assert.True(t, utils.EqualURL(reg1MixedCase.URL, "http://core:8080")) // non-local registry should return false reg2 := &rpModel.Registry{ Type: "docker-registry", diff --git a/src/controller/jobmonitor/monitor.go b/src/controller/jobmonitor/monitor.go index 505f9d46e7c..803776152d5 100644 --- a/src/controller/jobmonitor/monitor.go +++ b/src/controller/jobmonitor/monitor.go @@ -16,6 +16,7 @@ package jobmonitor import ( "context" + "crypto/fips140" "fmt" "slices" "strings" @@ -113,7 +114,11 @@ func jobServiceMonitorClient() (jm.JobServiceMonitorClient, error) { log.Errorf("failed to get redis pool: %v", err) return nil, err } - return work.NewClient(fmt.Sprintf("{%s}", config.Namespace), pool), nil + var client *work.Client + fips140.WithoutEnforcement(func() { + client = work.NewClient(fmt.Sprintf("{%s}", config.Namespace), pool) + }) + return client, nil } func (w *monitorController) ListWorkers(ctx context.Context, poolID string) ([]*jm.Worker, error) { @@ -254,7 +259,10 @@ func (w *monitorController) ListQueues(ctx context.Context) ([]*jm.Queue, error) if err != nil { return nil, err } - qs, err := mClient.Queues() + var qs []*work.Queue + fips140.WithoutEnforcement(func() { + qs, err = mClient.Queues() + }) if err != nil { return nil, err } diff --git a/src/controller/p2p/preheat/controller.go b/src/controller/p2p/preheat/controller.go index 9eb3b61eabd..60c4bb954fc 100644 --- a/src/controller/p2p/preheat/controller.go +++ b/src/controller/p2p/preheat/controller.go @@ -19,6 +19,7 @@ import ( "time" "github.com/goharbor/harbor/src/jobservice/job" + "github.com/goharbor/harbor/src/lib" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/q" "github.com/goharbor/harbor/src/pkg/p2p/preheat/instance" @@ -178,6 +179,13 @@ func (c *controller) CreateInstance(ctx context.Context, instance *providerModel return 0, errors.New("nil instance object provided") } + // Normalize endpoint host via NormalizeAndValidateHTTPURL before checking duplicate + normEndpoint, err := lib.NormalizeAndValidateHTTPURL(instance.Endpoint) + if err != nil { + return 0, err + } + instance.Endpoint = normEndpoint + // Avoid duplicated endpoint var query = &q.Query{ Keywords: map[string]any{ @@ -255,6 +263,14 @@ func (c *controller) UpdateInstance(ctx context.Context, instance *providerModel return errors.Errorf("provider [%s] vendor cannot be changed", oldIns.Name) } + if instance.Endpoint != "" { + normEndpoint, err := lib.NormalizeAndValidateHTTPURL(instance.Endpoint) + if err != nil { + return err + } + instance.Endpoint = normEndpoint + } + return c.iManager.Update(ctx, instance, properties...) } diff --git a/src/controller/p2p/preheat/controllor_test.go b/src/controller/p2p/preheat/controllor_test.go index 51deed2f106..0eee0358cf4 100644 --- a/src/controller/p2p/preheat/controllor_test.go +++ b/src/controller/p2p/preheat/controllor_test.go @@ -147,6 +147,13 @@ func (s *preheatSuite) TestCreateInstance() { s.Equal(ErrorConflict, err) s.Empty(id) + // Case: instance with mixed-case already existed endpoint, expect conflict. + id, err = s.controller.CreateInstance(s.ctx, &providerModel.Instance{ + Endpoint: "http://LOCALHOST", + }) + s.Equal(ErrorConflict, err) + s.Empty(id) + // Case: instance with invalid provider, expect error. id, err = s.controller.CreateInstance(s.ctx, &providerModel.Instance{ Endpoint: "http://foo.bar", diff --git a/src/controller/quota/driver/project/project.go b/src/controller/quota/driver/project/project.go index 859deab60b9..daebf705959 100644 --- a/src/controller/quota/driver/project/project.go +++ b/src/controller/quota/driver/project/project.go @@ -89,7 +89,7 @@ func (d *driver) Validate(hardLimits types.ResourceList) error { for resource, value := range hardLimits { if !resources[resource] { - return fmt.Errorf("resource %s not support", resource) + return fmt.Errorf("resource %s is not supported", resource) } if err := lib.ValidateQuotaLimit(value); err != nil { diff --git a/src/controller/registry/controller.go b/src/controller/registry/controller.go index b2b8038b330..d0f5dd179b6 100644 --- a/src/controller/registry/controller.go +++ b/src/controller/registry/controller.go @@ -92,7 +92,7 @@ func (c *controller) validate(ctx context.Context, registry *model.Registry) err if len(registry.Name) > 64 { return errors.New(nil).WithCode(errors.BadRequestCode).WithMessage("the max length of name is 64") } - url, err := lib.ValidateHTTPURL(registry.URL) + url, err := lib.NormalizeAndValidateHTTPURL(registry.URL) if err != nil { return err } diff --git a/src/core/auth/authproxy/auth.go b/src/core/auth/authproxy/auth.go index 261cdb8cbae..4f250015238 100644 --- a/src/core/auth/authproxy/auth.go +++ b/src/core/auth/authproxy/auth.go @@ -29,6 +29,7 @@ import ( "github.com/goharbor/harbor/src/common" "github.com/goharbor/harbor/src/common/models" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/controller/usergroup" "github.com/goharbor/harbor/src/core/auth" "github.com/goharbor/harbor/src/jobservice/logger" @@ -209,7 +210,11 @@ func (a *Auth) fillInModel(u *models.User) error { return fmt.Errorf("username cannot be empty") } u.Realname = u.Username - u.Password = "1234567ab" + pwd, err := utils.GenerateRandomStringOrError() + if err != nil { + return fmt.Errorf("failed to generate random password: %w", err) + } + u.Password = pwd u.Comment = userEntryComment if strings.Contains(u.Username, "@") { u.Email = u.Username diff --git a/src/core/auth/ldap/ldap.go b/src/core/auth/ldap/ldap.go index 796eae9837c..7cd2bbcc86e 100644 --- a/src/core/auth/ldap/ldap.go +++ b/src/core/auth/ldap/ldap.go @@ -230,8 +230,12 @@ func (l *Auth) OnBoardUser(ctx context.Context, u *models.User) error { u.Email = u.Username } } - u.Password = "12345678AbC" // Password is not kept in local db - u.Comment = "from LDAP." // Source is from LDAP + pwd, err := utils.GenerateRandomStringOrError() + if err != nil { + return fmt.Errorf("failed to generate random password: %w", err) + } + u.Password = pwd // Password is not kept in local db + u.Comment = "from LDAP." // Source is from LDAP return l.userMgr.Onboard(ctx, u) } diff --git a/src/core/auth/uaa/uaa.go b/src/core/auth/uaa/uaa.go index b9c95528b98..7f549c5bcfc 100644 --- a/src/core/auth/uaa/uaa.go +++ b/src/core/auth/uaa/uaa.go @@ -23,6 +23,7 @@ import ( "github.com/goharbor/harbor/src/common" "github.com/goharbor/harbor/src/common/models" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/common/utils/uaa" "github.com/goharbor/harbor/src/core/auth" "github.com/goharbor/harbor/src/lib/config" @@ -69,7 +70,11 @@ func (u *Auth) OnBoardUser(ctx context.Context, user *models.User) error { return fmt.Errorf("the Username is empty") } if len(user.Password) == 0 { - user.Password = "1234567ab" + pwd, err := utils.GenerateRandomStringOrError() + if err != nil { + return fmt.Errorf("failed to generate random password: %w", err) + } + user.Password = pwd } fillEmailRealName(user) user.Comment = "From UAA" diff --git a/src/core/service/token/authutils.go b/src/core/service/token/authutils.go index 6355096f43b..d439a38d38e 100644 --- a/src/core/service/token/authutils.go +++ b/src/core/service/token/authutils.go @@ -16,6 +16,7 @@ package token // nolint:revive import ( "context" + "crypto/fips140" "fmt" "strings" "time" @@ -88,7 +89,7 @@ func filterAccess(ctx context.Context, access []*token.ResourceActions, ctl project.Controller, filters map[string]accessFilter) error { secCtx, ok := security.FromContext(ctx) if !ok { - return fmt.Errorf("failed to get security context from request") + return fmt.Errorf("failed to get security context from request") } var err error for _, a := range access { @@ -139,7 +140,12 @@ func MakeToken(ctx context.Context, username, service string, access []*token.Re } // Add kid to token header for compatibility with docker distribution's code // see https://github.com/docker/distribution/blob/release/2.7/registry/auth/token/token.go#L197 - k, err := libtrust.UnmarshalPrivateKeyPEM(options.PrivateKey) + var ( + k libtrust.PrivateKey + ) + fips140.WithoutEnforcement(func() { + k, err = libtrust.UnmarshalPrivateKeyPEM(options.PrivateKey) + }) if err != nil { return nil, err } diff --git a/src/core/service/token/creator.go b/src/core/service/token/creator.go index 1344c576afd..4fd85c29e3e 100644 --- a/src/core/service/token/creator.go +++ b/src/core/service/token/creator.go @@ -202,7 +202,7 @@ func (g generalCreator) Create(r *http.Request) (*models.Token, error) { ctx, ok := security.FromContext(r.Context()) if !ok { - return nil, fmt.Errorf("failed to get security context from request") + return nil, fmt.Errorf("failed to get security context from request") } // for docker login diff --git a/src/go.mod b/src/go.mod index e4414186a46..e7bcd832cc1 100644 --- a/src/go.mod +++ b/src/go.mod @@ -1,6 +1,6 @@ module github.com/goharbor/harbor/src -go 1.26.4 +go 1.26.7 require ( github.com/CloudNativeAI/model-spec v0.0.5 @@ -19,21 +19,21 @@ require ( github.com/dghubble/sling v1.4.2 github.com/docker/distribution v2.8.3+incompatible github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 - github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 + github.com/go-asn1-ber/asn1-ber v1.5.8 github.com/go-ldap/ldap/v3 v3.4.13 - github.com/go-openapi/errors v0.22.7 - github.com/go-openapi/loads v0.23.3 - github.com/go-openapi/runtime v0.32.2 - github.com/go-openapi/spec v0.22.4 - github.com/go-openapi/strfmt v0.26.3 - github.com/go-openapi/swag v0.23.1 - github.com/go-openapi/validate v0.25.3 + github.com/go-openapi/errors v0.22.8 + github.com/go-openapi/loads v0.25.2 + github.com/go-openapi/runtime v0.33.2 + github.com/go-openapi/spec v1.0.0 + github.com/go-openapi/strfmt v0.27.1 + github.com/go-openapi/swag v0.27.1 + github.com/go-openapi/validate v1.0.0 github.com/gocarina/gocsv v0.0.0-20210516172204-ca9e8a8ddea8 github.com/gocraft/work v0.5.1 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/golang-migrate/migrate/v4 v4.19.1 github.com/gomodule/redigo v2.0.0+incompatible - github.com/google/go-containerregistry v0.20.2 + github.com/google/go-containerregistry v0.21.3 github.com/google/uuid v1.6.0 github.com/gorilla/csrf v1.7.2 github.com/gorilla/handlers v1.5.2 @@ -51,42 +51,42 @@ require ( github.com/redis/go-redis/v9 v9.17.2 github.com/robfig/cron/v3 v3.0.1 github.com/spf13/viper v1.21.0 - github.com/stretchr/testify v1.11.1 + github.com/stretchr/testify v1.12.1 github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible github.com/vmihailenco/msgpack/v5 v5.4.1 github.com/volcengine/volcengine-go-sdk v1.1.44 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.63.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 - go.opentelemetry.io/otel v1.43.0 + go.opentelemetry.io/otel v1.46.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 - go.opentelemetry.io/otel/sdk v1.43.0 - go.opentelemetry.io/otel/trace v1.43.0 + go.opentelemetry.io/otel/sdk v1.46.0 + go.opentelemetry.io/otel/trace v1.46.0 go.pinniped.dev v0.37.0 go.uber.org/ratelimit v0.3.1 - golang.org/x/crypto v0.52.0 - golang.org/x/net v0.55.0 + golang.org/x/crypto v0.55.0 // indirect + golang.org/x/net v0.58.0 golang.org/x/oauth2 v0.36.0 - golang.org/x/sync v0.20.0 - golang.org/x/text v0.37.0 + golang.org/x/sync v0.23.0 + golang.org/x/text v0.41.0 golang.org/x/time v0.15.0 gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 // indirect helm.sh/helm/v3 v3.18.5 - k8s.io/api v0.36.1 - k8s.io/apimachinery v0.36.1 - k8s.io/client-go v0.36.1 + k8s.io/api v0.37.0 + k8s.io/apimachinery v0.37.0 + k8s.io/client-go v0.37.0 sigs.k8s.io/yaml v1.6.0 ) require ( - github.com/aws/aws-sdk-go-v2 v1.41.9 + github.com/aws/aws-sdk-go-v2 v1.46.0 github.com/aws/aws-sdk-go-v2/config v1.32.20 - github.com/aws/aws-sdk-go-v2/credentials v1.19.19 + github.com/aws/aws-sdk-go-v2/credentials v1.20.3 github.com/aws/aws-sdk-go-v2/service/ecr v1.58.0 - github.com/aws/smithy-go v1.26.0 + github.com/aws/smithy-go v1.28.1 github.com/goccy/go-yaml v1.19.2 - github.com/jackc/pgx/v5 v5.10.0 + github.com/jackc/pgx/v5 v5.11.0 ) require ( @@ -102,47 +102,49 @@ require ( github.com/Azure/go-ntlmssp v0.1.0 // indirect github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect github.com/Unknwon/goconfig v0.0.0-20160216183935-5f601ca6ef4d // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.2 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.9.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.37.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.42.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.49.0 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/denverdino/aliyungo v0.0.0-20191227032621-df38c6fa730c // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dnaeon/go-vcr v1.2.0 // indirect - github.com/docker/cli v29.2.0+incompatible // indirect - github.com/docker/docker-credential-helpers v0.8.2 // indirect + github.com/docker/cli v29.3.0+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.3 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.1 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect - github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.25.1 // indirect - github.com/go-openapi/jsonpointer v0.23.1 // indirect - github.com/go-openapi/jsonreference v0.21.6 // indirect - github.com/go-openapi/runtime/server-middleware v0.30.0 // indirect - github.com/go-openapi/swag/conv v0.26.0 // indirect - github.com/go-openapi/swag/fileutils v0.26.0 // indirect - github.com/go-openapi/swag/jsonname v0.26.0 // indirect - github.com/go-openapi/swag/jsonutils v0.26.0 // indirect - github.com/go-openapi/swag/loading v0.26.0 // indirect - github.com/go-openapi/swag/mangling v0.26.0 // indirect - github.com/go-openapi/swag/stringutils v0.26.0 // indirect - github.com/go-openapi/swag/typeutils v0.26.0 // indirect - github.com/go-openapi/swag/yamlutils v0.26.0 // indirect + github.com/go-openapi/analysis v1.0.0 // indirect + github.com/go-openapi/jsonpointer v1.0.0 // indirect + github.com/go-openapi/jsonreference v1.0.1 // indirect + github.com/go-openapi/runtime/server-middleware v0.33.2 // indirect + github.com/go-openapi/swag/cmdutils v0.27.1 // indirect + github.com/go-openapi/swag/conv v0.29.1 // indirect + github.com/go-openapi/swag/fileutils v0.29.1 // indirect + github.com/go-openapi/swag/jsonutils v0.29.1 // indirect + github.com/go-openapi/swag/loading v0.29.1 // indirect + github.com/go-openapi/swag/mangling v0.29.1 // indirect + github.com/go-openapi/swag/netutils v0.27.1 // indirect + github.com/go-openapi/swag/pools v0.29.1 // indirect + github.com/go-openapi/swag/stringutils v0.29.1 // indirect + github.com/go-openapi/swag/typeutils v0.29.1 // indirect + github.com/go-openapi/swag/yamlutils v0.29.1 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -155,65 +157,63 @@ require ( github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/compress v1.18.4 // indirect github.com/lib/pq v1.12.3 // indirect - github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/oklog/ulid/v2 v2.1.1 // indirect + github.com/oklog/ulid/v2 v2.1.2 // indirect github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/pelletier/go-toml/v2 v2.3.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/common v0.63.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/robfig/cron v1.0.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/satori/go.uuid v1.2.0 // indirect github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sirupsen/logrus v1.9.4 // indirect github.com/smartystreets/goconvey v1.8.1 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/objx v0.5.3 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/vbatts/tar-split v0.11.3 // indirect + github.com/vbatts/tar-split v0.12.2 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/volcengine/volc-sdk-golang v1.0.23 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.46.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.3 // indirect - go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/term v0.43.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect google.golang.org/api v0.283.0 // indirect google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect - google.golang.org/grpc v1.81.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc v1.83.2 // indirect google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.2 // indirect k8s.io/klog/v2 v2.140.0 // indirect - k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect - k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect + k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad // indirect + k8s.io/utils v0.0.0-20260626114624-be93311217bd // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect ) replace ( diff --git a/src/go.sum b/src/go.sum index 3a5fc1ee52c..98655849161 100644 --- a/src/go.sum +++ b/src/go.sum @@ -38,7 +38,6 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A= github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudNativeAI/model-spec v0.0.5 h1:gVwvpiVJgGZynvIi+xy0Hp/zh+g1EuWa6x6Czm4P0uA= github.com/CloudNativeAI/model-spec v0.0.5/go.mod h1:3U/4zubBfbUkW59ATSg41HnkYyKrKUcKFH/cVdoPQnk= @@ -65,36 +64,36 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:W github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= -github.com/aws/aws-sdk-go-v2 v1.41.9 h1:/rYeyO2+HrMztAmxAq9++XJtFMqSIpSsNA0yDGALYq4= -github.com/aws/aws-sdk-go-v2 v1.41.9/go.mod h1:+HsoOEX80qAVUitj1A2DhCNTjmb3edVyuDypb6LNEeo= +github.com/aws/aws-sdk-go-v2 v1.46.0 h1:1kt7m/EKcEHt5mlyyxx9cSlMddRPIKbjb6DIQsu4HPk= +github.com/aws/aws-sdk-go-v2 v1.46.0/go.mod h1:bttEH6JqnUL8LepvDVfdrds/fZ5bCIxzpe3abyUrhDU= github.com/aws/aws-sdk-go-v2/config v1.32.20 h1:8VMDnWc/kEzxsI/1ngGM9mG81a8IGmIHD8KLcYGwagc= github.com/aws/aws-sdk-go-v2/config v1.32.20/go.mod h1:PuwEpciweIXGULWeOeSTXtSbH4CW9mWdWrhdCKQI1sM= -github.com/aws/aws-sdk-go-v2/credentials v1.19.19 h1:yuFzSV1U0aRNYCQGVaTY2zW2M/L93pYHnXnrJUphYhU= -github.com/aws/aws-sdk-go-v2/credentials v1.19.19/go.mod h1:7y63L1kGzeoDlJaQ3Z578KrnmfBut96JjvJUzGwR+YE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25 h1:0w6dCiO8iez+YKwRhRBlL1CH/E3GTfdkuzrwj1by8vo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.25/go.mod h1:9FDWUothyr5RCRAHc45XOiVCzUR8n/IhCYX+uVqw6vk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25 h1:Uii3frf9ztec/ABM2/FSH9/z7PLzxfpG8h4RpkUFflQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.25/go.mod h1:G6kntsA2GorAxDPbap6xgB2F+amSLUF8GJTi7PUoX44= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25 h1:r1+/l6m+WaUJF9HISEsNOLHSNj5EXYQxK8VX6Cz9NlA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.25/go.mod h1:cKf+D+NMDK1LndD7BowHbBZPgR9V0/5HubH0PFWvA+c= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26 h1:A1PmWU2zfkIm9EyFlJncFXL4W4phML+h8KjltUsCvNQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.26/go.mod h1:dY4MRzXEizrD4hqtpKvWVGPX7QleSGGVY+EBolo1RmM= +github.com/aws/aws-sdk-go-v2/credentials v1.20.3 h1:tToOYM/LXev4NpfWlIYGDvBvjHmJ3HXpRU9ppl+pM6k= +github.com/aws/aws-sdk-go-v2/credentials v1.20.3/go.mod h1:wfGneWyncO7p67wqXV2IQhPk14JqIc25woKlaArT3WI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.2 h1:Ldv7RPHs7qwwTscRjAl3YBud32f3BvdAGRmSvAx5L38= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.19.2/go.mod h1:XyK6UV8xbo66ysVqLd2783C09pBYHOm8aKTRV5DVJ30= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.2 h1:q/PSLGuRWCChWg+dLnb9dWOnrCxJtnboXbBtFoqqRrI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.2/go.mod h1:TD1jvU2LvXkJexct5vBqcd8QlNXh5EmRUeL/Z32p0n4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.2 h1:6fl86IPqKEXoySqiOWdfgbEp9OVbn44zTfEICNEBDhY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.2/go.mod h1:63HDfhFkdzBpI8WGXTSKUHPKS6mqldj4u3LJW7RZtSU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.2 h1:XMgIRS+uW9F3yFKnXGRrI9pkHi99CXTmoz2kz2/TGBA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.2/go.mod h1:vorxDzK+n3jiv9a5ST/LG0Eu9cSv1CRdKTpG6pDMs+M= github.com/aws/aws-sdk-go-v2/service/ecr v1.58.0 h1:AgcSdMlb2xv8LdnVa3SIdQbf4Yfvo5pVO7G1pFUu8go= github.com/aws/aws-sdk-go-v2/service/ecr v1.58.0/go.mod h1:rVIdQJfKZ3je75aE9AqnBB4Ezk4xldB9aFXXbf/fEeM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10 h1:d5/908OJ4bXg8lyjeMPvXetEKqoDoLi5Owy1zNue3yg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.10/go.mod h1:a57l7Hwh+FWI+we50g5NPJHYUKeJKfXbc4w8SyXu8Ig= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25 h1:dD3dhHNglpd98gs72my22Ndqi1hqQGllFFg1F+twfxg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.25/go.mod h1:0yAbjPfd64gG7mj85RW+fMEYdfBgCRZw8g/oWcL1pjc= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.1 h1:1VwbP3qMNfxUDEXWki4rCE5iA+44VA1lokTz9HasGzw= -github.com/aws/aws-sdk-go-v2/service/signin v1.1.1/go.mod h1:vUtyoSj0OPji3kjIVSc/GlKuWEiL33f/WFxl6dmpy/A= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.19 h1:N6pIsdFOW1Kd9S4KyFKXdGRBojPPxkP32+uHFWLv4Hc= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.19/go.mod h1:3gt5WJArFooNmyLONS+h/R4J+o86II8du38IgCwj9dE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2 h1:hc+lBYiiTr8Zk4MTzIsQ92MeDWCIDvWGmzKUWOaBcOg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.2/go.mod h1:hU6fqB3OJA6/ePheD47LQnxvjYk6br6PtQxs+Q9ojvk= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.3 h1:ErklX/7uhSbkAAeyQD/Y1OoQ9hO3SJXQNEgksORW3Js= -github.com/aws/aws-sdk-go-v2/service/sts v1.42.3/go.mod h1:ULe4HCzfKPiR6R3HEurE3b1upEkuk8AkMrOKtaOxKO8= -github.com/aws/smithy-go v1.26.0 h1:9ouqbi+NyKP7fV3Te7UElCwdAb6Y8uk7LGwPE5tVe/s= -github.com/aws/smithy-go v1.26.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19 h1:bAdDl/HkGCcGPoe25ToSHEw23VIxt6CT5fLcg111BKg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.19/go.mod h1:KaUzbLxv4CeSxh6ZCl9B4m7CuFenS8kUEaDs+f/DQr4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.2 h1:ZtHYnumr6QyxhzEzNZwzQTFJEXOswrZqTTkRxthwvr4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.2/go.mod h1:a1NXrYpBd311gBzn1UI5UzJyyvXktM4xNh/ydPiPpqY= +github.com/aws/aws-sdk-go-v2/service/signin v1.9.0 h1:c3k+k/CS4L+sAIH6fxikL+g5g2LpeNczaoyjjw1iMKI= +github.com/aws/aws-sdk-go-v2/service/signin v1.9.0/go.mod h1:AGIoQg99fBrOIQnF78TLx4lj18mc4gZ0hJx1UaLIFM4= +github.com/aws/aws-sdk-go-v2/service/sso v1.37.0 h1:+rqBaOq7jzInjY8M12hr+zEe85JpRll9BjMx38r33Ok= +github.com/aws/aws-sdk-go-v2/service/sso v1.37.0/go.mod h1:XFlVwUsw3sYh8Hw37umYVJnrcWrwXWRxbNw/JY0bblw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.42.0 h1:hzM3GslEAOBcLn3DHH6ENToFi+vXP+n02W+x6zejAIM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.42.0/go.mod h1:588e7skMkYIYkSUseT8E3WKFfbAfrA1bj3Zf+qxJtJY= +github.com/aws/aws-sdk-go-v2/service/sts v1.49.0 h1:N7Ey8obY3uSui+cxl0OUzFlFmkxSucoJnrniFhw+cLc= +github.com/aws/aws-sdk-go-v2/service/sts v1.49.0/go.mod h1:zMBwjSf4Pt8a1OHYiZ5rPD0PJRK1kQrUaxhS/Dbld8E= +github.com/aws/smithy-go v1.28.1 h1:R/nXH00c8qcfCzQVELtRw+eLQWtzv+VAIEFJ1/xxXlQ= +github.com/aws/smithy-go v1.28.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/beego/beego/v2 v2.3.10 h1:53us+Lzc/bwFwjyRi62+FKFEcWiIbmKbhW4/FQ3aNEw= github.com/beego/beego/v2 v2.3.10/go.mod h1:IY3bkfRge4Yj2XhgdMuvznM4HK/ovxQLOHJxAJ+QRgo= github.com/beego/i18n v0.0.0-20140604031826-e87155e8f0c0 h1:fQaDnUQvBXHHQdGBu9hz8nPznB4BeiPQokvmQVjmNEw= @@ -127,11 +126,10 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= -github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= -github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw= +github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY= github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg= github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -152,14 +150,14 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/cli v29.2.0+incompatible h1:9oBd9+YM7rxjZLfyMGxjraKBKE4/nVyvVfN4qNl9XRM= -github.com/docker/cli v29.2.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v29.3.0+incompatible h1:z3iWveU7h19Pqx7alZES8j+IeFQZ1lhTwb2F+V9SVvk= +github.com/docker/cli v29.3.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= -github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -179,10 +177,10 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= -github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ= +github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/go-asn1-ber/asn1-ber v1.5.8 h1:H9AZkK22UOmfX8J84ubyaZxKJZ3FMHVwn8swoMML7iQ= +github.com/go-asn1-ber/asn1-ber v1.5.8/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= @@ -192,56 +190,60 @@ github.com/go-ldap/ldap/v3 v3.4.13/go.mod h1:LxsGZV6vbaK0sIvYfsv47rfh4ca0JXokCoK github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/analysis v0.25.1 h1:We0FXVvCY5XNSb8GrE+k+wsgkUqTJqnkqsVAC9EGdrM= -github.com/go-openapi/analysis v0.25.1/go.mod h1:/S7h3rOOTHDGoPwyyjTGQpGeLKxWecr8QWSBdE68UgM= -github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA= -github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w= -github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= -github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= -github.com/go-openapi/jsonreference v0.21.6 h1:NZ5nGfnaM1n4I43Xjm1e5/M2GjOwQwndQz22uhxwD+Y= -github.com/go-openapi/jsonreference v0.21.6/go.mod h1:xzbgtQ3ZbWxvET3AxdzCJlJt6vkovbf+IfSPJjD0tUY= -github.com/go-openapi/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ= -github.com/go-openapi/loads v0.23.3/go.mod h1:NOH07zLajXo8y55hom0omlHWDVVvCwBM/S+csCK8LqA= -github.com/go-openapi/runtime v0.32.2 h1:X9mZz716lFwYZ6bFV1BBnthNdHTy46zKM5Em4D1UISI= -github.com/go-openapi/runtime v0.32.2/go.mod h1:IfM3cpgencPuwBp5Uo16i2IQaE74odL7Q4DCGovIQac= -github.com/go-openapi/runtime/server-middleware v0.30.0 h1:8rPoJ/xv7JL8BsovaqboKETlpWBArVh8n+0L/GyePog= -github.com/go-openapi/runtime/server-middleware v0.30.0/go.mod h1:OYNT/TxNvB/VK5oe4htM2jDTwlEXuejVJmu0DVZfAMs= -github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ= -github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ= -github.com/go-openapi/strfmt v0.26.3 h1:rzmslHarJgBbf2qfGge+X3htclQfmXqBZMm0Too0HhU= -github.com/go-openapi/strfmt v0.26.3/go.mod h1:a5nsUw0oRpQzZeOwx8bi6cKbzFZslpbCKt1LEot+KnQ= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I= -github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE= -github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU= -github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc= -github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= -github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= -github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA= -github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y= -github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko= -github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg= -github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ= -github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0= -github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg= -github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE= -github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4= -github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE= -github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ= -github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU= -github.com/go-openapi/testify/enable/yaml/v2 v2.5.1 h1:q9NtHwK4qHF7yZziBPvZyv7zWAIk8ok88Gh2mR6Jpc8= -github.com/go-openapi/testify/enable/yaml/v2 v2.5.1/go.mod h1:JW0MXIotCYps/XsgJnG3a8Q7rE5xAiBwoOD5OfaIQBk= -github.com/go-openapi/testify/v2 v2.5.1 h1:TMdhCaw8fUNraVSf3Omoob1dO/AzBfhtFAPW0an6sBo= -github.com/go-openapi/testify/v2 v2.5.1/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= -github.com/go-openapi/validate v0.25.3 h1:4nzAIavcJ7WveHK2+V1UAkZK3kWcjzxZCzjfZAfavKs= -github.com/go-openapi/validate v0.25.3/go.mod h1:GemfuGMyYpIaBoKpX3z8sLywrmxpzWVOoJ7R0VeAVuk= +github.com/go-openapi/analysis v1.0.0 h1:sNvbAGCJqUTqIAodr9IVqJMmuZas3YS9ms1dGK9yiJ4= +github.com/go-openapi/analysis v1.0.0/go.mod h1:NhYjJ57fnE+bcE7UwrJyMkhWA3Dfz7TdiBfTVAnos4Y= +github.com/go-openapi/errors v0.22.8 h1:oP7sW7TWc3wFFjrzzj0nI83H2qMBkNjNfSd+XRejk/I= +github.com/go-openapi/errors v0.22.8/go.mod h1:BuUoHcYrU6E7V9gfj1I5wLQqgtIHnup/alXZ8KdgQ0w= +github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s= +github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y= +github.com/go-openapi/jsonreference v1.0.1 h1:4zJ7AmYDKNmD3aSpfPnFNCFA5E80/xMHUNKgydaLh38= +github.com/go-openapi/jsonreference v1.0.1/go.mod h1:dYplQXa6p5lXprLcJ8LE2iU7vNpXsAHDQ5ZAgL+Qx3A= +github.com/go-openapi/loads v0.25.2 h1:+uNsDlRQfYtZTrh+3pdwampcAqZVPuBJW0IA82aZHII= +github.com/go-openapi/loads v0.25.2/go.mod h1:RXsfJEQGGNv4uw8u/KdmF8Vh8OR4fTfs9ZO4QrzNohA= +github.com/go-openapi/runtime v0.33.2 h1:HSxskMs0WmpCdQvBWVxHt2t2mXMwn8DDav3VtVidwig= +github.com/go-openapi/runtime v0.33.2/go.mod h1:NQpSLiIsEAIpZDEs6xUrhjm6ZiQh85X8bHKlqLPgNP8= +github.com/go-openapi/runtime/server-middleware v0.33.2 h1:BVFjAaW4Jh/kZ4QSsgDrGzLuSuaKzSiyvappUFKxgUk= +github.com/go-openapi/runtime/server-middleware v0.33.2/go.mod h1:E3mWY61/UgBJ5EUmKh+h6A1oQQdD1U4raowVMmPmQug= +github.com/go-openapi/spec v1.0.0 h1:JtB/GHOj+eetjse6YvxqLze88oEekl/4uPBethvzRrA= +github.com/go-openapi/spec v1.0.0/go.mod h1:boj1PRhqS0x5jylgcNp9BRWxenphrh7vVNYZ90IRCoo= +github.com/go-openapi/strfmt v0.27.1 h1:6yeRws56xbMR8c75R487iLfrREpYnmnBs4g554f5hdk= +github.com/go-openapi/strfmt v0.27.1/go.mod h1:7enjivZtYHpyqjJLetiAOh6McJziVnvIS/e7rX8/798= +github.com/go-openapi/swag v0.27.1 h1:VotvOLWW8q/EAxB0YdsBBGC8XYyeL1YwBj2ungAGPNg= +github.com/go-openapi/swag v0.27.1/go.mod h1:GTkJPwHfhJp6MWr4/rCh64HVI3Ofu+tcsbfjfHmTxpE= +github.com/go-openapi/swag/cmdutils v0.27.1 h1:I7sYqaWVl5mq0NEmNQkAmFDyNin9ufvMX/p2zwtQaOE= +github.com/go-openapi/swag/cmdutils v0.27.1/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag/conv v0.29.1 h1:AC4Eh/5c/eUDOUCzzsRC9ghmFgOSBHeRMGIngY0ZUGA= +github.com/go-openapi/swag/conv v0.29.1/go.mod h1:S1X7/ZrBEZOC0Wc8AGxjbcGS92l3WEjA7aPtpl+RaqM= +github.com/go-openapi/swag/fileutils v0.29.1 h1:ZcPzMceVhU1WPbK6N1G6sNQKdd1CWJlf3cA08UHuoM0= +github.com/go-openapi/swag/fileutils v0.29.1/go.mod h1:/wofKYckbtRl2p3+EwQsosie5CT1B38+dQ+PS579BzI= +github.com/go-openapi/swag/jsonutils v0.29.1 h1:AFCxs0eQZ24/QyfhVHM2t49rMz7Vv3XCsZQI6yrNy+c= +github.com/go-openapi/swag/jsonutils v0.29.1/go.mod h1:u3+sCfJpttDpcmS5kpm0yxL6GK0eWgODsx8Yw8fcqNM= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.1 h1:BiiXE31Bx9SfpsMmOQj5KYpUhTZBpLVriVhJDuLuY2o= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.1/go.mod h1:julgTUKZ9/D0j6O7GKajmRs+812FWxQg/mMpGunWSjg= +github.com/go-openapi/swag/loading v0.29.1 h1:FCv5fG8UhTdDJa2R7w+5O9Ekpcbw7tt0nFWvmDKGBjc= +github.com/go-openapi/swag/loading v0.29.1/go.mod h1:N0ESuem4p2oedKal8EJhciqnJ9Q9Wmt83L1CRB3Fouw= +github.com/go-openapi/swag/mangling v0.29.1 h1:lHALtvYCdxVnRl4GrHmFPwfBTZYIObqdGNSKyu/8D6I= +github.com/go-openapi/swag/mangling v0.29.1/go.mod h1:SAop9pB7PUjQ/CGCNf/JmCKTRK+GDO+RqE9UHqC/N6s= +github.com/go-openapi/swag/netutils v0.27.1 h1:mICMFoS82F5TZ4Zy3cqmcQk+BFeCp3Uyq3Np7GI0/qU= +github.com/go-openapi/swag/netutils v0.27.1/go.mod h1:J+WYyFMLtvtCGqa6jLv+YNUmIKI3ZRQRrvfNDMoQoEQ= +github.com/go-openapi/swag/pools v0.29.1 h1:NRogYxdEW9SjRM4mkAOji9iefO4MRXq3p/ZJcoQbUKg= +github.com/go-openapi/swag/pools v0.29.1/go.mod h1:leDcaghjkRAhCuCRv9NfJU5f0mjoU3cT/XZObhMk3pc= +github.com/go-openapi/swag/stringutils v0.29.1 h1:1ykunK7iJQk1uOO7+oUH1ukbsK85fFCOiCFMOVSY+F0= +github.com/go-openapi/swag/stringutils v0.29.1/go.mod h1:7fSqZ+z8Qc0tOfAAK0jVa5qFGrnIlRi6n7NeGGrr1vc= +github.com/go-openapi/swag/typeutils v0.29.1 h1:Nzv9nhnlLCRBPQqfOX+7lB6Guju370or8StT+lIOf6M= +github.com/go-openapi/swag/typeutils v0.29.1/go.mod h1:hxpgDZJVBkBsi/d3MIUosafoFdE5exaQRmVp0zwu3YE= +github.com/go-openapi/swag/yamlutils v0.29.1 h1:69w3tsBajm7MR/fejLy7HD/3J68Ys1SeeZMEzZ3w2sk= +github.com/go-openapi/swag/yamlutils v0.29.1/go.mod h1:rgsp3vT/QdWzKwn43CigDwjOGIenPyTZMKnxEM8jZOA= +github.com/go-openapi/testify/enable/yaml/v2 v2.7.0 h1:wPW6YRgx3+SID1yUy/Xwa17L8kFEaEKod2VRbJDZNUs= +github.com/go-openapi/testify/enable/yaml/v2 v2.7.0/go.mod h1:mI1M88etYbc3PhgHsWQK2kwvNwW5aGFqMPbmib+SGIs= +github.com/go-openapi/testify/v2 v2.7.0 h1:bycOreEj6wfBvijg3YFogZ/sFjTCDmQnwSodSzHa3X8= +github.com/go-openapi/testify/v2 v2.7.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= +github.com/go-openapi/validate v1.0.0 h1:dFsYCLVUQUL6Vi2lQSexgwmCXDuHe7eWRDhQxkE+xYA= +github.com/go-openapi/validate v1.0.0/go.mod h1:wwXGRqMQzOZ7PCqBcgNk+DD9+Cacnxv7we5T0M/eA3Y= github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU= github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -295,8 +297,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.20.2 h1:B1wPJ1SN/S7pB+ZAimcciVD+r+yV/l/DSArMxlbwseo= -github.com/google/go-containerregistry v0.20.2/go.mod h1:z38EKdKh4h7IP2gSfUUqEvalZBqs6AoLeWfUy34nQC8= +github.com/google/go-containerregistry v0.21.3 h1:Xr+yt3VvwOOn/5nJzd7UoOhwPGiPkYW0zWDLLUXqAi4= +github.com/google/go-containerregistry v0.21.3/go.mod h1:D5ZrJF1e6dMzvInpBPuMCX0FxURz7GLq2rV3Us9aPkc= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -331,8 +333,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.10.0 h1:VhSvgU2jSli8o3AqIEOTJr7rZwAEUVo4E4XhR94Zfr0= -github.com/jackc/pgx/v5 v5.10.0/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/pgx/v5 v5.11.0 h1:IzBBtyK9AHqf98cctWFifYSci2hgQR/cd56wB4p+ogg= +github.com/jackc/pgx/v5 v5.11.0/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -351,8 +353,6 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -363,8 +363,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= +github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -378,8 +378,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= @@ -414,8 +412,8 @@ github.com/ncw/swift v1.0.49/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s= -github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/oklog/ulid/v2 v2.1.2 h1:IEclFb9JNvzYA6MW2SCxbLzcHTVsfqm3PrqGQJH5zec= +github.com/oklog/ulid/v2 v2.1.2/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -460,7 +458,6 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= @@ -468,9 +465,8 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 h1:v9ezJDHA1XGxViAUSIoO/Id7Fl63u6d0YmsAm+/p2hs= github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02/go.mod h1:RF16/A3L0xSa0oSERcnhd8Pu3IXSDZSK2gmGIMsttFE= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= @@ -487,19 +483,14 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= +github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible h1:q+D/Y9jla3afgsIihtyhwyl0c2W+eRWNM9ohVwPiiPw= @@ -508,11 +499,10 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaO github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= -github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= +github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= +github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -529,8 +519,8 @@ go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.63 go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.63.0/go.mod h1:34csimR1lUhdT5HH4Rii9aKPrvBcnFRwxLwcevsU+Kk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= +go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= @@ -539,14 +529,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJK go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8= +go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o= +go.opentelemetry.io/otel/sdk v1.46.0 h1:h5CNQQjEbuQXY/JfZtgt3i7HVFV3aHPO2OAwO2eTYPI= +go.opentelemetry.io/otel/sdk v1.46.0/go.mod h1:GAERFXFt5SYCEB+YiKUbMBeza6UaDH7GmGOZEfh2gSM= +go.opentelemetry.io/otel/sdk/metric v1.46.0 h1:0piZ26EG4RBfebb2jhDH6ERCYHoVWduc3kLgPCwSnSE= +go.opentelemetry.io/otel/sdk/metric v1.46.0/go.mod h1:I1PbKrdVc8Qu8HYVDNtqVIwLwjNrhsV/uFuxfwg8mO4= +go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c= +go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.pinniped.dev v0.37.0 h1:9Bf9RWqEP8mbDirqqQt/A5G09T6vixxxE/DTiHiwJu0= @@ -561,17 +551,17 @@ go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= -go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= -golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M= +golang.org/x/crypto v0.55.0/go.mod h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -586,8 +576,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= +golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -598,8 +588,8 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To= +golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= @@ -607,8 +597,8 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -619,18 +609,16 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= -golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= +golang.org/x/text v0.41.0/go.mod h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -641,8 +629,8 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= +golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -661,15 +649,15 @@ google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11K google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 h1:PvEgGJf9C/1u5CHkInMg7UFYYUoiaQmW2LbtH0pjB78= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= -google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= +google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -706,30 +694,30 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= helm.sh/helm/v3 v3.18.5 h1:Cc3Z5vd6kDrZq9wO9KxKLNEickiTho6/H/dBNRVSos4= helm.sh/helm/v3 v3.18.5/go.mod h1:L/dXDR2r539oPlFP1PJqKAC1CUgqHJDLkxKpDGrWnyg= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= -k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= -k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= -k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= -k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= -k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= +k8s.io/api v0.37.0 h1:Z//Vj9N7RA/yS2sDmxyeo7h+RR4zbUrd2vrd3Z0TbB4= +k8s.io/api v0.37.0/go.mod h1:LKXgcJWMc+f4OLbP5SFR8rulEg07zZhpi/zMULiBImk= +k8s.io/apimachinery v0.37.0 h1:Np2AbDtf8x6RDHiD8T9LbKJ9gaegeVNa8yNm5FuGKm0= +k8s.io/apimachinery v0.37.0/go.mod h1:RN3nhprFSCxOi5Selxd7oMTXOe/c+ZbcE7Im+TS2zkE= +k8s.io/client-go v0.37.0 h1:nsN31fy8wBySuZ+QRnKmrjRSQLOG2rvoGN0tKd12zhQ= +k8s.io/client-go v0.37.0/go.mod h1:FcGqw+Ll/gNQiq+nPGY1Oyt9y7SgDh1d3MW3RFDEbn0= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= -k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= -k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad h1:oXImqH8mQNk7PmvzKhmN3ddJoY6OnyM225MXwGHPm0A= +k8s.io/kube-openapi v0.0.0-20260721132016-d427ff9ee9ad/go.mod h1:0/mqHCVhlumdJ3BhCfnjSZQE037nAhNodh1/hK0T8/I= +k8s.io/utils v0.0.0-20260626114624-be93311217bd h1:Ea7fgQ5we8Y9T0OX5o0dAHzQOBRI07D/dEYRaB9ZZEs= +k8s.io/utils v0.0.0-20260626114624-be93311217bd/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= -sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/src/jobservice/common/rds/scripts.go b/src/jobservice/common/rds/scripts.go index ca43ec489f7..6b0584f114d 100644 --- a/src/jobservice/common/rds/scripts.go +++ b/src/jobservice/common/rds/scripts.go @@ -15,6 +15,7 @@ package rds import ( + "crypto/fips140" "fmt" "github.com/gomodule/redigo/redis" @@ -105,7 +106,7 @@ return st `, luaFuncStCodeText) // SetStatusScript is lua script for setting job status atomically -var SetStatusScript = redis.NewScript(2, setStatusScriptText) +var SetStatusScript *redis.Script // Used to set the hook ACK // @@ -169,7 +170,7 @@ return 'ok' `, luaFuncStCodeText, luaFuncCompareText) // HookAckScript is defined to set the hook event ACK in the job stats map -var HookAckScript = redis.NewScript(2, hookAckScriptText) +var HookAckScript *redis.Script // Used to reset job status // @@ -190,7 +191,15 @@ redis.call('hset', KEYS[2], ARGV[1], 2) ` // StatusResetScript is lua script to reset the job stats -var StatusResetScript = redis.NewScript(2, statusResetScriptText) +var StatusResetScript *redis.Script + +func init() { + fips140.WithoutEnforcement(func() { + SetStatusScript = redis.NewScript(2, setStatusScriptText) + HookAckScript = redis.NewScript(2, hookAckScriptText) + StatusResetScript = redis.NewScript(2, statusResetScriptText) + }) +} // Copy from upstream worker framework // Used by the reaper to re-enqueue jobs that were in progress @@ -228,5 +237,9 @@ return nil`, requeueKeysPerJob) // RedisLuaReenqueueScript returns redis script of redisLuaReenqueueJob func RedisLuaReenqueueScript(jobTypesCount int) *redis.Script { - return redis.NewScript(jobTypesCount*requeueKeysPerJob, redisLuaReenqueueJob) + var script *redis.Script + fips140.WithoutEnforcement(func() { + script = redis.NewScript(jobTypesCount*requeueKeysPerJob, redisLuaReenqueueJob) + }) + return script } diff --git a/src/jobservice/config/config.go b/src/jobservice/config/config.go index 842c8e331a9..1b9c7631f82 100644 --- a/src/jobservice/config/config.go +++ b/src/jobservice/config/config.go @@ -174,7 +174,7 @@ func (c *Configuration) Load(yamlFilePath string, detectEnv bool) error { redisAddress := c.PoolConfig.RedisPoolCfg.RedisURL if !utils.IsEmptyStr(redisAddress) { if _, err := url.Parse(redisAddress); err != nil { - return fmt.Errorf("bad redis url for jobservice, %s", redisAddress) + return errors.New("bad redis url for jobservice") } if !strings.Contains(redisAddress, "://") { c.PoolConfig.RedisPoolCfg.RedisURL = fmt.Sprintf("%s%s", redisSchema, redisAddress) @@ -330,11 +330,11 @@ func (c *Configuration) validate() error { } if c.PoolConfig == nil { - return errors.New("no worker worker is configured") + return errors.New("no worker is configured") } if c.PoolConfig.Backend != JobServicePoolBackendRedis { - return fmt.Errorf("worker worker backend %s does not support", c.PoolConfig.Backend) + return fmt.Errorf("worker backend %s is not supported", c.PoolConfig.Backend) } // When backend is redis diff --git a/src/jobservice/config/config_test.go b/src/jobservice/config/config_test.go index 1d239c31d14..cf458545d5c 100644 --- a/src/jobservice/config/config_test.go +++ b/src/jobservice/config/config_test.go @@ -39,6 +39,22 @@ func (suite *ConfigurationTestSuite) TestConfigLoadingFailed() { assert.NotNil(suite.T(), err, "load config from none-existing document, expect none nil error but got nil") } +func (suite *ConfigurationTestSuite) TestConfigLoadingInvalidRedisURLDoesNotLeakPassword() { + testCases := []string{ + "redis://:secret_pwd@invalid:port:fail", + "redis://:%zz@localhost", + "redis://:secret_%zz_pwd@localhost", + } + for _, tc := range testCases { + suite.T().Setenv("JOB_SERVICE_POOL_REDIS_URL", tc) + cfg := &Configuration{} + err := cfg.Load("../config_test.yml", true) + require.Error(suite.T(), err) + assert.NotContains(suite.T(), err.Error(), "secret") + assert.NotContains(suite.T(), err.Error(), "%zz") + } +} + // TestConfigLoadingSucceed ... func (suite *ConfigurationTestSuite) TestConfigLoadingSucceed() { cfg := &Configuration{} diff --git a/src/jobservice/mgt/manager.go b/src/jobservice/mgt/manager.go index a3bfdde25a7..5d2282fb857 100644 --- a/src/jobservice/mgt/manager.go +++ b/src/jobservice/mgt/manager.go @@ -16,6 +16,7 @@ package mgt import ( "context" + "crypto/fips140" "fmt" "strconv" "strings" @@ -105,11 +106,15 @@ type basicManager struct { // NewManager news a basic manager func NewManager(ctx context.Context, ns string, pool *redis.Pool) Manager { + var client *work.Client + fips140.WithoutEnforcement(func() { + client = work.NewClient(ns, pool) + }) return &basicManager{ ctx: ctx, namespace: ns, pool: pool, - client: work.NewClient(ns, pool), + client: client, } } @@ -261,7 +266,14 @@ func (bm *basicManager) GetScheduledJobs(q *query.Parameter) ([]*job.Stats, int6 page = q.PageNumber } - sJobs, total, err := bm.client.ScheduledJobs(page) + var ( + sJobs []*work.ScheduledJob + total int64 + err error + ) + fips140.WithoutEnforcement(func() { + sJobs, total, err = bm.client.ScheduledJobs(page) + }) if err != nil { return nil, 0, err } diff --git a/src/jobservice/period/basic_scheduler.go b/src/jobservice/period/basic_scheduler.go index d3be53756c8..0d5d7d63927 100644 --- a/src/jobservice/period/basic_scheduler.go +++ b/src/jobservice/period/basic_scheduler.go @@ -16,6 +16,7 @@ package period import ( "context" + "crypto/fips140" "math/rand" "time" @@ -44,12 +45,16 @@ type basicScheduler struct { // NewScheduler is constructor of basicScheduler func NewScheduler(ctx context.Context, namespace string, pool *redis.Pool, ctl lcm.Controller) Scheduler { + var client *work.Client + fips140.WithoutEnforcement(func() { + client = work.NewClient(namespace, pool) + }) return &basicScheduler{ context: ctx, pool: pool, namespace: namespace, enqueuer: newEnqueuer(ctx, namespace, pool, ctl), - client: work.NewClient(namespace, pool), + client: client, ctl: ctl, } } @@ -139,7 +144,10 @@ func (bs *basicScheduler) UnSchedule(policyID string) error { if job.ScheduledStatus == job.Status(e.Info.Status) { // Please pay attention here, the job ID used in the scheduled job queue is // the ID of the periodic job (policy). - if err := bs.client.DeleteScheduledJob(e.Info.RunAt, policyID); err != nil { + fips140.WithoutEnforcement(func() { + err = bs.client.DeleteScheduledJob(e.Info.RunAt, policyID) + }) + if err != nil { logger.Errorf("Delete scheduled job %s error: %s", eID, err) } } @@ -231,7 +239,10 @@ func (bs *basicScheduler) clearDirtyJobs() { continue } - if err = bs.client.DeleteScheduledJob(jobScore.Score, j.ID); err != nil { + fips140.WithoutEnforcement(func() { + err = bs.client.DeleteScheduledJob(jobScore.Score, j.ID) + }) + if err != nil { logger.Errorf("Remove dirty scheduled job error: %s", err) } else { logger.Debugf("Remove dirty scheduled job: %s run at %#v", j.ID, time.Unix(jobScore.Score, 0).String()) diff --git a/src/jobservice/worker/cworker/c_worker.go b/src/jobservice/worker/cworker/c_worker.go index d1a95c68dc3..21a3f317d32 100644 --- a/src/jobservice/worker/cworker/c_worker.go +++ b/src/jobservice/worker/cworker/c_worker.go @@ -15,6 +15,7 @@ package cworker import ( + "crypto/fips140" "fmt" "reflect" "sync" @@ -86,12 +87,21 @@ func NewWorker(ctx *env.Context, namespace string, workerCount uint, redisPool * wc = workerCount } + var pool *work.WorkerPool + var enqueuer *work.Enqueuer + var client *work.Client + fips140.WithoutEnforcement(func() { + pool = work.NewWorkerPool(workerContext{}, wc, namespace, redisPool) + enqueuer = work.NewEnqueuer(namespace, redisPool) + client = work.NewClient(namespace, redisPool) + }) + return &basicWorker{ namespace: namespace, redisPool: redisPool, - pool: work.NewWorkerPool(workerContext{}, wc, namespace, redisPool), - enqueuer: work.NewEnqueuer(namespace, redisPool), - client: work.NewClient(namespace, redisPool), + pool: pool, + enqueuer: enqueuer, + client: client, scheduler: period.NewScheduler(ctx.SystemContext, namespace, redisPool, ctl), ctl: ctl, context: ctx, @@ -136,9 +146,11 @@ func (w *basicWorker) Start() error { // Start the backend worker pool // Add middleware - w.pool.Middleware((*workerContext).logJob) - // Non blocking call - w.pool.Start() + fips140.WithoutEnforcement(func() { + w.pool.Middleware((*workerContext).logJob) + // Non blocking call + w.pool.Start() + }) logger.Infof("Basic worker is started") // Listen to the system signal @@ -199,15 +211,16 @@ func (w *basicWorker) Enqueue(jobName string, params job.Parameters, isUnique bo // check the uniqueness of the job, // Here we only need to make sure only 1 job with the same type and parameters in the queue // For the uniqueness of executing, it can be checked in the running stage - if isUnique { - if j, err = w.enqueuer.EnqueueUnique(jobName, params); err != nil { - return nil, err - } - } else { - // Enqueue job - if j, err = w.enqueuer.Enqueue(jobName, params); err != nil { - return nil, err + fips140.WithoutEnforcement(func() { + if isUnique { + j, err = w.enqueuer.EnqueueUnique(jobName, params) + } else { + // Enqueue job + j, err = w.enqueuer.Enqueue(jobName, params) } + }) + if err != nil { + return nil, err } // avoid backend worker bug @@ -229,15 +242,16 @@ func (w *basicWorker) Schedule(jobName string, params job.Parameters, runAfterSe // check the uniqueness of the job, // Here we only need to make sure only 1 job with the same type and parameters in the queue // For the uniqueness of executing, it can be checked in the running stage - if isUnique { - if j, err = w.enqueuer.EnqueueUniqueIn(jobName, int64(runAfterSeconds), params); err != nil { - return nil, err - } - } else { - // Enqueue job in - if j, err = w.enqueuer.EnqueueIn(jobName, int64(runAfterSeconds), params); err != nil { - return nil, err + fips140.WithoutEnforcement(func() { + if isUnique { + j, err = w.enqueuer.EnqueueUniqueIn(jobName, int64(runAfterSeconds), params) + } else { + // Enqueue job in + j, err = w.enqueuer.EnqueueIn(jobName, int64(runAfterSeconds), params) } + }) + if err != nil { + return nil, err } // avoid backend worker bug @@ -289,7 +303,13 @@ func (w *basicWorker) PeriodicallyEnqueue(jobName string, params job.Parameters, // Info of worker func (w *basicWorker) Stats() (*worker.Stats, error) { // Get the status of worker pool via client - hbs, err := w.client.WorkerPoolHeartbeats() + var ( + hbs []*work.WorkerPoolHeartbeat + err error + ) + fips140.WithoutEnforcement(func() { + hbs, err = w.client.WorkerPoolHeartbeats() + }) if err != nil { return nil, err } @@ -361,7 +381,10 @@ func (w *basicWorker) StopJob(jobID string) error { // Do more for scheduled job kind if t.Job().Info.JobKind == job.KindScheduled { // We need to delete the scheduled job in the queue if it is not running yet - if err := w.client.DeleteScheduledJob(t.Job().Info.RunAt, jobID); err != nil { + fips140.WithoutEnforcement(func() { + err = w.client.DeleteScheduledJob(t.Job().Info.RunAt, jobID) + }) + if err != nil { // Job is already running? logger.Warningf("scheduled job %s (run at = %d) is not found in the queue, is it running?", lib.TrimLineBreaks(jobID), t.Job().Info.RunAt) } @@ -428,19 +451,21 @@ func (w *basicWorker) registerJob(name string, j any) (err error) { // Get more info from j theJ := runner.Wrap(j) // Put into the pool - w.pool.JobWithOptions( - name, - work.JobOptions{ - MaxFails: theJ.MaxFails(), - MaxConcurrency: theJ.MaxCurrency(), - Priority: job.Priority().For(name), - SkipDead: true, - }, - // Use generic handler to handle as we do not accept context with this way. - func(job *work.Job) error { - return redisJob.Run(job) - }, - ) + fips140.WithoutEnforcement(func() { + w.pool.JobWithOptions( + name, + work.JobOptions{ + MaxFails: theJ.MaxFails(), + MaxConcurrency: theJ.MaxCurrency(), + Priority: job.Priority().For(name), + SkipDead: true, + }, + // Use generic handler to handle as we do not accept context with this way. + func(job *work.Job) error { + return redisJob.Run(job) + }, + ) + }) // Keep the name of registered jobs as known jobs for future validation w.knownJobs.Store(name, j) diff --git a/src/lib/cache/cache.go b/src/lib/cache/cache.go index d1780757e37..44c08ce30a3 100644 --- a/src/lib/cache/cache.go +++ b/src/lib/cache/cache.go @@ -96,7 +96,7 @@ func New(typ string, opt ...Option) (Cache, error) { factory, ok := factories[typ] if !ok { - return nil, fmt.Errorf("cache type %s not support", typ) + return nil, fmt.Errorf("cache type %s is not supported", typ) } return factory(opts) diff --git a/src/lib/config/metadata/type.go b/src/lib/config/metadata/type.go index d43a481ae82..2c3886fd6f9 100644 --- a/src/lib/config/metadata/type.go +++ b/src/lib/config/metadata/type.go @@ -67,7 +67,7 @@ func (t *AuthModeType) validate(str string) error { if str == common.LDAPAuth || str == common.DBAuth || str == common.UAAAuth || str == common.HTTPAuth || str == common.OIDCAuth { return nil } - return fmt.Errorf("invalid %s, shoud be one of %s, %s, %s, %s, %s", + return fmt.Errorf("invalid %s, should be one of %s, %s, %s, %s, %s", common.AUTHMode, common.DBAuth, common.LDAPAuth, common.UAAAuth, common.HTTPAuth, common.OIDCAuth) } diff --git a/src/lib/endpoint.go b/src/lib/endpoint.go index 95e6d612391..2ecc8064b25 100644 --- a/src/lib/endpoint.go +++ b/src/lib/endpoint.go @@ -22,9 +22,9 @@ import ( "github.com/goharbor/harbor/src/lib/errors" ) -// ValidateHTTPURL checks whether the provided string is a valid HTTP URL. +// NormalizeAndValidateHTTPURL checks whether the provided string is a valid HTTP URL and normalizes it. // If it is, return the URL in format "scheme://host:port" to avoid the SSRF -func ValidateHTTPURL(s string) (string, error) { +func NormalizeAndValidateHTTPURL(s string) (string, error) { s = strings.Trim(s, " ") s = strings.TrimRight(s, "/") if len(s) == 0 { @@ -41,5 +41,6 @@ func ValidateHTTPURL(s string) (string, error) { return "", errors.New(nil).WithCode(errors.BadRequestCode).WithMessagef("invalid HTTP scheme: %s", url.Scheme) } // To avoid SSRF security issue, refer to #3755 for more detail - return fmt.Sprintf("%s://%s%s", url.Scheme, url.Host, url.Path), nil + // Normalize host to lowercase per RFC 1035 (preserving scheme & path casing) + return fmt.Sprintf("%s://%s%s", url.Scheme, strings.ToLower(url.Host), url.Path), nil } diff --git a/src/lib/endpoint_test.go b/src/lib/endpoint_test.go index 11cd67b79c4..e8d91cc27c8 100644 --- a/src/lib/endpoint_test.go +++ b/src/lib/endpoint_test.go @@ -42,20 +42,23 @@ var testcases = []struct { {"http://127.0.0.%31/", "", false}, {"http://127.0.0.%31:8080/", "", false}, {"http://10.0.0.1/test.txt#/api/version", "http://10.0.0.1/test.txt", true}, + {"http://HARBOR.FOO.COM", "http://harbor.foo.com", true}, + {"http://HARBOR.FOO.COM:8080/MyPath", "http://harbor.foo.com:8080/MyPath", true}, + {"https://My-Registry.Domain.COM/v2/Catalog", "https://my-registry.domain.com/v2/Catalog", true}, } -func TestValidateHTTPURL(t *testing.T) { +func TestNormalizeAndValidateHTTPURL(t *testing.T) { for _, test := range testcases { - url, err := ValidateHTTPURL(test.url) + url, err := NormalizeAndValidateHTTPURL(test.url) if test.valid { if err != nil { - t.Errorf("ValidateHTTPURL:%q gave err %v; want no error", test.url, err) + t.Errorf("NormalizeAndValidateHTTPURL:%q gave err %v; want no error", test.url, err) } if url != test.expectedUrl { - t.Errorf("ValidateHTTPURL:%q gave %s; want %s", test.url, url, test.expectedUrl) + t.Errorf("NormalizeAndValidateHTTPURL:%q gave %s; want %s", test.url, url, test.expectedUrl) } } else if !test.valid && err == nil { - t.Errorf("ValidateHTTPURL:%q gave error; want some error", test.url) + t.Errorf("NormalizeAndValidateHTTPURL:%q gave error; want some error", test.url) } } diff --git a/src/lib/redis/client_test.go b/src/lib/redis/client_test.go index e2f7446a66d..4b2e9c3031f 100644 --- a/src/lib/redis/client_test.go +++ b/src/lib/redis/client_test.go @@ -61,3 +61,23 @@ func TestGetHarborClient(t *testing.T) { assert.Equal(t, client, newClient) } } + +func TestGetRedisPool_InvalidURLDoesNotLeakPassword(t *testing.T) { + testCases := []string{ + "redis://:secret_pwd@invalid:port:fail", + "redis://:%zz@localhost", + "redis://:secret_%zz_pwd@localhost", + } + for _, tc := range testCases { + _, err := GetRedisPool("test-pool", tc, nil) + assert.Error(t, err) + assert.NotContains(t, err.Error(), "secret") + assert.NotContains(t, err.Error(), "%zz") + } +} + +func TestGetRedisPool_SentinelMissingMasterDoesNotLeakPassword(t *testing.T) { + _, err := GetRedisPool("sentinel-pool", "redis+sentinel://:secret_pwd@127.0.0.1:26379", nil) + assert.Error(t, err) + assert.NotContains(t, err.Error(), "secret_pwd") +} diff --git a/src/lib/redis/pool.go b/src/lib/redis/pool.go index e984ee386db..95a37a9a8dc 100644 --- a/src/lib/redis/pool.go +++ b/src/lib/redis/pool.go @@ -59,7 +59,7 @@ func GetRedisPool(name string, rawurl string, param *PoolParam) (*redis.Pool, er u, err := url.Parse(rawurl) if err != nil { - return nil, fmt.Errorf("bad redis url: %s, %s, %s", name, rawurl, err) + return nil, fmt.Errorf("bad redis url for %s", name) } if param == nil { @@ -78,7 +78,7 @@ func GetRedisPool(name string, rawurl string, param *PoolParam) (*redis.Pool, er } } - log.Debug("get redis pool:", name, rawurl) + log.Debug("get redis pool:", name, u.Redacted()) if u.Scheme == "redis" || u.Scheme == "rediss" { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { @@ -110,10 +110,10 @@ func GetRedisPool(name string, rawurl string, param *PoolParam) (*redis.Pool, er func getSentinelPool(u *url.URL, param *PoolParam, name string) (*redis.Pool, error) { ps := strings.Split(u.Path, "/") if len(ps) < 2 { - return nil, fmt.Errorf("bad redis sentinel url: no master name, %s %s", name, u) + return nil, fmt.Errorf("bad redis sentinel url: no master name, %s %s", name, u.Redacted()) } - log.Debug("getSentinelPool:", u) + log.Debug("getSentinelPool:", u.Redacted()) var sentinelOptions []redis.DialOption if param.DialConnectionTimeout > 0 { log.Debug(name, "sentinel DialConnectionTimeout:", param.DialConnectionTimeout) diff --git a/src/lib/trace/config.go b/src/lib/trace/config.go index 256403a4713..c0f3ea363e1 100644 --- a/src/lib/trace/config.go +++ b/src/lib/trace/config.go @@ -38,7 +38,7 @@ type OtelConfig struct { Timeout int `mapstructure:"otel_trace_timeout"` } -func (c *OtelConfig) String() string { +func (c OtelConfig) String() string { return fmt.Sprintf("endpoint: %s, url_path: %s, compression: %t, insecure: %t, timeout: %d", c.Endpoint, c.URLPath, c.Compression, c.Insecure, c.Timeout) } @@ -52,9 +52,13 @@ type JaegerConfig struct { AgentPort string `mapstructure:"jaeger_agent_port"` } -func (c *JaegerConfig) String() string { +func (c JaegerConfig) String() string { + password := c.Password + if len(password) > 0 { + password = "******" + } return fmt.Sprintf("endpoint: %s, username: %s, password: %s, agent_host: %s, agent_port: %s", - c.Endpoint, c.Username, c.Password, c.AgentHost, c.AgentPort) + c.Endpoint, c.Username, password, c.AgentHost, c.AgentPort) } // Config is the configuration for trace @@ -68,7 +72,7 @@ type Config struct { Attributes map[string]string } -func (c *Config) String() string { +func (c Config) String() string { return fmt.Sprintf("{Enabled: %v, ServiceName: %v, SampleRate: %v, Namespace: %v, ServiceName: %v, Jaeger: %v, Otel: %v}", c.Enabled, c.ServiceName, c.SampleRate, c.Namespace, c.ServiceName, c.Jaeger, c.Otel) } diff --git a/src/lib/trace/config_test.go b/src/lib/trace/config_test.go new file mode 100644 index 00000000000..35e57dc59aa --- /dev/null +++ b/src/lib/trace/config_test.go @@ -0,0 +1,94 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestJaegerConfigString(t *testing.T) { + // Value receiver with password + cfgVal := JaegerConfig{ + Endpoint: "http://jaeger:14268", + Username: "admin", + Password: "secret_password_123", + AgentHost: "localhost", + AgentPort: "6831", + } + assert.NotContains(t, cfgVal.String(), "secret_password_123") + assert.Contains(t, cfgVal.String(), "password: ******") + + // Pointer receiver with password + cfgPtr := &JaegerConfig{ + Endpoint: "http://jaeger:14268", + Username: "admin", + Password: "secret_password_123", + AgentHost: "localhost", + AgentPort: "6831", + } + assert.NotContains(t, cfgPtr.String(), "secret_password_123") + assert.Contains(t, cfgPtr.String(), "password: ******") + + // Empty password + cfgEmpty := JaegerConfig{ + Endpoint: "http://jaeger:14268", + Username: "admin", + Password: "", + AgentHost: "localhost", + AgentPort: "6831", + } + assert.Contains(t, cfgEmpty.String(), "password: ,") +} + +func TestConfigStringMasksJaegerPassword(t *testing.T) { + c := Config{ + Enabled: true, + ServiceName: "harbor-core", + Jaeger: JaegerConfig{ + Endpoint: "http://jaeger:14268", + Username: "admin", + Password: "my_super_secret_password", + AgentHost: "localhost", + AgentPort: "6831", + }, + Otel: OtelConfig{ + Endpoint: "http://otel:4317", + }, + } + + // Direct String() call on value + strVal := c.String() + assert.NotContains(t, strVal, "my_super_secret_password") + assert.Contains(t, strVal, "password: ******") + + // Direct String() call on pointer + strPtr := (&c).String() + assert.NotContains(t, strPtr, "my_super_secret_password") + assert.Contains(t, strPtr, "password: ******") + + // Formatted via %v on value + formattedVal := fmt.Sprintf("%v", c) + assert.False(t, strings.Contains(formattedVal, "my_super_secret_password"), "fmt.Sprintf(%%v, c) exposed password: %s", formattedVal) + assert.Contains(t, formattedVal, "password: ******") + + // Formatted via %v on pointer + formattedPtr := fmt.Sprintf("%v", &c) + assert.False(t, strings.Contains(formattedPtr, "my_super_secret_password"), "fmt.Sprintf(%%v, &c) exposed password: %s", formattedPtr) + assert.Contains(t, formattedPtr, "password: ******") +} diff --git a/src/pkg/accessory/model/accessory.go b/src/pkg/accessory/model/accessory.go index c4a8737f85c..92271997a29 100644 --- a/src/pkg/accessory/model/accessory.go +++ b/src/pkg/accessory/model/accessory.go @@ -127,7 +127,7 @@ func New(typ string, data AccessoryData) (Accessory, error) { factory, ok := factories[typ] if !ok { - return nil, fmt.Errorf("accessory type %s not support", typ) + return nil, fmt.Errorf("unsupported accessory type %q", typ) } data.Type = typ @@ -142,7 +142,7 @@ func ToAccessory(acc []byte) (Accessory, error) { } factory, ok := factories[data.Type] if !ok { - return nil, errors.Errorf("accessory type %s not support", data.Type) + return nil, errors.Errorf("unsupported accessory type %q", data.Type) } return factory(data), nil } diff --git a/src/pkg/audit/forward.go b/src/pkg/audit/forward.go index 97b6cec9161..a13a7dad8df 100644 --- a/src/pkg/audit/forward.go +++ b/src/pkg/audit/forward.go @@ -19,6 +19,7 @@ import ( "io" "log/syslog" "os" + "strings" "github.com/goharbor/harbor/src/lib/config" "github.com/goharbor/harbor/src/lib/log" @@ -54,7 +55,7 @@ func (a *LoggerManager) Init(_ context.Context, logEndpoint string) { // DefaultLogger ... func (a *LoggerManager) DefaultLogger(ctx context.Context) *log.Logger { endpoint := config.AuditLogForwardEndpoint(ctx) - if a.endpoint != endpoint { + if !strings.EqualFold(a.endpoint, endpoint) { a.Init(ctx, endpoint) a.initialized = true } diff --git a/src/pkg/exporter/js_collector.go b/src/pkg/exporter/js_collector.go index 277d5d00163..dca3c0c8fa8 100644 --- a/src/pkg/exporter/js_collector.go +++ b/src/pkg/exporter/js_collector.go @@ -15,6 +15,9 @@ package exporter import ( + "crypto/fips140" + + "github.com/gocraft/work" "github.com/gomodule/redigo/redis" "github.com/prometheus/client_golang/prometheus" ) @@ -93,7 +96,13 @@ func (hc *JobServiceCollector) getJobserviceInfo() []prometheus.Metric { // get info via jobservice client cli := GetBackendWorker() // get queue info - qs, err := cli.Queues() + var ( + qs []*work.Queue + err error + ) + fips140.WithoutEnforcement(func() { + qs, err = cli.Queues() + }) checkErr(err, "error when get work task queues info") for _, q := range qs { result = append(result, jobServiceTaskQueueSize.MustNewConstMetric(float64(q.Count), q.JobName)) @@ -101,7 +110,10 @@ func (hc *JobServiceCollector) getJobserviceInfo() []prometheus.Metric { } // get scheduled job info - _, total, err := cli.ScheduledJobs(0) + var total int64 + fips140.WithoutEnforcement(func() { + _, total, err = cli.ScheduledJobs(0) + }) checkErr(err, "error when get scheduled job number") result = append(result, jobServiceScheduledJobTotal.MustNewConstMetric(float64(total))) diff --git a/src/pkg/exporter/js_worker.go b/src/pkg/exporter/js_worker.go index c7c1b7fa421..265fc17d210 100644 --- a/src/pkg/exporter/js_worker.go +++ b/src/pkg/exporter/js_worker.go @@ -15,6 +15,7 @@ package exporter import ( + "crypto/fips140" "fmt" "time" @@ -58,7 +59,9 @@ func InitBackendWorker(redisPoolConfig *RedisPoolConfig) { redisPool = pool jsNamespace = fmt.Sprintf("{%s}", redisPoolConfig.Namespace) // Start the backend worker - jsClient = work.NewClient(jsNamespace, pool) + fips140.WithoutEnforcement(func() { + jsClient = work.NewClient(jsNamespace, pool) + }) } // GetBackendWorker ... diff --git a/src/pkg/jobmonitor/pool.go b/src/pkg/jobmonitor/pool.go index ff97f834572..21de5b1042d 100644 --- a/src/pkg/jobmonitor/pool.go +++ b/src/pkg/jobmonitor/pool.go @@ -16,6 +16,7 @@ package jobmonitor import ( "context" + "crypto/fips140" "github.com/gocraft/work" ) @@ -47,7 +48,11 @@ func NewPoolManager() PoolManager { func (p poolManager) List(_ context.Context, monitorClient JobServiceMonitorClient) ([]*WorkerPool, error) { workerPool := make([]*WorkerPool, 0) - wh, err := monitorClient.WorkerPoolHeartbeats() + var wh []*work.WorkerPoolHeartbeat + var err error + fips140.WithoutEnforcement(func() { + wh, err = monitorClient.WorkerPoolHeartbeats() + }) if err != nil { return workerPool, err } diff --git a/src/pkg/jobmonitor/queue.go b/src/pkg/jobmonitor/queue.go index a4322cf3e26..a58b6fcf0c8 100644 --- a/src/pkg/jobmonitor/queue.go +++ b/src/pkg/jobmonitor/queue.go @@ -16,6 +16,9 @@ package jobmonitor import ( "context" + "crypto/fips140" + + "github.com/gocraft/work" ) // QueueManager defines the operation related to job service queue @@ -32,7 +35,11 @@ func NewQueueClient() QueueManager { func (w *queueManagerImpl) List(_ context.Context, monitClient JobServiceMonitorClient) ([]*Queue, error) { resultQueues := make([]*Queue, 0) - queues, err := monitClient.Queues() + var queues []*work.Queue + var err error + fips140.WithoutEnforcement(func() { + queues, err = monitClient.Queues() + }) if err != nil { return nil, err } diff --git a/src/pkg/jobmonitor/worker.go b/src/pkg/jobmonitor/worker.go index a6b11720f48..7773fc0d7c6 100644 --- a/src/pkg/jobmonitor/worker.go +++ b/src/pkg/jobmonitor/worker.go @@ -16,6 +16,7 @@ package jobmonitor import ( "context" + "crypto/fips140" "strings" "github.com/gocraft/work" @@ -41,7 +42,11 @@ func NewWorkerManager() WorkerManager { } func (w *workerManagerImpl) List(_ context.Context, monitClient JobServiceMonitorClient, poolID string) ([]*Worker, error) { - wphs, err := monitClient.WorkerPoolHeartbeats() + var wphs []*work.WorkerPoolHeartbeat + var err error + fips140.WithoutEnforcement(func() { + wphs, err = monitClient.WorkerPoolHeartbeats() + }) if err != nil { return nil, err } @@ -52,7 +57,10 @@ func (w *workerManagerImpl) List(_ context.Context, monitClient JobServiceMonito } } - workers, err := monitClient.WorkerObservations() + var workers []*work.WorkerObservation + fips140.WithoutEnforcement(func() { + workers, err = monitClient.WorkerObservations() + }) if err != nil { return nil, err } diff --git a/src/pkg/oidc/helper.go b/src/pkg/oidc/helper.go index 4e9ef06f64c..94481faea2c 100644 --- a/src/pkg/oidc/helper.go +++ b/src/pkg/oidc/helper.go @@ -146,7 +146,7 @@ func getOauthConf(ctx context.Context) (*oauth2.Config, error) { } scopes := make([]string, 0) for _, sc := range setting.Scope { - if strings.HasPrefix(p.Endpoint().AuthURL, googleEndpoint) && sc == gooidc.ScopeOfflineAccess { + if strings.HasPrefix(strings.ToLower(p.Endpoint().AuthURL), googleEndpoint) && sc == gooidc.ScopeOfflineAccess { log.Warningf("Dropped unsupported scope: %s ", sc) continue } @@ -179,7 +179,7 @@ func AuthCodeURL(ctx context.Context, state string, pkceCode pkce.Code) (string, for k, v := range setting.ExtraRedirectParms { options = append(options, oauth2.SetAuthURLParam(k, v)) } - if strings.HasPrefix(conf.Endpoint.AuthURL, googleEndpoint) { // make sure the refresh token will be returned + if strings.HasPrefix(strings.ToLower(conf.Endpoint.AuthURL), googleEndpoint) { // make sure the refresh token will be returned options = append(options, oauth2.AccessTypeOffline) options = append(options, oauth2.SetAuthURLParam("prompt", "consent")) } @@ -225,7 +225,6 @@ func VerifyToken(ctx context.Context, rawIDToken string) (*gooidc.IDToken, error } func verifyTokenWithConfig(ctx context.Context, rawIDToken string, conf *gooidc.Config) (*gooidc.IDToken, error) { - log.Debugf("Raw ID token for verification: %s", rawIDToken) p, err := provider.get(ctx) if err != nil { return nil, err diff --git a/src/pkg/p2p/preheat/provider/auth/cred.go b/src/pkg/p2p/preheat/provider/auth/cred.go index cde2e575698..615756daf7a 100644 --- a/src/pkg/p2p/preheat/provider/auth/cred.go +++ b/src/pkg/p2p/preheat/provider/auth/cred.go @@ -14,6 +14,8 @@ package auth +import "fmt" + const ( // AuthModeNone means no auth required AuthModeNone = "NONE" @@ -35,3 +37,16 @@ type Credential struct { // If authMode is 'CUSTOM', then 'header_key' with corresponding header value are stored. Data map[string]string } + +// String implements fmt.Stringer to prevent cleartext credentials from being printed or logged. +func (c *Credential) String() string { + if c == nil { + return "" + } + return fmt.Sprintf("{Mode:%s Data:}", c.Mode) +} + +// GoString prevents Go-syntax formatting from exposing credential data. +func (c *Credential) GoString() string { + return c.String() +} diff --git a/src/pkg/p2p/preheat/provider/auth/handler_test.go b/src/pkg/p2p/preheat/provider/auth/handler_test.go index 1f2132f0617..78bd52e66bf 100644 --- a/src/pkg/p2p/preheat/provider/auth/handler_test.go +++ b/src/pkg/p2p/preheat/provider/auth/handler_test.go @@ -100,3 +100,18 @@ func (suite *AuthHandlerTestSuite) TestCustomHandler() { require.NoError(suite.T(), err, "authorize HTTP request") suite.Equal("my-api-key", r.Header.Get("api-key"), "check custom authorization header") } + +// TestCredentialRedactedString test credential String method redacting sensitive data +func (suite *AuthHandlerTestSuite) TestCredentialRedactedString() { + var nilCred *Credential + suite.Equal("", nilCred.String(), "nil credential String") + + cred := &Credential{ + Mode: AuthModeBasic, + Data: map[string]string{ + "username": "secretpassword", + }, + } + suite.Equal("{Mode:BASIC Data:}", cred.String(), "credential String redaction") + suite.Equal("{Mode:BASIC Data:}", fmt.Sprintf("%v", cred), "credential fmt.Sprintf redaction") +} diff --git a/src/pkg/p2p/preheat/provider/client/http_client.go b/src/pkg/p2p/preheat/provider/client/http_client.go index d3acbfdead1..e78aeb0d56c 100644 --- a/src/pkg/p2p/preheat/provider/client/http_client.go +++ b/src/pkg/p2p/preheat/provider/client/http_client.go @@ -149,7 +149,7 @@ func (hc *HTTPClient) get(url string, cred *auth.Credential, parmas map[string]s // Post content to the service specified by the url func (hc *HTTPClient) Post(url string, cred *auth.Credential, body any, options map[string]string) ([]byte, error) { bytes, err := hc.post(url, cred, body, options) - logMsg := fmt.Sprintf("Post %s with cred=%v, options=%v", url, cred, options) + logMsg := fmt.Sprintf("Post %s with options=%v", url, options) if err != nil { log.Errorf("%s: %s", logMsg, err) } else { diff --git a/src/pkg/p2p/preheat/provider/dragonfly.go b/src/pkg/p2p/preheat/provider/dragonfly.go index ebfb429e713..3048cccef9c 100644 --- a/src/pkg/p2p/preheat/provider/dragonfly.go +++ b/src/pkg/p2p/preheat/provider/dragonfly.go @@ -202,7 +202,7 @@ func (dd *DragonflyDriver) GetHealth() (*DriverStatus, error) { } url := fmt.Sprintf("%s%s", strings.TrimSuffix(dd.instance.Endpoint, "/"), dragonflyHealthPath) - url, err := lib.ValidateHTTPURL(url) + url, err := lib.NormalizeAndValidateHTTPURL(url) if err != nil { return nil, err } diff --git a/src/pkg/p2p/preheat/provider/kraken.go b/src/pkg/p2p/preheat/provider/kraken.go index 3d1ceafb19a..1c9b37cd912 100644 --- a/src/pkg/p2p/preheat/provider/kraken.go +++ b/src/pkg/p2p/preheat/provider/kraken.go @@ -60,7 +60,7 @@ func (kd *KrakenDriver) GetHealth() (*DriverStatus, error) { } url := fmt.Sprintf("%s%s", strings.TrimSuffix(kd.instance.Endpoint, "/"), krakenHealthPath) - url, err := lib.ValidateHTTPURL(url) + url, err := lib.NormalizeAndValidateHTTPURL(url) if err != nil { return nil, err } diff --git a/src/pkg/proxy/connection/limit.go b/src/pkg/proxy/connection/limit.go index f393ae4e524..d5524b044a2 100644 --- a/src/pkg/proxy/connection/limit.go +++ b/src/pkg/proxy/connection/limit.go @@ -16,6 +16,7 @@ package connection import ( "context" + "crypto/fips140" "fmt" "github.com/redis/go-redis/v9" @@ -47,7 +48,7 @@ else end ` -var acquireScript = redis.NewScript(increaseWithLimitText) +var acquireScript *redis.Script // Acquire tries to acquire a connection, returns true if successful func (c *ConnLimiter) Acquire(ctx context.Context, rdb *redis.Client, key string, limit int) bool { @@ -68,7 +69,14 @@ end return 0 ` -var decreaseScript = redis.NewScript(decreaseText) +var decreaseScript *redis.Script + +func init() { + fips140.WithoutEnforcement(func() { + acquireScript = redis.NewScript(increaseWithLimitText) + decreaseScript = redis.NewScript(decreaseText) + }) +} // Release releases a connection in redis func (c *ConnLimiter) Release(ctx context.Context, rdb *redis.Client, key string) { diff --git a/src/pkg/proxy/secret/manager.go b/src/pkg/proxy/secret/manager.go index a461e67ed1b..a0eac4e9c61 100644 --- a/src/pkg/proxy/secret/manager.go +++ b/src/pkg/proxy/secret/manager.go @@ -132,7 +132,7 @@ func (man *mgr) gc() { man.m.Range(func(k, v any) bool { repoV, ok := v.(targetRepository) if ok && repoV.expiresAt.Before(time.Now()) { - log.Debugf("Removed expire secret: %s, repo: %s", k, repoV.name) + log.Debugf("Removed expired secret for repo: %s", repoV.name) man.delete(k.(string)) } return true diff --git a/src/pkg/reg/adapter/aliacr/adapter.go b/src/pkg/reg/adapter/aliacr/adapter.go index d46990e5b44..3ef5d424543 100644 --- a/src/pkg/reg/adapter/aliacr/adapter.go +++ b/src/pkg/reg/adapter/aliacr/adapter.go @@ -56,7 +56,7 @@ func init() { // example: // https://cr.%s.aliyuncs.com -var regACRServiceURL = regexp.MustCompile(`https://cr\.([\w\-]+)\.aliyuncs\.com`) +var regACRServiceURL = regexp.MustCompile(`(?i)https://cr\.([\w\-]+)\.aliyuncs\.com`) func getRegistryURL(url string) (string, error) { if url == "" { @@ -66,7 +66,7 @@ func getRegistryURL(url string) (string, error) { if rs == nil { return url, nil } - return fmt.Sprintf(registryEndpointTpl, rs[1]), nil + return fmt.Sprintf(registryEndpointTpl, strings.ToLower(rs[1])), nil } // example: diff --git a/src/pkg/reg/adapter/aliacr/adapter_test.go b/src/pkg/reg/adapter/aliacr/adapter_test.go index ffacd30cf00..d495fd1b49b 100644 --- a/src/pkg/reg/adapter/aliacr/adapter_test.go +++ b/src/pkg/reg/adapter/aliacr/adapter_test.go @@ -102,6 +102,12 @@ func Test_getRegistryURL(t *testing.T) { "https://registry.cn-hangzhou.aliyuncs.com", false, }, + { + "change match mixed case url", + "https://CR.CN-Hangzhou.AliyunCS.com", + "https://registry.cn-hangzhou.aliyuncs.com", + false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/src/pkg/reg/adapter/awsecr/adapter.go b/src/pkg/reg/adapter/awsecr/adapter.go index cbdcac19bcd..ead87a570fd 100644 --- a/src/pkg/reg/adapter/awsecr/adapter.go +++ b/src/pkg/reg/adapter/awsecr/adapter.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "regexp" + "strings" "github.com/aws/aws-sdk-go-v2/aws" awsecrapi "github.com/aws/aws-sdk-go-v2/service/ecr" @@ -31,7 +32,7 @@ import ( ) const ( - ecrPattern = "https://(?:api|(\\d+)\\.dkr)\\.ecr(?:-public|-fips)?\\.([\\w\\-]+)\\.(amazonaws\\.com(\\.cn)?|sc2s\\.sgov\\.gov|c2s\\.ic\\.gov)" + ecrPattern = "(?i)https://(?:api|(\\d+)\\.dkr)\\.ecr(?:-public|-fips)?\\.([\\w\\-]+)\\.(amazonaws\\.com(\\.cn)?|sc2s\\.sgov\\.gov|c2s\\.ic\\.gov)" ) var ( @@ -69,7 +70,7 @@ func parseAccountRegion(url string) (string, string, error) { if rs == nil || len(rs) < 3 { return "", "", errors.New("bad aws url") } - return rs[1], rs[2], nil + return rs[1], strings.ToLower(rs[2]), nil } type factory struct { diff --git a/src/pkg/reg/adapter/awsecr/adapter_test.go b/src/pkg/reg/adapter/awsecr/adapter_test.go index d2f5848b1c2..e5ef62703d1 100644 --- a/src/pkg/reg/adapter/awsecr/adapter_test.go +++ b/src/pkg/reg/adapter/awsecr/adapter_test.go @@ -115,6 +115,17 @@ func TestAdapter_NewAdapter(t *testing.T) { }) assert.Nil(t, err) assert.NotNil(t, adapter) + + adapter, err = newAdapter(&model.Registry{ + Type: model.RegistryTypeAwsEcr, + Credential: &model.Credential{ + AccessKey: "xxx", + AccessSecret: "ppp", + }, + URL: "https://123456.DKR.ECR.TEST-REGION.AMAZONAWS.COM", + }) + assert.Nil(t, err) + assert.NotNil(t, adapter) } func TestParseAccountRegion(t *testing.T) { @@ -136,6 +147,18 @@ func TestParseAccountRegion(t *testing.T) { expectedReg: "us-west-2", expectErr: false, }, + { + url: "https://123456.DKR.ECR.US-WEST-2.AMAZONAWS.COM", + expectedID: "123456", + expectedReg: "us-west-2", + expectErr: false, + }, + { + url: "HTTPS://API.ECR.CN-NORTH-1.AMAZONAWS.COM.CN", + expectedID: "", + expectedReg: "cn-north-1", + expectErr: false, + }, { url: "https://api.ecr-public.us-east-1.amazonaws.com", expectedID: "", @@ -372,7 +395,7 @@ func TestAwsAuthCredential_Modify(t *testing.T) { "test-region", "xxx", "ppp", true, "", &server.URL) require.Nil(t, err) a, _ := NewAuth("xxx", svc).(*awsAuthCredential) - req := httptest.NewRequest(http.MethodGet, "https://1234.dkr.ecr.test-region.amazonaws.com/v2/", nil) + req := httptest.NewRequest(http.MethodGet, "https://1234.DKR.ECR.TEST-REGION.AMAZONAWS.COM/v2/", nil) err = a.Modify(req) require.Nil(t, err) err = a.Modify(req) diff --git a/src/pkg/reg/adapter/awsecr/auth.go b/src/pkg/reg/adapter/awsecr/auth.go index e222817bc43..0a22842a7c6 100644 --- a/src/pkg/reg/adapter/awsecr/auth.go +++ b/src/pkg/reg/adapter/awsecr/auth.go @@ -58,7 +58,7 @@ const DefaultCacheExpiredTime = time.Hour * 1 func (a *awsAuthCredential) Modify(req *http.Request) error { // url maybe redirect to s3 - if !strings.Contains(req.URL.Host, ".ecr.") { + if !strings.Contains(strings.ToLower(req.URL.Host), ".ecr.") { return nil } if !a.isTokenValid() { diff --git a/src/pkg/reg/adapter/harbor/base/adapter.go b/src/pkg/reg/adapter/harbor/base/adapter.go index 957b6e16a6f..0a32685e143 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter.go +++ b/src/pkg/reg/adapter/harbor/base/adapter.go @@ -24,6 +24,7 @@ import ( common_http "github.com/goharbor/harbor/src/common/http" "github.com/goharbor/harbor/src/common/http/modifier" common_http_auth "github.com/goharbor/harbor/src/common/http/modifier/auth" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/pkg/reg/adapter/native" @@ -314,8 +315,12 @@ type Project struct { RegistryID int64 `json:"registry_id"` } -func isLocalHarbor(url string) bool { - return url == os.Getenv("CORE_URL") +func isLocalHarbor(rawURL string) bool { + coreURL := os.Getenv("CORE_URL") + if rawURL == "" || coreURL == "" { + return false + } + return utils.EqualURL(rawURL, coreURL) } // check whether the current process is running inside core diff --git a/src/pkg/reg/adapter/harbor/base/adapter_test.go b/src/pkg/reg/adapter/harbor/base/adapter_test.go index 9866e764dad..d3978d3f162 100644 --- a/src/pkg/reg/adapter/harbor/base/adapter_test.go +++ b/src/pkg/reg/adapter/harbor/base/adapter_test.go @@ -315,3 +315,96 @@ func TestListProjects(t *testing.T) { require.Equal(t, "p1", projects[0].Name) require.Equal(t, "p2", projects[1].Name) } + +func TestIsLocalHarbor(t *testing.T) { + tests := []struct { + name string + coreURL string + rawURL string + expected bool + }{ + { + name: "Identical URLs", + coreURL: "http://core:8080", + rawURL: "http://core:8080", + expected: true, + }, + { + name: "Case insensitive host", + coreURL: "http://core:8080", + rawURL: "http://CORE:8080", + expected: true, + }, + { + name: "Case sensitive path", + coreURL: "http://core:8080/api", + rawURL: "http://core:8080/API", + expected: false, + }, + { + name: "Different URLs", + coreURL: "http://core:8080", + rawURL: "http://other:8080", + expected: false, + }, + { + name: "Invalid raw URL", + coreURL: "http://core:8080", + rawURL: "http://\x7finvalid-url", + expected: false, + }, + { + name: "Invalid core URL", + coreURL: "http://\x7finvalid-url", + rawURL: "http://core:8080", + expected: false, + }, + { + name: "Empty core URL", + coreURL: "", + rawURL: "http://core:8080", + expected: false, + }, + { + name: "Empty raw URL", + coreURL: "http://core:8080", + rawURL: "", + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv("CORE_URL", tt.coreURL) + actual := isLocalHarbor(tt.rawURL) + assert.Equal(t, tt.expected, actual) + }) + } +} + +func TestIsInCore(t *testing.T) { + tests := []struct { + name string + extEndpoint string + expected bool + }{ + { + name: "In Core with endpoint", + extEndpoint: "http://core:8080", + expected: true, + }, + { + name: "Not in Core with empty endpoint", + extEndpoint: "", + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv("EXT_ENDPOINT", tt.extEndpoint) + actual := isInCore() + assert.Equal(t, tt.expected, actual) + }) + } +} diff --git a/src/pkg/reg/adapter/tencentcr/adapter.go b/src/pkg/reg/adapter/tencentcr/adapter.go index 77213cebe8c..0a625b4cb42 100644 --- a/src/pkg/reg/adapter/tencentcr/adapter.go +++ b/src/pkg/reg/adapter/tencentcr/adapter.go @@ -94,6 +94,19 @@ type adapter struct { **/ var _ adp.Adapter = &adapter{} +// validateEndpoint checks if the TCR endpoint is valid and returns the lowercased host. +func validateEndpoint(rawURL string) (string, bool) { + registryURL, err := url.Parse(rawURL) + if err != nil || registryURL == nil { + return "", false + } + host := strings.ToLower(registryURL.Hostname()) + if host == "" || !strings.HasSuffix(host, ".tencentcloudcr.com") || host == ".tencentcloudcr.com" { + return "", false + } + return host, true +} + func newAdapter(registry *model.Registry) (a *adapter, err error) { if !isSecretID(registry.Credential.AccessKey) { err = errors.New("[tencent-tcr.newAdapter] Please use SecretId/SecretKey, NOT docker login Username/Password") @@ -105,9 +118,16 @@ func newAdapter(registry *model.Registry) (a *adapter, err error) { var registryURL *url.URL registryURL, _ = url.Parse(registry.URL) - // only validate registryURL.Host in non-UT scenario + var host string + if registryURL != nil { + host = strings.ToLower(registryURL.Hostname()) + } + + // only validate registryURL in non-UT scenario if os.Getenv("UTTEST") != "true" { - if !strings.Contains(registryURL.Host, ".tencentcloudcr.com") { + var ok bool + host, ok = validateEndpoint(registry.URL) + if !ok { log.Errorf("[tencent-tcr.newAdapter] errInvalidTcrEndpoint=%v", err) return nil, errInvalidTcrEndpoint } @@ -135,7 +155,7 @@ func newAdapter(registry *model.Registry) (a *adapter, err error) { req.Filters = []*tcr.Filter{ { Name: common.StringPtr("RegistryName"), - Values: []*string{common.StringPtr(strings.ReplaceAll(registryURL.Host, ".tencentcloudcr.com", ""))}, + Values: []*string{common.StringPtr(strings.TrimSuffix(host, ".tencentcloudcr.com"))}, }, } var resp *tcr.DescribeInstancesResponse diff --git a/src/pkg/reg/adapter/tencentcr/adapter_test.go b/src/pkg/reg/adapter/tencentcr/adapter_test.go index 91a7057767a..7e707d4acd1 100644 --- a/src/pkg/reg/adapter/tencentcr/adapter_test.go +++ b/src/pkg/reg/adapter/tencentcr/adapter_test.go @@ -104,6 +104,32 @@ func TestAdapter_NewAdapter_Pingfailed(t *testing.T) { assert.Nil(t, adapter) } +func TestAdapter_validateEndpoint(t *testing.T) { + validEndpoints := []string{ + "https://my-registry.tencentcloudcr.com", + "https://my-registry.TencentCloudCR.com", + "https://my-registry.tencentcloudcr.com:443", + "http://sub.my-registry.tencentcloudcr.com:8080", + } + for _, ep := range validEndpoints { + host, ok := validateEndpoint(ep) + assert.True(t, ok, "expected valid endpoint for %s", ep) + assert.NotEmpty(t, host) + } + + invalidEndpoints := []string{ + "$$$", + "https://registry.tencentcloudcr.com.attacker.example", + "https://attacker.example/.tencentcloudcr.com", + "https://not-tencentcloudcr.com", + "https://.tencentcloudcr.com", + } + for _, ep := range invalidEndpoints { + _, ok := validateEndpoint(ep) + assert.False(t, ok, "expected invalid endpoint for %s", ep) + } +} + func TestAdapter_NewAdapter_InvalidAKSK(t *testing.T) { // Error AK/SK adapter, err := newAdapter(&model.Registry{ diff --git a/src/pkg/reg/adapter/tencentcr/auth.go b/src/pkg/reg/adapter/tencentcr/auth.go index b905628c6fa..0e45686019b 100644 --- a/src/pkg/reg/adapter/tencentcr/auth.go +++ b/src/pkg/reg/adapter/tencentcr/auth.go @@ -39,7 +39,7 @@ func (q *qcloudAuthCredential) Modify(r *http.Request) (err error) { } } r.SetBasicAuth(q.cacheTokener.username, q.cacheTokener.token) - log.Debugf("[qcloudAuthCredential.Modify]Host: %v, header: %#v", r.Host, r.Header) + log.Debugf("[qcloudAuthCredential.Modify]Host: %v", r.Host) return } @@ -89,7 +89,7 @@ func (q *qcloudAuthCredential) getTempInstanceToken() (err error) { q.cacheTokener = &temporaryTokener{*resp.Response.Username, *resp.Response.Token} q.cacheTokenExpiredAt = time.Unix(*resp.Response.ExpTime/1e3, *resp.Response.ExpTime%1e3) - log.Debugf("[qcloudAuthCredential.getTempInstanceToken]Update temp token=%#v, cacheTokenExpiredAt=%s, unix=%v", q.cacheTokener, + log.Debugf("[qcloudAuthCredential.getTempInstanceToken]Update temp token for user=%s, cacheTokenExpiredAt=%s, unix=%v", q.cacheTokener.username, q.cacheTokenExpiredAt.UTC().String(), *resp.Response.ExpTime) return diff --git a/src/pkg/reg/adapter/volcenginecr/consts.go b/src/pkg/reg/adapter/volcenginecr/consts.go index d4844fed773..8e29a180a16 100644 --- a/src/pkg/reg/adapter/volcenginecr/consts.go +++ b/src/pkg/reg/adapter/volcenginecr/consts.go @@ -23,7 +23,7 @@ var ( errListNamespaceResp = errors.New("[VolcengineCR adapt] ListNamespaces resp nil") errListRepositoriesResp = errors.New("[VolcengineCR adapt] ListRepositories resp nil") errListTagsResp = errors.New("[VolcengineCR adapt] ListTags resp nil") - errPareseDigest = errors.New("[VolcengineCR adapt] fail to parse reference") + errPareseDigest = errors.New("[VolcengineCR adapt] failed to parse reference") errNilVolcCrClient = errors.New("[volcengine-cr.createRepository] nil volcCr client") ) diff --git a/src/pkg/reg/adapter/volcenginecr/helper.go b/src/pkg/reg/adapter/volcenginecr/helper.go index a242411d5da..545853e8ba2 100644 --- a/src/pkg/reg/adapter/volcenginecr/helper.go +++ b/src/pkg/reg/adapter/volcenginecr/helper.go @@ -19,6 +19,7 @@ import ( "fmt" "net/http" "regexp" + "strings" "github.com/docker/distribution/registry/client/auth/challenge" @@ -27,20 +28,20 @@ import ( ) func getRegionRegistryName(url string) (string, string, error) { - reg := regexp.MustCompile(`https://(.*)\.cr\.volces|ivolces\.com`) + reg := regexp.MustCompile(`(?i)https://(.*)\.cr\.(?:volces|ivolces)\.com`) rs := reg.FindStringSubmatch(url) if rs == nil || len(rs) != 2 { return "", "", errors.New("Invalid url") } registryNameRegion := rs[1] for regionReg := range regionRegs { - reg = regexp.MustCompile(regionReg) + reg = regexp.MustCompile("(?i)" + regionReg) res := reg.FindStringSubmatch(registryNameRegion) if res == nil || len(res) != 3 { log.Debug("fail to match", "reg", regionReg) continue } - return res[2], res[1], nil + return strings.ToLower(res[2]), res[1], nil } return "", "", errors.New("invalid region") diff --git a/src/pkg/reg/adapter/volcenginecr/helper_test.go b/src/pkg/reg/adapter/volcenginecr/helper_test.go index 6e22eda9e04..9738a378b9f 100644 --- a/src/pkg/reg/adapter/volcenginecr/helper_test.go +++ b/src/pkg/reg/adapter/volcenginecr/helper_test.go @@ -17,6 +17,8 @@ func Test_getRegionRegistryNamer(t *testing.T) { wantErr bool }{ {"registry beijing", "https://enterprise-cn-beijing.cr.volces.com", "cn-beijing", "enterprise", false}, + {"registry beijing mixed case", "https://Enterprise-CN-Beijing.CR.Volces.com", "cn-beijing", "Enterprise", false}, + {"registry ivolces", "https://enterprise-cn-beijing.cr.ivolces.com", "cn-beijing", "enterprise", false}, {"invalid url", "http://enterprise-cn-beijing.cr.volces.com", "", "", true}, {"invalid region", "https://enterprise-us-test.cr.volces.com", "", "", true}, {"invalid suffix", "https://enterprise-us-test.cr-test.volces.com", "", "", true}, diff --git a/src/pkg/registry/auth/authorizer.go b/src/pkg/registry/auth/authorizer.go index 171d94ab93f..6d45a5bcd73 100644 --- a/src/pkg/registry/auth/authorizer.go +++ b/src/pkg/registry/auth/authorizer.go @@ -137,7 +137,7 @@ func (a *authorizer) isTarget(req *http.Request) bool { if index == -1 { return false } - if req.URL.Host != a.url.Host || req.URL.Scheme != a.url.Scheme || + if !strings.EqualFold(req.URL.Host, a.url.Host) || req.URL.Scheme != a.url.Scheme || req.URL.Path[:index+4] != a.url.Path { return false } diff --git a/src/pkg/scan/dao/scanner/model.go b/src/pkg/scan/dao/scanner/model.go index ccb9bb0cbfb..b7e2323c930 100644 --- a/src/pkg/scan/dao/scanner/model.go +++ b/src/pkg/scan/dao/scanner/model.go @@ -106,7 +106,7 @@ func (r *Registration) Validate(checkUUID bool) error { return errors.New("missing registration name") } - url, err := lib.ValidateHTTPURL(r.URL) + url, err := lib.NormalizeAndValidateHTTPURL(r.URL) if err != nil { return errors.Wrap(err, "scanner registration validate") } diff --git a/src/pkg/scan/init.go b/src/pkg/scan/init.go index 243ccc87dbd..2a38612f7f1 100644 --- a/src/pkg/scan/init.go +++ b/src/pkg/scan/init.go @@ -17,6 +17,7 @@ package scan import ( "context" + "github.com/goharbor/harbor/src/common/utils" "github.com/goharbor/harbor/src/lib/errors" "github.com/goharbor/harbor/src/lib/log" "github.com/goharbor/harbor/src/lib/q" @@ -54,7 +55,7 @@ func EnsureScanners(ctx context.Context, wantedScanners []scanner.Registration) return errors.Errorf("creating registration %s at %s failed: %v", ws.Name, ws.URL, err) } log.Infof("Successfully registered %s scanner at %s", ws.Name, ws.URL) - } else if scanner.URL != ws.URL { + } else if !utils.EqualURL(scanner.URL, ws.URL) { scanner.URL = ws.URL if err := scannerManager.Update(ctx, scanner); err != nil { return errors.Errorf("updating registration %s to %s failed: %v", ws.Name, ws.URL, err) diff --git a/src/pkg/scan/init_test.go b/src/pkg/scan/init_test.go index ce474817594..25cd6fa8b35 100644 --- a/src/pkg/scan/init_test.go +++ b/src/pkg/scan/init_test.go @@ -102,6 +102,28 @@ func TestEnsureScanners(t *testing.T) { mgr.AssertExpectations(t) }) + t.Run("Should not update scanners when URL only differs in host case", func(t *testing.T) { + mgr := &mocks.Manager{} + scannerManager = mgr + + mgr.On("List", mock.Anything, &q.Query{ + Keywords: map[string]any{ + "name__in": []string{ + "trivy", + }, + }, + }).Return([]*scanner.Registration{ + {Name: "trivy", URL: "http://trivy:8080"}, + }, nil) + + err := EnsureScanners(context.TODO(), []scanner.Registration{ + {Name: "trivy", URL: "http://TRIVY:8080"}, + }) + + assert.NoError(t, err) + mgr.AssertExpectations(t) + }) + } func TestEnsureDefaultScanner(t *testing.T) { diff --git a/src/pkg/token/token.go b/src/pkg/token/token.go index 4ff74cfc081..354f7db2b74 100644 --- a/src/pkg/token/token.go +++ b/src/pkg/token/token.go @@ -16,6 +16,7 @@ package token // nolint:revive import ( "crypto/ecdsa" + "crypto/fips140" "crypto/rsa" "errors" @@ -51,7 +52,10 @@ func (tk *Token) Raw() (string, error) { if err != nil { return "", err } - raw, err := tk.Token.SignedString(key) + var raw string + fips140.WithoutEnforcement(func() { + raw, err = tk.Token.SignedString(key) + }) if err != nil { log.Debugf("failed to issue token %v", err) return "", err @@ -65,16 +69,21 @@ func Parse(opt *Options, rawToken string, claims jwt.Claims) (*Token, error) { if err != nil { return nil, err } - var parser = jwt.NewParser(jwt.WithLeeway(common.JwtLeeway), jwt.WithValidMethods([]string{opt.SignMethod.Alg()})) - token, err := parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (any, error) { - switch k := key.(type) { - case *rsa.PrivateKey: - return &k.PublicKey, nil - case *ecdsa.PrivateKey: - return &k.PublicKey, nil - default: - return key, nil - } + var ( + parser = jwt.NewParser(jwt.WithLeeway(common.JwtLeeway), jwt.WithValidMethods([]string{opt.SignMethod.Alg()})) + token *jwt.Token + ) + fips140.WithoutEnforcement(func() { + token, err = parser.ParseWithClaims(rawToken, claims, func(_ *jwt.Token) (any, error) { + switch k := key.(type) { + case *rsa.PrivateKey: + return &k.PublicKey, nil + case *ecdsa.PrivateKey: + return &k.PublicKey, nil + default: + return key, nil + } + }) }) if err != nil { log.Errorf("parse token error, %v", err) @@ -82,7 +91,7 @@ func Parse(opt *Options, rawToken string, claims jwt.Claims) (*Token, error) { } if !token.Valid { - log.Errorf("invalid jwt token, %v", token) + log.Errorf("invalid jwt token") return nil, errors.New("invalid jwt token") } return &Token{ diff --git a/src/portal/app-swagger-ui/package-lock.json b/src/portal/app-swagger-ui/package-lock.json index 3ae005aed93..a6d3d61cb6e 100644 --- a/src/portal/app-swagger-ui/package-lock.json +++ b/src/portal/app-swagger-ui/package-lock.json @@ -10,13 +10,13 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^4.0.0", - "swagger-ui": "5.32.6" + "swagger-ui": "5.32.15" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "webpack": "^5.107.2", + "html-webpack-plugin": "^5.6.8", + "webpack": "^5.110.3", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.15.2" } @@ -150,13 +150,13 @@ "license": "Apache-2.0" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.11.2.tgz", - "integrity": "sha512-keG5q/AR0zIizKCcfcUKiDXDQscw27SyILFb0kFmVWlgv3JTP+8pdXjzCEFW+C8RKg/etap270jv2s8B6ghuXA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.12.1.tgz", + "integrity": "sha512-h1wIHNZ+4eQ00aXgX5VsTFLyi/9JWywK2CNOfZ3xzEfi9Qh/sDNHB9i4pbaGdlE8oxZa8HwqPl7+6M0fLCXfbA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -164,14 +164,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.11.2.tgz", - "integrity": "sha512-ZXxaL1MxE1JWq7HDrifPI89migiy0clYpXMzSc+3FIOPfOaKrdfbF5DKG6r3aQOByfd3jrsFVwMpoL7rRjFkHg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.12.1.tgz", + "integrity": "sha512-aBTAjJ0YzxFccXe5kB3nnVuHxRyPYEaE8eLEs/kJFmbv8UdMji1AVnNSk61MfJ4nodyoMYLfp6AoPa9fWXFgiQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -181,37 +181,52 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.11.2.tgz", - "integrity": "sha512-U96v+tAad0rshqFX22A8ILfWEHz/z3aAtff/HrZk6dCDuoW98kKRySBDbXq2KCa9uMaJQt9C0bxx9DC/1yPYVA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.12.1.tgz", + "integrity": "sha512-y44fOaleXZGIEX+MIUIksA704naPjhvpHEMfadWY/D9DW2JTdwv2edpyZEFjyK1jwchp/b3aQ+XG9MDvfwb8HQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.11.2.tgz", - "integrity": "sha512-Udx0F052IFVXVFLB7q6uLdqn7HV0obFGRoHMWglQXdK3587Ln/0Ct6A+7Q1QEeuMlKmLCTa9YrcC/ButsF3F/g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.12.1.tgz", + "integrity": "sha512-EZmwpku1eMsc7Lvdz0sm/XHkRAmj7FpMwfVm1MfoXiljhPrEVHH6FTZmM3QXaprkOeDMkBTDGtIv/LgYOq/b+w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@swaggerexpert/json-pointer": "^2.10.1" } }, + "node_modules/@swagger-api/apidom-ns-a2a-1": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-a2a-1/-/apidom-ns-a2a-1-1.12.1.tgz", + "integrity": "sha512-/HjUqcV8XpUQET/P5fqVCsm9ZXpeYwHpKVJtv+pIPDF1Zk5thHCKgyC3qIM+/ZGBDqt6MVrhpyrYIvEHFyd3dQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.12.1", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.11.2.tgz", - "integrity": "sha512-vKWtEn/XLABDUrRL8zajmQdqHMRO7pC7QowhuZr7abiH1NIolQqKixEi88MQLKeh+QJ7QQLq4YJlsQ543IHt+Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.12.1.tgz", + "integrity": "sha512-Va3ljpxF8Ti/cMxD8/JdFtEdVg8hxwZ8/1TsUNwcE12qLu9o95hHsqmm8/OlKSqfSpO3KG/QT1TIKmQsl7cAsQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -219,15 +234,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.11.2.tgz", - "integrity": "sha512-2ojvpWrlMgG0/hNMQMWEQ9cZP07ZvUQ2vez7Pws8plxQQY9DklQfmZpgElLfiup2ckYGqJ3VTxb5x36CaGJ07w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.12.1.tgz", + "integrity": "sha512-0G+KnlXb9QVJGC/tJLjkv7oiFBl45xAd8CM9dwwvnG7vBFJZGOq04qs8S8oCuA94ugSvdmave88IA03SEM7FWg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -235,15 +250,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.11.2.tgz", - "integrity": "sha512-hIgphPTfETYe582dJhy8bTU+EPcXhdATnniynYkmKQ0mmMC/im77cBjoOyFRUzAyAeOWD1WpWEoQBStxa1YYzQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.12.1.tgz", + "integrity": "sha512-GQUrBTz74usl88dFrrhRH1btc4sinJ0vb9bnFfBOuQBF0MYvVJ67Vsx1cz6iIfS4Y/2+x63WX5krJlmKavUQ9w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -251,15 +266,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-3": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.11.2.tgz", - "integrity": "sha512-p4K/tsnIAVa7Z4ey4MmSR639SlwHbRH/zWWfZ2PyyMkpTUHNTcPK9kVTck7s3n10amHWn09SKWgVa506W269SQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.12.1.tgz", + "integrity": "sha512-lPJd/zXcCv2zBAjMfxHDbiC0xQD7cpztD403mh74unGsVN9Xj+aBfGMZ9qsh+UdMYhxk6Ad2C4esYkROB2Awqw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -267,15 +282,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.11.2.tgz", - "integrity": "sha512-QFxx47skbBLDtbKeBj5Sa1p3cMbN1xspPIQs5EaTcPcx4SxzMtJlWqfMRtwgkxh1nlCrPwMHZBNq+oJ1ZFWB6A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.12.1.tgz", + "integrity": "sha512-HlzTVQZV1d2twOGcZd7h2LUm/KAaWy0il1Bcwy6pGkdyHcP3lm85xgSbeGuJgn0sE9j0IuZrMuMMwAzcqhMAGA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -283,15 +298,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.11.2.tgz", - "integrity": "sha512-twf6oMAv7bM6CAz8giSw2YcYgsy5niSlrCwLQfeKg1MxaRhDL1d/Ym8EWFCNwHuV/hI/vJn/HBHRuCKwK9XkUA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.12.1.tgz", + "integrity": "sha512-0C5I+0MwE/fPueRoHnbFjUF2v1I85PRRUtlmifRM9NZgbCPJ6X/u5TDhllDmu0UDnvFjrSAGMvS/vw+i77qtdA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -299,14 +314,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.11.2.tgz", - "integrity": "sha512-OMbpfkaoot7yDMGgpIULYZdo4gNZIf84KXvgpJDk2Y/etEMLozV2JWktAq6niV1VwKis1Zwovuk0L4lOCucWIg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.12.1.tgz", + "integrity": "sha512-szwBlRH0jey/FtJ25f8k3rVUuQFg66c9FyLozZzEkMu5MFFGcl/NK2AZ9TRATmcIrpNFuK8FSz9PaPmNEUbnMw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-core": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -314,15 +329,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.11.2.tgz", - "integrity": "sha512-zoUaG+bNBbrzYNv/2K0ijJTwe0g5ljKlXTqC9Fqrobeau/COrYD5Z2ZPTOUASba6Kn3QapICzNDUGnJVyrE6EA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.12.1.tgz", + "integrity": "sha512-HvV5NHiqGNLI4M3BS1RJcRyxVCK4jJd4T2UaSKhZOezy3MaKguGI8oDgwix8eyw+6OwhxuXNQpRMobYb+WaseQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -330,15 +345,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.11.2.tgz", - "integrity": "sha512-fmfqYuoxpWxEIHYTZuMUCOeb/ilihc5lFMRBLB3wwZiZe+srTPoqAsm9qiSF6FKsDMUysiWKl6NYWLQ09K7Qvw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.12.1.tgz", + "integrity": "sha512-t7LqogFYGN1ocxFTkJIXsqM4M66WAWIFW/yBbaGOO//OiuVuRe5wVXzpbJttT3cA2peotQbpKxlBL/GuvxWguA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -346,16 +361,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.11.2.tgz", - "integrity": "sha512-Lq23xu8HXf1M0Z4raw/6d0y4UwjpaBh5bPhhoiRfOAuRIsyDUO4rCDDiT+np/r5jtkM7haexmaLHMkEdknsepA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.12.1.tgz", + "integrity": "sha512-v93DUAk5hehbsp81kJKwbcJbWBVFXcdBqZy8G8Lbo6QeCar1/dP6CWItbn8xArZmG3PeYkZK77v903HEmLxghA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -363,15 +378,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.11.2.tgz", - "integrity": "sha512-XNBJzeSTQvKvuCeC2XCXL7ix4qGXQY6fPddsPSLaEW0XnFddjuASymqivaUbekPgLXs65/OdPqX5jFo/6W6t/A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.12.1.tgz", + "integrity": "sha512-EO2c552sMDtZXllLSQVI5u1+gpo654LW1apmi9YvblCrRek2Gyejoj3otBfo9IFdBEuczbt+Rll3hRnZx3aqeA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -379,17 +394,17 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.11.2.tgz", - "integrity": "sha512-me2giRgbYEryanIBQa6sZiQ2XPVRvrC4KI4J8dZfy/uEALB60CwPAQKMLMhhlIxrXb3AYrHgbSO33hVA6Z3Oxg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.12.1.tgz", + "integrity": "sha512-qDJ6rGUTMLQ5MHWqAQ+3/+VGBjS7je5pYkP3hiF2AeXTESh1/MOjPICxDWE6XDwcvkVOIcXX+xEDt7ulnzvrtA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-json-pointer": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -397,163 +412,195 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.11.2.tgz", - "integrity": "sha512-JjJhddUc+4Uaj+scL0WCjmYiKrnjxKF0hI1wvfVHDqIBJCXJPsuKG5g/EQYHd1Xi9b5ruX0O/PH9PCR7/lvThA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.12.1.tgz", + "integrity": "sha512-H0VmiegQhWc+53xypcxS3T7qUVcfJKX+DYmiPx9FZvvSOp77Ctvc2/RtztGQ5531oFWDWtPt0Ad0VwxmEcfL8w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-json-pointer": "^1.11.2", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", "ts-mixer": "^6.0.3" } }, + "node_modules/@swagger-api/apidom-parser-adapter-a2a-json-1": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-json-1/-/apidom-parser-adapter-a2a-json-1-1.12.1.tgz", + "integrity": "sha512-4Bp56QdMOmv6pkhmDExFlzHHjtB3CqW4rjyo+QcnhiWBmB3qbsS4/rHEQVGNlGtUC+ze0+LbAI4pycAnqF88dQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-a2a-yaml-1": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-yaml-1/-/apidom-parser-adapter-a2a-yaml-1-1.12.1.tgz", + "integrity": "sha512-GsQogmK2vUQXOIImFFSoKnhiJDVOm2K4zxRAtIHrwCVgFqD4mwV+cSojE44dOi7tqH/3bp7yCdo4LilleeetRQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.11.2.tgz", - "integrity": "sha512-HvANhGWUTQqRuY4+2BhQ3QzkhaguXe/+VO3as1Ybqy7lr3DFDNimpDhzPOZqx2e5i5ADLmwfWUmMbMJ/mE2xng==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.12.1.tgz", + "integrity": "sha512-xhUgAXs8Rxssfr3dEWpKhDheeycI9Vt6jtBVEwavcL9+ss8cY9jzVck3R7Ql7P9yBVhF41K4ZTUIO1QJVngYZA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-api-design-systems": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-api-design-systems": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.11.2.tgz", - "integrity": "sha512-liebkLeHDjXIybPher1Z1uMq8ZxCln+fFcVcLZSXkBXEPrPUueAd08K4Xpv5lVRh/p/cPg12b8dZH3F/HuoOfQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.12.1.tgz", + "integrity": "sha512-FPJ9Da6CChE3Xp5+vS8bXrsdmzy7+BrTxLt38SQrpYCpx1fRKsfs+xZqLTRHEhv01QG7Hj7MFG/xGEqK7rt8/w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-api-design-systems": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-api-design-systems": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.11.2.tgz", - "integrity": "sha512-Q8nQobgCzlgkxjA+ICwPS/SbW/3T/PMhV8UjDBqdiSPU3zKDOsOPKFQViGddRWBhAG5LJmV9GlhMPlmc6KLzSA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.12.1.tgz", + "integrity": "sha512-nJB+UWnSU9wz615wsXJfPh5Ij180UOYsMN2icuVADVBKGAAxfEbafq3ATtPVvpBNZBg50eKeIwjAXjjC4OsLMg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.11.2.tgz", - "integrity": "sha512-cnJggQWPUSdUZ0qsIaMVEKlVT7U3+u/bdqFRDio5+cdslaoRhO7VG8jCCWCacdCHVr/jFleJ3RkT8C6VWJ+CRg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.12.1.tgz", + "integrity": "sha512-8lgMKvb0Lhl1C9uNtBYm9DR9Dljpk/u23dH1H/xGAD1A54zZaQYchbyC4VCAHuesmjVT+mWylGoIU0SIlAOcNQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.11.2.tgz", - "integrity": "sha512-Ts2c6XVgzJ5x30Y+RzOeQZ0+XlIBX/YWqxg2D8bIoQPaLmfSFDaZskb0FfxSCpox4OjyOXxbLPYib2IEPf9ZXg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.12.1.tgz", + "integrity": "sha512-HetDS5x6yHF/JeDokHiPNzX5lhm0GbVpy5MMVOcfH7zp9QSBFBGwhJTRPDEYm8PKfjkCMFLzCgiUKwqn73LV4g==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-3": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.11.2.tgz", - "integrity": "sha512-43W+ncs8VwFO3U45qxvrCWjUN1nuup9i1DJCj75x3AG1XCqyFMRcUhzMUWdEs2KykvKws/DvyaTMmy555bMflA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.12.1.tgz", + "integrity": "sha512-FzWH1uVNu3jWG6qB1OtbC76bQburCf3zoi3VPEQONSjT+i2vfcgc+WhAjVxaGQEwpjhbCkF2oo6WPC1hPbxARA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-3": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.11.2.tgz", - "integrity": "sha512-kTV7VhOrPrqe/wwNcmEzP1J49iyAJybrIwHswpr0e5mDExREb9U9BNkOS7SbVjQhP9KHLYhXSHhn0bBAet22CQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.12.1.tgz", + "integrity": "sha512-zkMaQZPbdJ1rg+754BxJsd+gOmFRBAGObJ2xGLSRf7OKqhwJhnJQVGlyYViaNNpzHPfrhc6KeEsiczVqGESDKA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.11.2.tgz", - "integrity": "sha512-LdTRYIYLlS4U2fp8bt8BFBo4HQrXXIN7z0MuH5Vv853l06oBg2brvToCmGsfIjdwVHjvS0MXKxriSc1dvl93qg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.12.1.tgz", + "integrity": "sha512-B2vVz0V+3WC+SBgZvHFYceF3RqGGghVOhXVQm5R9L6yUqT1zrmbu9RC+CFftKHs9mp3BX83dZZBhh+l4vHBuPw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-3": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.11.2.tgz", - "integrity": "sha512-OPirA1EczgSDtkXz+HU5YPl6gIDf4FdamcNPd96/H/9I4aDBkNF5XviPPuh8yCgYdXNElvR4FC1OB67X2JslgA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.12.1.tgz", + "integrity": "sha512-ImdTAC3+qTwEyjumBD19lcLp8UZ0WdB0T/iXNJOMvAw4oqZdGvsq2Zdthgbvxq5CnTr146YH5IzXuOYPfh47jw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -563,144 +610,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.11.2.tgz", - "integrity": "sha512-zl6XA49VcG3EEJYWk2PZqsWzAx7BrxwMZCR+8j7S2yaILqEJp+sfkMrzbfmYznXz8tQdoR7XtLjpVT+M/qzNaA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.12.1.tgz", + "integrity": "sha512-oo98u119nP05eLetyc/DPmDtDBfj+ZYeLRnq9pDa+7UOQs83NUvNWsfdWvJtSpgwOZZIqhR8+O7amULKJR+BdA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.11.2.tgz", - "integrity": "sha512-+jGp8T+mP0jtqZ9iOUrcS/7o5InGG+dBVTdLmOOtbxgdF4LoXlxKGj8SBFpQrHuAuVb8R7d9SOza5mSvhSeSjg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.12.1.tgz", + "integrity": "sha512-SA5PiAytwGuC56pS8FOCLZVeUdudHHrot2ms9SwFFZMF+sHGgeQ8+EoBiE0+H4L+M5otpMyV/slT+WwfGCCGsw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.11.2.tgz", - "integrity": "sha512-+dxJNNDUwAjapijVk/S8X6lbi+wtpdbAit84V8En6HK7D2hvZtebTO8/8saSi57utpJ04hm244EZtMlmIy6G0A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.12.1.tgz", + "integrity": "sha512-cqJ/vvxI6+apG7NZHMugiqLpF/xquKcw1vVxrRraXetrzwNBGHHdfYh8pnW1BlVDXNoVplqMHxyJnANYrD13KQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.11.2.tgz", - "integrity": "sha512-rY7wBmD0Tfg5M1PVRTysCveFM721YbXkE0ZsU9zAVurSqBIn2UOX8KbqtMEjNJaz0nw0ekcDITwUIYSzObE2gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.12.1.tgz", + "integrity": "sha512-BFrjyONcPrp8kFYC8YPIKO2mvJcJMp2Gc99MwnVdpbZY+PJ2GWNh8ZMDR+e90VAAATCn+ZaeYQXjKo788BtZ2w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.11.2.tgz", - "integrity": "sha512-DLgvZp0hxW67/0LQ69ulKvfQPkxONIdO/Gg1Dz7iYLWKy7RD/pPdfPBrEShujWksPd7yP2DURWb1YKy4yHfyBw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.12.1.tgz", + "integrity": "sha512-1tZI8BYmqbgSYKBW3zQy0YtG0xDwVCdguBffSITb6qXUfhpzDrziJFKqetAe+aa1SysyuZzyr/VOXizmvuY5mg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.11.2.tgz", - "integrity": "sha512-ExQpftF3fjGvFKMn5fpyEOsFJXpuUy5YngguR/3IS/jY1oXc9HD6kDCYtcbkFLOO0x0qGdarQ4nxFzAWTitcUQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.12.1.tgz", + "integrity": "sha512-tnzd433XQeW3h8n4IrHCDZtMi1/55DYwl5Keov+w6ozfuX+akYm9y+tdD7wjlxF5sIVj0qD0glU05m2L4JH0rQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.11.2.tgz", - "integrity": "sha512-GDMMN30Iv8ckWpz/jWjRb7jpkbCdg2/K2a0O7OkyrbsA7XC10WexRp6FehhBBrVPVbZdxQeLIo4wWOHMY3n6yA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.12.1.tgz", + "integrity": "sha512-1E6w/e9rOQ3tPoalI3WzUEbkxqtDWMeJvYqlTCKjESBxejz8LMr5PWbmSObG317Bd6E38LkWP6vEB9acXcO9Zg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.11.2.tgz", - "integrity": "sha512-UQwIUXctN7cF1yvEzhqMP64w5ykOcUkD/ndVks+J9lYCgcdBnWRJ46V6nQhs6crFnSQIYzppDHF0uyd2mJAprA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.12.1.tgz", + "integrity": "sha512-6wzxjBavlFghHmcNyqGxHLlOrRPndUjKOtz677YLjmiRz5TCDI7bSkqE6LaxktgsO4ygxUs9mkXNcEkAeJtfYw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.11.2.tgz", - "integrity": "sha512-wzrCB+GKkuhN0T7YcNfbI81HfB3yVBT1RUD+W0huOB6zIOaXQMaQKT+fcZ/BPNCTyuvzeevzwdtoYUYKP/H6Ow==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.12.1.tgz", + "integrity": "sha512-AMIvD+XHtkjFnuXRfn0OJynitPCdi+ru9WEj4SrZ9KnSOV6tkhhuZqi+IB2LEdwPBAjI7WuuNNqLkMhCu1ZDGw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.11.2", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -742,46 +789,49 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.11.2.tgz", - "integrity": "sha512-Xr7mYPG3vmbBUVNaRWn/R+6lJTvfuIkbXkAAcii+qYbnBweUQGSDNE9aRPj7q8kbRJRTMX8lzg97CW41S4JLyg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.12.1.tgz", + "integrity": "sha512-2Au0z4AwwpqKia09p87xCTOWRHAoLuwgSY+082FOcyyOev8ICBUFd6vQXBL5wGKOgwsn6hShkvopj5dObGcKUA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.11.2", - "@swagger-api/apidom-error": "^1.11.2", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", - "axios": "^1.16.0", - "minimatch": "^10.2.1", + "axios": "^1.18.0", + "minimatch": "^10.2.6", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^1.11.2", - "@swagger-api/apidom-ns-arazzo-1": "^1.11.2", - "@swagger-api/apidom-ns-asyncapi-2": "^1.11.2", - "@swagger-api/apidom-ns-openapi-2": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-0": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.2", - "@swagger-api/apidom-ns-openapi-3-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.11.2", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.11.2", - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.11.2", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.11.2", - "@swagger-api/apidom-parser-adapter-json": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.11.2", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.11.2", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.11.2" + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-a2a-json-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-a2a-yaml-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.12.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.12.1", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1" } }, "node_modules/@swagger-api/apidom-reference/node_modules/balanced-match": { @@ -794,24 +844,24 @@ } }, "node_modules/@swagger-api/apidom-reference/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -1365,18 +1415,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -1544,13 +1582,13 @@ } }, "node_modules/axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -2156,11 +2194,14 @@ } }, "node_modules/core-js-pure": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.49.0.tgz", - "integrity": "sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==", + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.50.0.tgz", + "integrity": "sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==", "hasInstallScript": true, "license": "MIT", + "engines": { + "node": "*" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -2523,9 +2564,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz", - "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz", + "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -2604,9 +2645,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.22.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", - "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.0.tgz", + "integrity": "sha512-ghq3mhs649mvbarTCAlZn2wRhbfHmzAFiKxoWA14B3VtqnxtZt+wz8BroKXU0tF3GiJsnUldjVncQGZ8qk4rdA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -2706,49 +2747,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3076,16 +3074,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -3242,12 +3240,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, "node_modules/globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", @@ -3501,9 +3493,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", - "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "version": "5.6.8", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz", + "integrity": "sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==", "dev": true, "license": "MIT", "dependencies": { @@ -3521,7 +3513,7 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || 1.x || 2.x", "webpack": "^5.20.0" }, "peerDependenciesMeta": { @@ -3707,13 +3699,10 @@ } }, "node_modules/immutable": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.3.tgz", - "integrity": "sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "license": "MIT" }, "node_modules/import-local": { "version": "3.2.0", @@ -4069,9 +4058,19 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4107,19 +4106,6 @@ "shell-quote": "^1.8.4" } }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4339,6 +4325,78 @@ "node": "*" } }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.1.tgz", + "integrity": "sha512-+dsZEyTcy1lkq41lxdiOqvb26gXbYGgwY+30w37f9PqUVkuEBejBLDotsHOTjuga9xJyGLW2DqzKDUyJ4W/PMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.3", + "terser": "^5.51.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@napi-rs/image": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "imagemin": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4394,9 +4452,9 @@ "license": "MIT" }, "node_modules/neotraverse": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", + "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", "license": "MIT", "engines": { "node": ">= 10" @@ -4420,9 +4478,9 @@ "license": "MIT" }, "node_modules/node-addon-api": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.8.0.tgz", - "integrity": "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==", + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", + "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==", "license": "MIT", "optional": true, "engines": { @@ -5180,7 +5238,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5189,16 +5246,16 @@ } }, "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.1.tgz", + "integrity": "sha512-s+HrzLyJBxrpGTYXF15dTgMjAJpEPZT/Yp6NytAtZMRngejxt6Pt5WrfFxLAcsqUDU6sY1Jz6tyHwIicE1U2Xg==", "license": "MIT", "dependencies": { - "copy-to-clipboard": "^3.3.1", + "copy-to-clipboard": "^3.3.3", "prop-types": "^15.8.1" }, "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" + "react": ">=15.3.0" } }, "node_modules/react-debounce-input": { @@ -5214,6 +5271,19 @@ "react": "^15.3.0 || 16 || 17 || 18" } }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/react-immutable-proptypes": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", @@ -5322,15 +5392,6 @@ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, - "node_modules/redux-immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", - "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==", - "license": "BSD-3-Clause", - "peerDependencies": { - "immutable": "^3.8.1 || ^4.0.0-rc.1" - } - }, "node_modules/refractor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", @@ -5567,10 +5628,13 @@ "license": "MIT" }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -6159,24 +6223,24 @@ } }, "node_modules/swagger-client": { - "version": "3.37.4", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.37.4.tgz", - "integrity": "sha512-3xxqc9s99Vsf47ket2j7D4Tw6b6T7ObNvTqSP009yBeoAo0fy0yprqOVxFISTrvRxN7jgfrEi8GXMhsjzb1M0g==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.38.0.tgz", + "integrity": "sha512-n7aykm1BEdQ3fKePJJx63UGjYe8/5fuxFMi3qZP4OJGZvzljKvmhxNwIF/MB71sF/lop9NeWZReKvPib9CY+2g==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.22.15", "@scarf/scarf": "=1.4.0", - "@swagger-api/apidom-core": "^1.11.0", - "@swagger-api/apidom-error": "^1.11.0", - "@swagger-api/apidom-json-pointer": "^1.11.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.11.0", - "@swagger-api/apidom-ns-openapi-3-2": "^1.11.0", - "@swagger-api/apidom-reference": "^1.11.0", + "@swagger-api/apidom-core": "^1.12.0", + "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-json-pointer": "^1.12.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.0", + "@swagger-api/apidom-reference": "^1.12.0", "@swaggerexpert/cookie": "^2.0.2", "deepmerge": "~4.3.0", "fast-json-patch": "^3.0.0-1", - "js-yaml": "^4.1.0", - "neotraverse": "=0.6.18", + "js-yaml": "^4.2.0", + "neotraverse": "=1.0.1", "node-abort-controller": "^3.1.1", "openapi-path-templating": "^2.2.1", "openapi-server-url-templating": "^1.3.0", @@ -6185,12 +6249,35 @@ }, "engines": { "node": ">=22" + }, + "optionalDependencies": { + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.0", + "@swagger-api/apidom-ns-asyncapi-3": "^1.12.0", + "@swagger-api/apidom-ns-openapi-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.12.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.12.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.12.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.12.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.12.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.12.0", + "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.12.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.12.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0" } }, "node_modules/swagger-ui": { - "version": "5.32.6", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.32.6.tgz", - "integrity": "sha512-Kju+1XSjjnzm6X9JBW4eRXX8+5NIxELDagrzRh5BnvnWu91+6aA7IpAlVqLVfJrKYkY7w4+NIfD+ad18tGqyGQ==", + "version": "5.32.15", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.32.15.tgz", + "integrity": "sha512-aWgC23iur7NeqV8lplXW4fb0FkPiCTpPJMy6CYeoW9fvW9Xl6GpDbFoibFHko1FPxJnlriotxkiZJ1aYkKHZeg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -6200,58 +6287,36 @@ "classnames": "^2.5.1", "css.escape": "1.5.1", "deep-extend": "0.6.0", - "dompurify": "^3.4.0", + "dompurify": "^3.4.13", "ieee754": "^1.2.1", - "immutable": "^3.x.x", + "immutable": "^5.1.9", "js-file-download": "^0.4.12", - "js-yaml": "=4.1.1", + "js-yaml": "=4.3.1", "lodash": "^4.18.1", "prop-types": "^15.8.1", "randexp": "^0.5.3", "randombytes": "^2.1.0", "react": ">=16.8.0 <20", - "react-copy-to-clipboard": "5.1.0", + "react-copy-to-clipboard": "5.1.1", "react-debounce-input": "=3.3.0", "react-dom": ">=16.8.0 <20", "react-immutable-proptypes": "2.2.0", "react-immutable-pure-component": "^2.2.0", "react-inspector": "^6.0.1", - "react-redux": "^9.2.0", + "react-redux": "^9.3.0", "react-syntax-highlighter": "^16.0.0", "redux": "^5.0.1", - "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", "reselect": "^5.1.1", "serialize-error": "^8.1.0", "sha.js": "^2.4.12", - "swagger-client": "^3.37.4", + "swagger-client": "^3.38.0", "url-parse": "^1.5.10", "xml": "=1.0.1", "xml-but-prettier": "^1.0.1", "zenscroll": "^4.0.2" } }, - "node_modules/swagger-ui/node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/swagger-ui/node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.7" - } - }, "node_modules/swagger-ui/node_modules/react-immutable-pure-component": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz", @@ -6286,9 +6351,9 @@ } }, "node_modules/terser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", - "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "version": "5.51.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -6303,66 +6368,6 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6634,12 +6639,11 @@ } }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -6664,9 +6668,9 @@ "optional": true }, "node_modules/webpack": { - "version": "5.107.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", - "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "version": "5.110.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", @@ -6675,23 +6679,19 @@ "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.0", + "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.7.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.5.0", - "watchpack": "^2.5.1", - "webpack-sources": "^3.5.0" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -6884,9 +6884,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "license": "MIT", "engines": { "node": ">=10.13.0" diff --git a/src/portal/app-swagger-ui/package.json b/src/portal/app-swagger-ui/package.json index 14685e6fe69..c4de551619e 100644 --- a/src/portal/app-swagger-ui/package.json +++ b/src/portal/app-swagger-ui/package.json @@ -9,13 +9,13 @@ "dependencies": { "css-loader": "^6.11.0", "style-loader": "^4.0.0", - "swagger-ui": "5.32.6" + "swagger-ui": "5.32.15" }, "devDependencies": { "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "webpack": "^5.107.2", + "html-webpack-plugin": "^5.6.8", + "webpack": "^5.110.3", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.15.2" }, diff --git a/src/portal/package-lock.json b/src/portal/package-lock.json index 85dea746c9a..b200c8dde59 100644 --- a/src/portal/package-lock.json +++ b/src/portal/package-lock.json @@ -28,7 +28,7 @@ "cron-validator": "1.4.0", "echarts": "5.6.0", "js-yaml": "4.1.1", - "marked": "18.0.9", + "marked": "18.0.12", "ngx-clipboard": "16.0.0", "ngx-cookie": "6.0.1", "ngx-markdown": "21.3.0", @@ -47,7 +47,7 @@ "@angular/cli": "21.2.11", "@angular/compiler-cli": "21.2.13", "@cypress/schematic": "2.5.2", - "@types/express": "4.17.25", + "@types/express": "5.0.6", "@types/jasmine": "5.1.15", "@types/node": "22.19.19", "@typescript-eslint/eslint-plugin": "8.59.3", @@ -57,12 +57,12 @@ "eslint-config-prettier": "9.1.2", "eslint-plugin-header": "3.1.1", "eslint-plugin-prettier": "4.2.5", - "express": "4.22.2", + "express": "5.2.1", "https-proxy-agent": "5.0.1", "jasmine-core": "5.13.0", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.4", - "karma-chrome-launcher": "3.1.1", + "karma-chrome-launcher": "3.2.0", "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.2.0", @@ -4886,7 +4886,7 @@ "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", - "express": "^5.2.1", + "express": "5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", @@ -4912,181 +4912,6 @@ } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { "version": "3.0.2", "dev": true, @@ -5101,78 +4926,6 @@ "node": ">= 0.10" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", @@ -7245,14 +6998,15 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.25", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" } }, "node_modules/@types/express-serve-static-core": { @@ -7266,6 +7020,30 @@ "@types/send": "*" } }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz", + "integrity": "sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, "node_modules/@types/http-errors": { "version": "2.0.5", "dev": true, @@ -8049,6 +7827,8 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, "license": "MIT" }, @@ -9100,14 +8880,17 @@ } }, "node_modules/content-disposition": { - "version": "0.5.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -9131,9 +8914,14 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.7", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/copy-anything": { "version": "2.0.6", @@ -10514,44 +10302,43 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.22.2", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.15.1", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" }, "funding": { "type": "opencollective", @@ -10575,25 +10362,119 @@ "express": ">= 4.11" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", + "node_modules/express/node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/body-parser/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/express/node_modules/qs": { - "version": "6.15.2", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -10602,6 +10483,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/express/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/type-is/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/extend": { "version": "3.0.2", "dev": true, @@ -10797,35 +10727,27 @@ } }, "node_modules/finalhandler": { - "version": "1.3.2", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -10934,11 +10856,13 @@ } }, "node_modules/fresh": { - "version": "0.5.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/fs-extra": { @@ -12449,7 +12373,9 @@ } }, "node_modules/karma-chrome-launcher": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13283,9 +13209,9 @@ } }, "node_modules/marked": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.9.tgz", - "integrity": "sha512-/Sa4qiiHZxf0/FQdBBowr9q4r10krCwMvpK48FUBdXdUXScDxiQGR9zCPrFgRVR5LU3iySOiIjy09ZQvADir1w==", + "version": "18.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.12.tgz", + "integrity": "sha512-LEm4ga2YeI2T3GVHj9b0BaDPPk93LLTHMFeMyQbNIzPxc8vCI0y/scy0ZA6z6lXKyT9j9Nhl/OC6ZYKYGuFScA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -13380,9 +13306,14 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -13404,6 +13335,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { @@ -14658,6 +14591,8 @@ }, "node_modules/path-to-regexp": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "dev": true, "license": "MIT" }, @@ -15781,50 +15716,57 @@ "license": "MIT" }, "node_modules/send": { - "version": "0.19.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serialize-error": { @@ -15938,17 +15880,23 @@ } }, "node_modules/serve-static": { - "version": "1.16.3", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -16000,13 +15948,15 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -17589,6 +17539,19 @@ } } }, + "node_modules/webpack-dev-server/node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -17614,6 +17577,119 @@ "fsevents": "~2.3.2" } }, + "node_modules/webpack-dev-server/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -17675,6 +17751,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webpack-dev-server/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/webpack-dev-server/node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -17707,6 +17806,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/webpack-dev-server/node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -17720,6 +17836,47 @@ "node": ">=8.10.0" } }, + "node_modules/webpack-dev-server/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/webpack-dev-server/node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", diff --git a/src/portal/package.json b/src/portal/package.json index 06d1ccd0a65..9ef068a3a77 100644 --- a/src/portal/package.json +++ b/src/portal/package.json @@ -47,7 +47,7 @@ "cron-validator": "1.4.0", "echarts": "5.6.0", "js-yaml": "4.1.1", - "marked": "18.0.9", + "marked": "18.0.12", "ngx-clipboard": "16.0.0", "ngx-cookie": "6.0.1", "ngx-markdown": "21.3.0", @@ -66,7 +66,7 @@ "@angular/cli": "21.2.11", "@angular/compiler-cli": "21.2.13", "@cypress/schematic": "2.5.2", - "@types/express": "4.17.25", + "@types/express": "5.0.6", "@types/jasmine": "5.1.15", "@types/node": "22.19.19", "@typescript-eslint/eslint-plugin": "8.59.3", @@ -76,12 +76,12 @@ "eslint-config-prettier": "9.1.2", "eslint-plugin-header": "3.1.1", "eslint-plugin-prettier": "4.2.5", - "express": "4.22.2", + "express": "5.2.1", "https-proxy-agent": "5.0.1", "jasmine-core": "5.13.0", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.4", - "karma-chrome-launcher": "3.1.1", + "karma-chrome-launcher": "3.2.0", "karma-coverage": "2.2.1", "karma-jasmine": "5.1.0", "karma-jasmine-html-reporter": "2.2.0", diff --git a/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts index 4f1dd825df3..7784aeb48da 100644 --- a/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts +++ b/src/portal/src/app/base/left-side-nav/distribution/distribution-setup-modal/distribution-setup-modal.component.ts @@ -26,7 +26,7 @@ import { TranslateService } from '@ngx-translate/core'; import { PreheatService } from '../../../../../../ng-swagger-gen/services/preheat.service'; import { Instance } from '../../../../../../ng-swagger-gen/models/instance'; import { AuthMode, FrontInstance } from '../distribution-interface'; -import { clone } from '../../../../shared/units/utils'; +import { clone, equalEndpoint } from '../../../../shared/units/utils'; import { ClrLoadingState } from '@clr/angular'; import { Metadata } from '../../../../../../ng-swagger-gen/models/metadata'; import { @@ -145,7 +145,10 @@ export class DistributionSetupModalComponent implements OnInit, OnDestroy { if ( this.editingMode && this.originModelForEdit && - this.originModelForEdit.endpoint === endpoint + equalEndpoint( + this.originModelForEdit.endpoint, + endpoint + ) ) { return false; } @@ -442,7 +445,12 @@ export class DistributionSetupModalComponent implements OnInit, OnDestroy { ) { return true; } - if (this.model.endpoint !== this.originModelForEdit.endpoint) { + if ( + !equalEndpoint( + this.model.endpoint, + this.originModelForEdit.endpoint + ) + ) { return true; } // eslint-disable-next-line eqeqeq diff --git a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts index 8273b87616c..2881fa92f9c 100644 --- a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-form/new-scanner-form.component.ts @@ -33,6 +33,7 @@ import { switchMap, } from 'rxjs/operators'; import { ScannerService } from '../../../../../../../ng-swagger-gen/services/scanner.service'; +import { equalEndpoint } from '../../../../../shared/units/utils'; @Component({ selector: 'new-scanner-form', @@ -140,7 +141,7 @@ export class NewScannerFormComponent implements AfterViewInit, OnDestroy { if ( this.isEdit && this.originValue && - this.originValue.url === endpointUrl + equalEndpoint(this.originValue.url, endpointUrl) ) { return false; } @@ -168,8 +169,10 @@ export class NewScannerFormComponent implements AfterViewInit, OnDestroy { if (response && response.length > 0) { response.forEach(s => { if ( - s.url === - this.newScannerForm.get('url').value + equalEndpoint( + s.url, + this.newScannerForm.get('url').value + ) ) { this.isEndpointUrlExisting = true; return; diff --git a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts index d7c0fb367e9..0981f9b5bb6 100644 --- a/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts +++ b/src/portal/src/app/base/left-side-nav/interrogation-services/scanner/new-scanner-modal/new-scanner-modal.component.ts @@ -21,7 +21,7 @@ import { TranslateService } from '@ngx-translate/core'; import { InlineAlertComponent } from '../../../../../shared/components/inline-alert/inline-alert.component'; import { ScannerService } from '../../../../../../../ng-swagger-gen/services/scanner.service'; import { ScannerRegistrationReq } from '../../../../../../../ng-swagger-gen/models/scanner-registration-req'; -import { clone } from '../../../../../shared/units/utils'; +import { clone, equalEndpoint } from '../../../../../shared/units/utils'; @Component({ selector: 'new-scanner-modal', @@ -213,8 +213,10 @@ export class NewScannerModalComponent { return true; } if ( - this.originValue.url !== - this.newScannerFormComponent.newScannerForm.get('url').value + !equalEndpoint( + this.originValue.url, + this.newScannerFormComponent.newScannerForm.get('url').value + ) ) { return true; } diff --git a/src/portal/src/app/shared/units/utils.spec.ts b/src/portal/src/app/shared/units/utils.spec.ts index 3bf456db821..7c705a78a23 100644 --- a/src/portal/src/app/shared/units/utils.spec.ts +++ b/src/portal/src/app/shared/units/utils.spec.ts @@ -15,6 +15,7 @@ import { DEFAULT_PAGE_SIZE, delUrlParam, durationStr, + equalEndpoint, getHiddenArrayFromLocalStorage, getPageSizeFromLocalStorage, getQueryString, @@ -169,4 +170,44 @@ describe('functions in utils.ts should work', () => { true, ]); }); + + it('function equalEndpoint() should work', () => { + expect(equalEndpoint(null, null)).toBe(true); + expect(equalEndpoint('', '')).toBe(true); + expect( + equalEndpoint( + 'http://example.com:8080/v2', + 'http://example.com:8080/v2' + ) + ).toBe(true); + expect( + equalEndpoint( + 'http://EXAMPLE.COM:8080/v2', + 'http://example.com:8080/v2' + ) + ).toBe(true); + expect( + equalEndpoint( + 'http://example.com:8080/V2', + 'http://example.com:8080/v2' + ) + ).toBe(false); + expect(equalEndpoint('https://core:8080', 'https://CORE:8080')).toBe( + true + ); + expect(equalEndpoint('http://example.com', 'https://example.com')).toBe( + false + ); + expect( + equalEndpoint('http://example.com:8080', 'http://example.com:8081') + ).toBe(false); + expect( + equalEndpoint('http://example.com/foo', 'http://example.com/bar') + ).toBe(false); + expect(equalEndpoint('invalid-url-1', 'http://example.com')).toBe( + false + ); + expect(equalEndpoint('http://example.com', null)).toBe(false); + expect(equalEndpoint('example.com', 'EXAMPLE.COM')).toBe(true); + }); }); diff --git a/src/portal/src/app/shared/units/utils.ts b/src/portal/src/app/shared/units/utils.ts index 4bec0dba977..d06daa067bc 100644 --- a/src/portal/src/app/shared/units/utils.ts +++ b/src/portal/src/app/shared/units/utils.ts @@ -1057,6 +1057,36 @@ export function durationStr(distance: number): string { return result ? result : '0'; } +/** + * Compare two URL endpoints with case-insensitive host matching per RFC 1035. + * Returns true if both endpoints point to the same location, ignoring host casing. + */ +export function equalEndpoint(endpoint1: string, endpoint2: string): boolean { + if (endpoint1 === endpoint2) { + return true; + } + if (!endpoint1 || !endpoint2) { + return false; + } + const ep1 = endpoint1.trim(); + const ep2 = endpoint2.trim(); + if (ep1 === ep2) { + return true; + } + try { + const hasScheme1 = ep1.includes('://'); + const hasScheme2 = ep2.includes('://'); + if (hasScheme1 !== hasScheme2) { + return false; + } + const u1 = new URL(hasScheme1 ? ep1 : `http://${ep1}`); + const u2 = new URL(hasScheme2 ? ep2 : `http://${ep2}`); + return u1.href === u2.href; + } catch { + return false; + } +} + export enum PageSizeMapKeys { LIST_PROJECT_COMPONENT = 'ListProjectComponent', REPOSITORY_GRIDVIEW_COMPONENT = 'RepositoryGridviewComponent', diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json index 325bcdf9088..50b84d3114b 100644 --- a/src/portal/src/i18n/lang/en-us-lang.json +++ b/src/portal/src/i18n/lang/en-us-lang.json @@ -46,14 +46,14 @@ }, "BATCH": { "DELETED_SUCCESS": "Deleted successfully", - "DELETED_FAILURE": "Deleted failed or partly failed", + "DELETED_FAILURE": "Delete failed or partially failed", "REPLICATE_SUCCESS": "Started successfully", - "STOP_SUCCESS": "Stop successfully", + "STOP_SUCCESS": "Stopped successfully", "TIME_OUT": "Gateway time-out" }, "TOOLTIP": { "NAME_FILTER": "Filter the name of the resource. Leave empty or use '**' to match all. 'library/**' only matches resources under 'library'. For more patterns, please refer to the user guide.", - "TAG_FILTER": "Filter the tag/version part of the resources. Leave empty or use '**' to match all. '1.0*' only matches the tags that starts with '1.0'. For more patterns, please refer to the user guide.", + "TAG_FILTER": "Filter the tag/version part of the resources. Leave empty or use '**' to match all. '1.0*' only matches the tags that start with '1.0'. For more patterns, please refer to the user guide.", "LABEL_FILTER": "Filter the resources according to labels.", "RESOURCE_FILTER": "Filter the type of resources.", "PUSH_BASED": "Push the resources from the local Harbor to the remote registry.", @@ -84,11 +84,11 @@ "OIDC_ENDPOINT_FORMAT": "Endpoint must start with HTTPS://.", "OIDC_NAME": "The name of the OIDC provider.", "OIDC_ENDPOINT": "The URL of an OIDC-compliant server.", - "OIDC_SCOPE": "The scope sent to OIDC server during authentication. It has to contain “openid”, and “offline_access”. If you are using google, please remove “offline_access” from this field.", + "OIDC_SCOPE": "The scope sent to OIDC server during authentication. It has to contain “openid”, and “offline_access”. If you are using google, please remove “offline_access” from this field.", "OIDC_VERIFYCERT": "Uncheck this box if your OIDC server is hosted via self-signed certificate.", - "OIDC_AUTOONBOARD": "Skip the onboarding screen, so user cannot change its username. Username is provided from ID Token", + "OIDC_AUTOONBOARD": "Skip the onboarding screen after user is authenticated via OIDC endpoint, so the user cannot change their username. The username is provided from the ID Token.", "OIDC_USER_CLAIM": "The name of the claim in the ID Token where the username is retrieved from. If not specified, it will default to 'name'", - "NEW_SECRET": "The secret must longer than 8 chars with at least 1 uppercase letter, 1 lowercase letter and 1 number", + "NEW_SECRET": "The secret must be longer than 8 characters with at least 1 uppercase letter, 1 lowercase letter and 1 number.", "OIDC_LOGOUT": "Logs the user out of their current session with the Identity Provider." }, "PLACEHOLDER": { @@ -122,8 +122,8 @@ "NEW_SECRET": "Secret", "CONFIRM_SECRET": "Re-enter Secret", "GENERATE_SUCCESS": "Cli secret setting is successful", - "GENERATE_ERROR": "Cli secret setting is failed", - "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you can regenerate secret?", + "GENERATE_ERROR": "Failed to set CLI secret", + "CONFIRM_TITLE_CLI_GENERATE": "Are you sure you want to regenerate the secret?", "CONFIRM_BODY_CLI_GENERATE": "If you regenerate cli secret, the old cli secret will be discarded" }, "CHANGE_PWD": { @@ -196,7 +196,7 @@ "ITEMS": "items", "OF": "of", "RESET_OK": "Users password reset successfully", - "EXISTING_PASSWORD": "The new password can not be same with the old one", + "EXISTING_PASSWORD": "The new password cannot be the same as the old one", "UNKNOWN": "Unknown", "UNKNOWN_TIP": "Please verify whether the user has admin status through the Identity Provider System if the value is \"Unknown\"" }, @@ -216,7 +216,7 @@ "PUBLIC_PROJECTS": "Public Projects", "PROJECT": "Project", "NEW_PROJECT": "New Project", - "NAME_TOOLTIP": "Project name should be 1~255 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.", + "NAME_TOOLTIP": "Project name should be 1~255 characters long with lower case characters, numbers and ._- and must start with characters or numbers.", "NAME_IS_REQUIRED": "Project name is required.", "NAME_ALREADY_EXISTS": "Project name already exists.", "UNKNOWN_ERROR": "An unknown error occurred while creating the project.", @@ -317,7 +317,7 @@ "SET_ROLE": "Set Role", "REMOVE": "Remove", "GROUP_NAME_REQUIRED": "Group name is required", - "NON_EXISTENT_GROUP": "Group name does not exists", + "NON_EXISTENT_GROUP": "Group name does not exist", "GROUP_ALREADY_ADDED": "Group name has been already added to this project" }, "ROBOT_ACCOUNT": { @@ -339,9 +339,9 @@ "PULL": "Pull", "FILTER_PLACEHOLDER": "Filter Robot Accounts", "ACCOUNT_EXISTING": "Robot Account already exists.", - "ALERT_TEXT": "This is the only time to copy this secret.You won't have another opportunity", + "ALERT_TEXT": "This is the only time to copy this secret. You won't have another opportunity.", "CREATED_SUCCESS": "Created '{{param}}' successfully.", - "COPY_SUCCESS": "Copy secret successfully of '{{param}}'", + "COPY_SUCCESS": "Copied secret of '{{param}}' successfully", "DELETION_TITLE": "Confirm removal of robot accounts", "DELETION_SUMMARY": "Do you want to delete robot accounts {{param}}?", "EXPORT_TO_FILE": "export to file", @@ -410,12 +410,12 @@ "EDIT_WEBHOOK": "Edit Webhook", "ADD_WEBHOOK": "Add Webhook", "EDIT_WEBHOOK_DESC": "Specify the endpoint for receiving webhook notifications", - "VERIFY_REMOTE_CERT_TOOLTIP": "Determine whether the webhook should verify the certificate of a remote url Uncheck this box when the remote url uses a self-signed or untrusted certificate.", + "VERIFY_REMOTE_CERT_TOOLTIP": "Determine whether the webhook should verify the certificate of a remote URL. Uncheck this box when the remote URL uses a self-signed or untrusted certificate.", "ENDPOINT_URL": "Endpoint URL", "URL_IS_REQUIRED": "Endpoint URL is required.", "AUTH_HEADER": "Auth Header", "VERIFY_REMOTE_CERT": "Verify Remote Certificate", - "ENABLED_WEBHOOK_TITLE": "Enable Webhook", + "ENABLED_WEBHOOK_TITLE": "Enable Webhook", "ENABLED_WEBHOOK_SUMMARY": "Do you want to enable webhook {{name}}?", "DISABLED_WEBHOOK_TITLE": "Deactivate Webhook", "DISABLED_WEBHOOK_SUMMARY": "Do you want to deactivate webhook {{name}}?", @@ -509,7 +509,7 @@ "MONTH": "Month", "DAY_MONTH": "Day of month", "DAY_WEEK": "Day of week", - "CRON_TITLE": "Pattern description for cron '* * * * * *'.The cron string is based on UTC time", + "CRON_TITLE": "Pattern description for cron '* * * * * *'. The cron string is based on UTC time", "FIELD_NAME": "Field name", "MANDATORY": "Mandatory?", "ALLOWED_VALUES": "Allowed values", @@ -586,8 +586,8 @@ "ITEMS": "items", "CREATED_SUCCESS": "Created replication rule successfully.", "UPDATED_SUCCESS": "Updated replication rule successfully.", - "DELETED_SUCCESS": "Deleted replications rule successfully.", - "DELETED_FAILED": "Deleted replications rule failed.", + "DELETED_SUCCESS": "Deleted replication rules successfully.", + "DELETED_FAILED": "Deleting replication rules failed.", "TOGGLED_SUCCESS": "Toggled replication rule status successfully.", "CANNOT_EDIT": "Replication rule cannot be changed while it is enabled.", "INVALID_DATE": "Invalid date.", @@ -607,12 +607,12 @@ "REPLICATE": "Replicate", "DELETE_REMOTE_IMAGES": "Delete remote resources when locally deleted", "NEW": "New", - "NAME_TOOLTIP": "replication rule name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.", - "DESTINATION_NAME_TOOLTIP": "Destination name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.", + "NAME_TOOLTIP": "Replication rule name should be at least 2 characters long with lower case characters, numbers and ._- and must start with characters or numbers.", + "DESTINATION_NAME_TOOLTIP": "Destination name should be at least 2 characters long with lower case characters, numbers and ._- and must start with characters or numbers.", "REPLI_MODE": "Replication mode", "SOURCE_REGISTRY": "Source registry", "DEST_REGISTRY": "Destination registry", - "NAMESPACE_TOOLTIP": "Namespace name should be at least 2 characters long with lower case characters, numbers and ._-/ and must be start with characters or numbers.", + "NAMESPACE_TOOLTIP": "Namespace name should be at least 2 characters long with lower case characters, numbers and ._-/ and must start with characters or numbers.", "TAG": "Tag", "LABEL": "Label", "RESOURCE": "Resource", @@ -627,14 +627,14 @@ "DES_REPO_FLATTENING": "Destination Repository Flattening", "NAMESPACE": "Namespace", "REPO_FLATTENING": "Flattening", - "NO_FLATTING": "No Flatting", + "NO_FLATTING": "No Flattening", "FLATTEN_LEVEL_1": "Flatten 1 Level", "FLATTEN_LEVEL_2": "Flatten 2 Levels", "FLATTEN_LEVEL_3": "Flatten 3 Levels", "FLATTEN_ALL": "Flatten All Levels", "FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:", "FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'", - "FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img", + "FLATTEN_LEVEL_TIP_NO": "'No Flattening': 'a/b/c/d/img' -> 'ns/a/b/c/d/img'", "FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'", "FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'", "FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'", @@ -643,7 +643,7 @@ "BANDWIDTH_TOOLTIP": "Set the maximum network bandwidth for each replication worker. Please pay attention to the number of concurrent executions (max. {{max_job_workers}}). For unlimited bandwidth, please enter -1.", "UNLIMITED": "Unlimited", "UNREACHABLE_SOURCE_REGISTRY": "Failed to connect to the source registry, please make sure the source registry is available before editing this rule: {{error}}", - "CRON_ERROR_TIP": "The 1st field of the cron string must be 0 and the 2nd filed can not be \"*\"", + "CRON_ERROR_TIP": "The 1st field of the cron string must be 0 and the 2nd field cannot be \"*\"", "COPY_BY_CHUNK": "Copy by chunk", "COPY_BY_CHUNK_TIP": "Specify whether to copy the blob by chunk. Transfer by chunk may increase the number of API requests.", "TRIGGER_STOP_SUCCESS": "Triggered stopping execution successfully", @@ -675,7 +675,7 @@ "CREATED_SUCCESS": "Created endpoint successfully.", "UPDATED_SUCCESS": "Updated endpoint successfully.", "DELETED_SUCCESS": "Deleted endpoints successfully.", - "DELETED_FAILED": "Deleted endpoints failed.", + "DELETED_FAILED": "Deleting endpoints failed.", "CANNOT_EDIT": "Endpoint cannot be changed while the replication rule is enabled.", "PLACEHOLDER": "We couldn't find any endpoints!", "CA_CERTIFICATE": "CA Certificate", @@ -727,7 +727,7 @@ "IMAGE": "Images", "LABELS": "Labels", "ADD_LABEL_TO_IMAGE": "Add labels to this image", - "FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label", + "FILTER_ARTIFACT_BY_LABEL": "Filter artifacts by label", "ADD_LABELS": "Add Labels", "STOP": "Stop", "RETAG": "Copy", @@ -799,12 +799,12 @@ "ROOT_CERT": "Registry Root Certificate", "ROOT_CERT_LINK": "Download", "REGISTRY_CERTIFICATE": "Registry certificate", - "NO_CHANGE": "Save abort because nothing changed", + "NO_CHANGE": "Save aborted because nothing changed", "SKIP_SCANNER_PULL_TIME": "Retain Image \"last pull time\" On Scanning", "TOOLTIP": { "SELF_REGISTRATION_ENABLE": "Enable sign up.", "SELF_REGISTRATION_DISABLE": "Deactivate sign up.", - "VERIFY_REMOTE_CERT": "Determine whether the image replication should verify the certificate for a remote registry. Uncheck this box when skip verify remote registry endpoint cert.", + "VERIFY_REMOTE_CERT": "Determine whether the image replication should verify the certificate for a remote registry. Uncheck this box to skip verifying remote registry endpoint certificate.", "AUTH_MODE": "By default the authentication mode is database, i.e. the credentials are stored in a local database. Set it to LDAP if you want to verify a user's credential against an LDAP server.", "PRIMARY_AUTH_MODE": "This auth mode becomes the default way for users to login. The login screen where the user selects to login via the identity provider or via local DB will automatically redirect the user to this identity provider. Login via DB is possible when visiting the url '/account/sign-in' explicitly.", "LDAP_SEARCH_DN": "A user's DN who has the permission to search the LDAP/AD server. If your LDAP/AD server does not support anonymous search, you should configure this DN and ldap_search_pwd.", @@ -812,8 +812,8 @@ "LDAP_UID": "The attribute used in a search to match a user. It could be uid, cn, email, sAMAccountName or other attributes depending on your LDAP/AD.", "LDAP_SCOPE": "The scope to search for users.", "TOKEN_EXPIRATION": "The expiration time (in minutes) of a token created by the token service. Default is 30 minutes.", - "ROBOT_NAME_PREFIX": "Prefixed string for each robot name,and default value is 'robot$'", - "ROBOT_TOKEN_EXPIRATION": "The expiration time (in days) of the token of the robot account, Default is 30 days. Show the number of days converted from minutes and rounds down", + "ROBOT_NAME_PREFIX": "Prefixed string for each robot name, and the default value is 'robot$'", + "ROBOT_TOKEN_EXPIRATION": "The expiration time (in days) of the token of the robot account. Default is 30 days. Shows the number of days converted from minutes, rounded down", "PRO_CREATION_RESTRICTION": "The flag to define what users have permission to create projects. By default, everyone can create a project. Set to 'Admin Only' so that only an administrator can create a project.", "ROOT_CERT_DOWNLOAD": "Download the root certificate of registry.", "SCANNING_POLICY": "Set image scanning policy based on different requirements. 'None': No active policy; 'Daily At': Triggering scanning at the specified time everyday.", @@ -873,19 +873,19 @@ "OIDC_AUTOONBOARD": "Automatic onboarding", "USER_CLAIM": "Username Claim", "OIDC_SETNAME": "Set OIDC Username", - "OIDC_SETNAMECONTENT": "You must create a Harbor username the first time when authenticating via a third party(OIDC).This will be used within Harbor to be associated with projects, roles, etc.", + "OIDC_SETNAMECONTENT": "You must create a Harbor username the first time when authenticating via a third party (OIDC). This will be used within Harbor to be associated with projects, roles, etc.", "OIDC_USERNAME": "Username", "GROUP_CLAIM_NAME": "Group Claim Name", "GROUP_CLAIM_NAME_INFO": "The name of a custom group claim that you have configured in your OIDC provider", "OIDC_ADMIN_GROUP": "OIDC Admin Group", "OIDC_ADMIN_GROUP_INFO": "Specify an OIDC admin group name. All OIDC users in this group will have harbor admin privilege. Keep it blank if you do not want to.", "OIDC_GROUP_FILTER": "OIDC Group Filter", - "OIDC_GROUP_FILTER_INFO": "Filter OIDC groups who match the provided regular expression.Keep it blank to match all the groups.", + "OIDC_GROUP_FILTER_INFO": "Filter OIDC groups who match the provided regular expression. Keep it blank to match all the groups.", "OIDC_LOGOUT": "OIDC Session Logout" }, "SCANNING": { - "STOP_SCAN_ALL_SUCCESS": "Trigger stopping scan all successfully!", - "TRIGGER_SCAN_ALL_SUCCESS": "Trigger scan all successfully!", + "STOP_SCAN_ALL_SUCCESS": "Triggered stopping scan all successfully!", + "TRIGGER_SCAN_ALL_SUCCESS": "Triggered scan all successfully!", "TRIGGER_SCAN_ALL_FAIL": "Failed to trigger scan all with error: {{error}}", "TITLE": "Vulnerability Scanning", "SCAN_ALL": "Scan All", @@ -974,7 +974,7 @@ "DOWNLOAD": "Download SBOM", "Details": "SBOM details", "STOP": "Stop Generate SBOM", - "TRIGGER_STOP_SUCCESS": "Trigger stopping SBOM generation successfully" + "TRIGGER_STOP_SUCCESS": "Triggered stopping SBOM generation successfully" }, "VULNERABILITY": { "STATE": { @@ -1025,7 +1025,7 @@ "SCAN_BY": "SCAN BY {{scanner}}", "REPORTED_BY": "Reported by {{scanner}}", "NO_SCANNER": "NO SCANNER", - "TRIGGER_STOP_SUCCESS": "Trigger stopping scan successfully", + "TRIGGER_STOP_SUCCESS": "Triggered stopping scan successfully", "STOP_NOW": "Stop Scan Vulnerability" }, "PUSH_IMAGE": { @@ -1076,7 +1076,7 @@ "SHOW_YAML": "YAML File" }, "TAG": { - "CREATION_TIME_PREFIX": "Create on", + "CREATION_TIME_PREFIX": "Created on", "CREATOR_PREFIX": "by", "ANONYMITY": "anonymity", "IMAGE_DETAILS": "Image Details", @@ -1094,7 +1094,7 @@ "FILTER_FOR_TAGS": "Filter Tags", "AUTHOR": "Author", "LABELS": "Labels", - "CREATION": "Create on", + "CREATION": "Created on", "COMMAND": "Commands", "UPLOADTIME": "Upload Time", "NAME": "Name", @@ -1186,7 +1186,7 @@ }, "UNKNOWN_ERROR": "Unknown errors have occurred. Please try again later.", "UNAUTHORIZED_ERROR": "Your session is invalid or has expired. You need to sign in to continue your action.", - "REPO_READ_ONLY": "Harbor is set to read-only mode, Deleting repository, artifact, tag and pushing image will be deactivated under read-only mode.", + "REPO_READ_ONLY": "Harbor is set to read-only mode. Deleting repositories, artifacts, and tags, and pushing images are disabled in read-only mode.", "FORBIDDEN_ERROR": "You do not have the proper privileges to perform the action.", "GENERAL_ERROR": "Errors have occurred when performing service call: {{param}}.", "BAD_REQUEST_ERROR": "We are unable to perform your action because of a bad request.", @@ -1217,7 +1217,7 @@ "CRON": "cron", "ON": "on", "AT": "at", - "NOSCHEDULE": "An error occurred in Get schedule" + "NOSCHEDULE": "An error occurred while getting the schedule" }, "GC": { "CURRENT_SCHEDULE": "Schedule to GC", @@ -1241,8 +1241,8 @@ }, "RETAG": { "MSG_SUCCESS": "Copy artifact successfully", - "TIP_REPO": "A repository name is broken up into path components. A component of a repository name must be at least one lowercase, alpha-numeric characters, optionally separated by periods, dashes or underscores. More strictly, it must match the regular expression [a-z0-9]+(?:[._-][a-z0-9]+)*.If a repository name has two or more path components, they must be separated by a forward slash ('/').The total length of a repository name, including slashes, must be less the 256 characters.", - "TIP_TAG": "A tag is a label applied to a Docker image in a repository. Tags are how various images in a repository are distinguished from each other.It need to match Regex: (`[\\w][\\w.-]{0,127}`)" + "TIP_REPO": "A repository name is broken up into path components. A component of a repository name must be at least one lowercase, alpha-numeric characters, optionally separated by periods, dashes or underscores. More strictly, it must match the regular expression [a-z0-9]+(?:[._-][a-z0-9]+)*. If a repository name has two or more path components, they must be separated by a forward slash ('/'). The total length of a repository name, including slashes, must be less than 256 characters.", + "TIP_TAG": "A tag is a label applied to a Docker image in a repository. Tags are how various images in a repository are distinguished from each other. It needs to match regex: (`[\\w][\\w.-]{0,127}`)" }, "CVE_ALLOWLIST": { "DEPLOYMENT_SECURITY": "Deployment security", @@ -1274,7 +1274,7 @@ "RULE_NAME_5": " always", "ADD_RULE": "ADD RULE", "ADD_RULE_HELP_1": "Click the ADD RULE button to add a rule.", - "ADD_RULE_HELP_2": "Tag retention polices run once a day.", + "ADD_RULE_HELP_2": "Tag retention policies run once a day.", "RETENTION_RUNS": "Retention runs", "RUN_NOW": "RUN NOW", "WHAT_IF_RUN": "DRY RUN", @@ -1387,7 +1387,7 @@ "NAME": "Name", "NAME_EXISTS": "Name already exists", "NAME_REQUIRED": "Name is required", - "NAME_REX": "Name should be at least 2 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.", + "NAME_REX": "Name should be at least 2 characters long with lower case characters, numbers and ._- and must start with characters or numbers.", "DESCRIPTION": "Description", "SBOM": "SBOM", "VULNERABILITY": "Vulnerability", @@ -1500,7 +1500,7 @@ "DISABLE_FAILED": "Deactivating instance(s) failed", "UPDATE_SUCCESS": "Instance updated successfully", "UPDATE_FAILED": "Updating instance failed", - "REQUEST_PREHEAT_SUCCESS": "Preheat request successfully", + "REQUEST_PREHEAT_SUCCESS": "Preheat requested successfully", "REQUEST_PREHEAT_FAILED": "Preheat request failed", "DESCRIPTION": "Description", "AUTH_MODE": "Auth Mode", @@ -1577,7 +1577,7 @@ "TYPE": "Type", "TASKS": "Tasks", "TASKS_PLACEHOLDER": "We couldn't find any task", - "SEVERITY_WARNING": "Vulnerability settings here conflicts with the relevant project configuration that will override the settings here", + "SEVERITY_WARNING": "Vulnerability settings here conflict with the relevant project configuration that will override the settings here", "REPOS": "Repositories", "TAGS": "Tags", "CRITERIA": "Criteria", @@ -1591,7 +1591,7 @@ "MANUAL": "Manual", "SCHEDULED": "Scheduled", "EVENT_BASED": "Event based", - "EVENT_BASED_EXPLAIN_LINE1": "The policy will be evaluated whenever the following events are occurred:", + "EVENT_BASED_EXPLAIN_LINE1": "The policy will be evaluated whenever the following events occur:", "EVENT_BASED_EXPLAIN_LINE2": "Artifact is pushed", "EVENT_BASED_EXPLAIN_LINE3": "Artifact is labeled", "EVENT_BASED_EXPLAIN_LINE4": "Artifact is scanned", @@ -1601,7 +1601,7 @@ "UPDATED_SUCCESSFULLY": "Updated policy successfully", "EXECUTIONS": "Executions", "TAG_SEPARATOR": "Enter multiple comma separated tags,tag*,or **", - "CONTENT_WARNING": "Content trust settings here conflicts with the relevant project configuration that will override the settings here", + "CONTENT_WARNING": "Content trust settings here conflict with the relevant project configuration that will override the settings here", "PREHEAT_EXPLAIN": "Preheat will migrate the image to the p2p network", "CRITERIA_EXPLAIN": "As specified in 'Deployment security' section under Configuration tab", "SKIP_CERT_VERIFY": "Check this box to skip certificate verification when the remote provider uses a self-signed or untrusted certificate.", @@ -1639,7 +1639,7 @@ "NEW_TOKEN": "New Secret", "REFRESH": "REFRESH", "PROJECTS_MODAL_TITLE": "Projects for Robot Account", - "PROJECTS_MODAL_SUMMARY": "There are the projects covered by this robot account.", + "PROJECTS_MODAL_SUMMARY": "These are the projects covered by this robot account.", "CREATE_ROBOT": "Create System Robot Account", "CREATE_ROBOT_SUMMARY": "Create a system Robot Account that will cover permissions for the system as well as for specific projects", "EDIT_ROBOT": "Edit System Robot Account", @@ -1670,14 +1670,14 @@ "CONFIRM_SECRET": "Confirm Secret", "SECRET_AGAIN": "Input secret again", "INCONSISTENT": "Two secrets are inconsistent", - "NAME_TOOLTIP": "Robot name should be 1~255 characters long with lower case characters, numbers and ._- and must be start with characters or numbers.", + "NAME_TOOLTIP": "Robot name should be 1~255 characters long with lower case characters, numbers and ._- and must start with characters or numbers.", "ENABLE_NEW_SECRET": "Enable this option to manually specify a new secret", "DELETE": "Delete", "ARTIFACT_LABEL": "Artifact label", "SCAN": "Scan", "SCANNER_PULL": "Scanner Pull", "SEARCH_BY_NAME": "Search by name(without prefix)", - "FINAL_PROJECT_NAME_TIP": "The final project robot name consists of the prefix,the project name,a plus mark and the current input value", + "FINAL_PROJECT_NAME_TIP": "The final project robot name consists of the prefix, the project name, a plus mark, and the current input value", "FINAL_SYSTEM_NAME_TIP": "The final system robot name consists of the prefix and the current input value", "PUSH_AND_PULL": "Push", "PUSH_PERMISSION_TOOLTIP": "Push permission can not work alone, it must work with pull permission", @@ -1720,7 +1720,7 @@ "INCLUDED_OPERATION_TOOLTIP": "Remove audit logs for the selected operations", "INCLUDED_OPERATION_ERROR": "Please select at least one operation", "INCLUDED_EVENT_TYPES": "Event types to purge", - "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types, checkbox \"Other events\" include all events not listed here ", + "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types, the \"Other events\" checkbox includes all events not listed here", "INCLUDED_EVENT_TYPE_ERROR": "Please select at least one event type", "PURGE_NOW": "PURGE NOW", "PURGE_NOW_SUCCESS": "Purge triggered successfully", @@ -1732,9 +1732,9 @@ "ENABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be enabled.", "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.", "SKIP_DATABASE": "Skip Audit Log Database", - "SKIP_DATABASE_TOOLTIP": "Skip to log audit log in the database, only available when audit log forward endpoint is configured", - "STOP_GC_SUCCESS": "Trigger stopping GC operation successfully", - "STOP_PURGE_SUCCESS": "Trigger stopping purging operation successfully", + "SKIP_DATABASE_TOOLTIP": "Skip logging audit logs in the database; only available when audit log forward endpoint is configured", + "STOP_GC_SUCCESS": "Triggered stop of GC operation successfully", + "STOP_PURGE_SUCCESS": "Triggered stop of purging operation successfully", "NO_GC_RECORDS": "We couldn't find any GC histories!", "NO_PURGE_RECORDS": "We couldn't find any purge histories!" }, @@ -1749,7 +1749,7 @@ "JOB_NAME": "Job Name", "JOB_NAME_REQUIRED": "Job name is required", "JOB_NAME_EXISTING": "Job name already exists", - "TRIGGER_EXPORT_SUCCESS": "Trigger exporting CVEs successfully!" + "TRIGGER_EXPORT_SUCCESS": "Triggered exporting CVEs successfully!" }, "JOB_SERVICE_DASHBOARD": { "SCHEDULE_PAUSED": "Scheduled(Paused)", diff --git a/src/registryctl/api/registry/blob/blob.go b/src/registryctl/api/registry/blob/blob.go index 771f02d6bd1..4161806e590 100644 --- a/src/registryctl/api/registry/blob/blob.go +++ b/src/registryctl/api/registry/blob/blob.go @@ -15,6 +15,7 @@ package blob import ( + "crypto/fips140" "errors" "net/http" @@ -65,7 +66,11 @@ func (h *handler) delete(w http.ResponseWriter, r *http.Request) { } // don't parse the reference here as RemoveBlob does. cleaner := storage.NewVacuum(ctx, h.storageDriver) - if err := cleaner.RemoveBlob(ref); err != nil { + var err error + fips140.WithoutEnforcement(func() { + err = cleaner.RemoveBlob(ref) + }) + if err != nil { tracelib.RecordError(span, err, "failed to remove blob") log.Infof("failed to remove blob: %s, with error:%v", ref, err) api.HandleError(w, err) diff --git a/src/registryctl/api/registry/manifest/manifest.go b/src/registryctl/api/registry/manifest/manifest.go index d17dc567c2f..69a52a980f9 100644 --- a/src/registryctl/api/registry/manifest/manifest.go +++ b/src/registryctl/api/registry/manifest/manifest.go @@ -15,6 +15,7 @@ package manifest import ( + "crypto/fips140" "net/http" "github.com/docker/distribution/registry/storage" @@ -84,7 +85,10 @@ func (h *handler) delete(w http.ResponseWriter, r *http.Request) { // let the tags as empty here, as it non-blocking GC. The tags deletion will be handled via DELETE /v2/manifest var tags []string cleaner := storage.NewVacuum(ctx, h.storageDriver) - if err := cleaner.RemoveManifest(repoName, dgst, tags); err != nil { + fips140.WithoutEnforcement(func() { + err = cleaner.RemoveManifest(repoName, dgst, tags) + }) + if err != nil { tracelib.RecordError(span, err, "failed to remove manifest") log.Infof("failed to remove manifest: %s, with error:%v", ref, err) api.HandleError(w, err) diff --git a/src/registryctl/config/config.go b/src/registryctl/config/config.go index c187504b3d3..e47932f34d6 100644 --- a/src/registryctl/config/config.go +++ b/src/registryctl/config/config.go @@ -15,6 +15,7 @@ package config import ( + "crypto/fips140" "fmt" "os" @@ -78,7 +79,12 @@ func (c *Configuration) setStorageDriver() error { if err != nil { return fmt.Errorf("error parsing registry configuration %s: %v", c.RegistryConfig, err) } - storageDriver, err := factory.Create(rConf.Storage.Type(), rConf.Storage.Parameters()) + var ( + storageDriver storagedriver.StorageDriver + ) + fips140.WithoutEnforcement(func() { + storageDriver, err = factory.Create(rConf.Storage.Type(), rConf.Storage.Parameters()) + }) if err != nil { return err } diff --git a/src/server/middleware/csrf/csrf.go b/src/server/middleware/csrf/csrf.go index 82b1755b43c..e4a78350be1 100644 --- a/src/server/middleware/csrf/csrf.go +++ b/src/server/middleware/csrf/csrf.go @@ -70,7 +70,7 @@ func Middleware() func(handler http.Handler) http.Handler { if len(key) == 0 { key = utils.GenerateRandomString() } else if len(key) != 32 { - log.Errorf("Invalid CSRF key length from the environment: %s. Please ensure the key length is 32 characters.", key) + log.Errorf("Invalid CSRF key length from the environment (%d characters). Please ensure the key length is 32 characters.", len(key)) protect = func(_ http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { lib_http.SendError(w, errors.New("invalid CSRF key length from the environment. Please ensure the key length is 32 characters")) diff --git a/src/server/middleware/v2auth/auth.go b/src/server/middleware/v2auth/auth.go index b7d8687a0a4..b90bc19ebaf 100644 --- a/src/server/middleware/v2auth/auth.go +++ b/src/server/middleware/v2auth/auth.go @@ -156,7 +156,7 @@ func match(ctx context.Context, reqHost, rawURL string) bool { if cfgURL.Scheme == "https" && strings.HasSuffix(reqHost, ":443") { reqHost = strings.TrimSuffix(reqHost, ":443") } - return reqHost == cfgURL.Host + return strings.EqualFold(reqHost, cfgURL.Host) } var ( diff --git a/src/server/v2.0/handler/member.go b/src/server/v2.0/handler/member.go index 2243cca82f6..f4b2b4ec229 100644 --- a/src/server/v2.0/handler/member.go +++ b/src/server/v2.0/handler/member.go @@ -45,7 +45,7 @@ func (m *memberAPI) CreateProjectMember(ctx context.Context, params operation.Cr return m.SendError(ctx, err) } if params.ProjectMember == nil { - return m.SendError(ctx, errors.BadRequestError(nil).WithMessage("the project member should provide")) + return m.SendError(ctx, errors.BadRequestError(nil).WithMessage("the project member should be provided")) } req, err := toMemberReq(params.ProjectMember) if err != nil { diff --git a/src/server/v2.0/handler/purge.go b/src/server/v2.0/handler/purge.go index 2379ad12de3..139a39320bf 100644 --- a/src/server/v2.0/handler/purge.go +++ b/src/server/v2.0/handler/purge.go @@ -73,19 +73,19 @@ func (p *purgeAPI) CreatePurgeSchedule(ctx context.Context, params purge.CreateP func verifyCreateRequest(params purge.CreatePurgeScheduleParams) error { if params.Schedule == nil || params.Schedule.Schedule == nil { - return errors.BadRequestError(fmt.Errorf("schedule cann't be empty")) + return errors.BadRequestError(fmt.Errorf("schedule cannot be empty")) } if len(params.Schedule.Parameters) == 0 { - return errors.BadRequestError(fmt.Errorf("schedule parameter cann't be empty")) + return errors.BadRequestError(fmt.Errorf("schedule parameter cannot be empty")) } if _, exist := params.Schedule.Parameters[common.PurgeAuditRetentionHour]; !exist { - return errors.BadRequestError(fmt.Errorf("audit_retention_hour should provide")) + return errors.BadRequestError(fmt.Errorf("audit_retention_hour should be provided")) } if _, err := retentionHour(params.Schedule.Parameters); err != nil { return err } if _, exist := params.Schedule.Parameters[common.PurgeAuditIncludeEventTypes]; !exist { - return errors.BadRequestError(fmt.Errorf("include_event_types should provide")) + return errors.BadRequestError(fmt.Errorf("include_event_types should be provided")) } return nil } @@ -301,19 +301,19 @@ func (p *purgeAPI) UpdatePurgeSchedule(ctx context.Context, params purge.UpdateP func verifyUpdateRequest(params purge.UpdatePurgeScheduleParams) error { if params.Schedule == nil || params.Schedule.Schedule == nil { - return errors.BadRequestError(fmt.Errorf("schedule cann't be empty")) + return errors.BadRequestError(fmt.Errorf("schedule cannot be empty")) } if len(params.Schedule.Parameters) == 0 { - return errors.BadRequestError(fmt.Errorf("schedule parameter cann't be empty")) + return errors.BadRequestError(fmt.Errorf("schedule parameter cannot be empty")) } if _, exist := params.Schedule.Parameters[common.PurgeAuditRetentionHour]; !exist { - return errors.BadRequestError(fmt.Errorf("audit_retention_hour should provide")) + return errors.BadRequestError(fmt.Errorf("audit_retention_hour should be provided")) } if _, err := retentionHour(params.Schedule.Parameters); err != nil { return err } if _, exist := params.Schedule.Parameters[common.PurgeAuditIncludeEventTypes]; !exist { - return errors.BadRequestError(fmt.Errorf("include_event_types should provide")) + return errors.BadRequestError(fmt.Errorf("include_event_types should be provided")) } return nil } diff --git a/src/server/v2.0/handler/registry.go b/src/server/v2.0/handler/registry.go index 2ee61604a4c..7fe2935e4d5 100644 --- a/src/server/v2.0/handler/registry.go +++ b/src/server/v2.0/handler/registry.go @@ -243,7 +243,7 @@ func (r *registryAPI) PingRegistry(ctx context.Context, params operation.PingReg // authoritative; ignore url/insecure/ca overrides so the ping (and the saved // credentials it sends) can't be redirected to or MITM'd via an untrusted endpoint if params.Registry.URL != nil && params.Registry.ID == nil { - url, err := lib.ValidateHTTPURL(*params.Registry.URL) + url, err := lib.NormalizeAndValidateHTTPURL(*params.Registry.URL) if err != nil { return r.SendError(ctx, err) } diff --git a/src/server/v2.0/handler/retention.go b/src/server/v2.0/handler/retention.go index 801498ac085..0cc846be967 100644 --- a/src/server/v2.0/handler/retention.go +++ b/src/server/v2.0/handler/retention.go @@ -184,7 +184,7 @@ func (r *retentionAPI) CreateRetention(ctx context.Context, params operation.Cre return r.SendError(ctx, errors.BadRequestError(err)) } default: - return r.SendError(ctx, errors.BadRequestError(fmt.Errorf("scope %s is not support", p.Scope.Level))) + return r.SendError(ctx, errors.BadRequestError(fmt.Errorf("scope %s is not supported", p.Scope.Level))) } old, err := r.proMetaMgr.Get(ctx, p.Scope.Reference, "retention_id") diff --git a/src/server/v2.0/handler/scanexport.go b/src/server/v2.0/handler/scanexport.go index 6a797aa1dda..69d9ebb9cc3 100644 --- a/src/server/v2.0/handler/scanexport.go +++ b/src/server/v2.0/handler/scanexport.go @@ -50,6 +50,10 @@ func newScanDataExportAPI() *scanDataExportAPI { } } +const ( + defaultScanDataExportErrorStatusText = "The export job failed without reporting a reason; check the jobservice logs for details." +) + type scanDataExportAPI struct { BaseAPI scanDataExportCtl scandataexport.Controller @@ -143,7 +147,7 @@ func (se *scanDataExportAPI) GetScanDataExportExecution(ctx context.Context, par } // add human friendly message when status is error if sdeExec.Status == job.ErrorStatus.String() && sdeExec.StatusText == "" { - sdeExec.StatusText = "Please contact the system administrator to check the logs of jobservice." + sdeExec.StatusText = defaultScanDataExportErrorStatusText } return operation.NewGetScanDataExportExecutionOK().WithPayload(&sdeExec) @@ -240,7 +244,7 @@ func (se *scanDataExportAPI) GetScanDataExportExecutionList(ctx context.Context, } // add human friendly message when status is error if sdeExec.Status == job.ErrorStatus.String() && sdeExec.StatusText == "" { - sdeExec.StatusText = "Please contact the system administrator to check the logs of jobservice." + sdeExec.StatusText = defaultScanDataExportErrorStatusText } // store project ids for _, pid := range execution.ProjectIDs { diff --git a/src/server/v2.0/handler/scanexport_test.go b/src/server/v2.0/handler/scanexport_test.go index b2325210880..317ba74ee61 100644 --- a/src/server/v2.0/handler/scanexport_test.go +++ b/src/server/v2.0/handler/scanexport_test.go @@ -355,7 +355,7 @@ func (suite *ScanExportTestSuite) TestGetScanDataExportExecution() { url := "/export/cve/execution/100" endTime := time.Now() startTime := endTime.Add(-10 * time.Minute) - defaultStatusMessage := "Please contact the system administrator to check the logs of jobservice." + defaultStatusMessage := defaultScanDataExportErrorStatusText customizeStatusMessage := "No vulnerabilities found or matched" execution := &export.Execution{ @@ -587,7 +587,7 @@ func (suite *ScanExportTestSuite) TestGetScanDataExportExecutionList() { url.RawQuery = params.Encode() endTime := time.Now() startTime := endTime.Add(-10 * time.Minute) - defaultStatusMessage := "Please contact the system administrator to check the logs of jobservice." + defaultStatusMessage := defaultScanDataExportErrorStatusText customizeStatusMessage := "No vulnerabilities found or matched" execution := &export.Execution{ diff --git a/src/server/v2.0/handler/webhook.go b/src/server/v2.0/handler/webhook.go index 921a7f485f4..2f2002b687a 100644 --- a/src/server/v2.0/handler/webhook.go +++ b/src/server/v2.0/handler/webhook.go @@ -151,7 +151,7 @@ func (n *webhookAPI) CreateWebhookPolicyOfProject(ctx context.Context, params we if ok, err := n.validateEventTypes(policy); !ok { return n.SendError(ctx, err) } - if ok, err := n.validateTargets(policy); !ok { + if ok, err := n.normalizeAndValidateTargets(policy); !ok { return n.SendError(ctx, err) } @@ -190,7 +190,7 @@ func (n *webhookAPI) UpdateWebhookPolicyOfProject(ctx context.Context, params we if ok, err := n.validateEventTypes(policy); !ok { return n.SendError(ctx, err) } - if ok, err := n.validateTargets(policy); !ok { + if ok, err := n.normalizeAndValidateTargets(policy); !ok { return n.SendError(ctx, err) } @@ -402,7 +402,7 @@ func (n *webhookAPI) GetSupportedEventTypes(ctx context.Context, params webhook. return webhook.NewGetSupportedEventTypesOK().WithPayload(notificationTypes) } -func (n *webhookAPI) validateTargets(policy *policy_model.Policy) (bool, error) { +func (n *webhookAPI) normalizeAndValidateTargets(policy *policy_model.Policy) (bool, error) { if len(policy.Targets) == 0 { return false, errors.New(nil).WithMessagef("empty notification target with policy %s", policy.Name).WithCode(errors.BadRequestCode) } @@ -411,8 +411,8 @@ func (n *webhookAPI) validateTargets(policy *policy_model.Policy) (bool, error) if err != nil { return false, errors.New(err).WithCode(errors.BadRequestCode) } - // Prevent SSRF security issue #3755 - target.Address = url.Scheme + "://" + url.Host + url.Path + // Prevent SSRF security issue #3755 and normalize host per RFC 1035 + target.Address = url.Scheme + "://" + strings.ToLower(url.Host) + url.Path if !isNotifyTypeSupported(target.Type) { return false, errors.New(nil).WithMessagef("unsupported target type %s with policy %s", target.Type, policy.Name).WithCode(errors.BadRequestCode) diff --git a/src/server/v2.0/handler/webhook_test.go b/src/server/v2.0/handler/webhook_test.go index 026e9ac7955..f631eee09b9 100644 --- a/src/server/v2.0/handler/webhook_test.go +++ b/src/server/v2.0/handler/webhook_test.go @@ -96,6 +96,18 @@ func (suite *WebhookTestSuite) TestCreateWebhookPolicyOfProject() { suite.NoError(err) suite.Equal(201, resp.StatusCode) } + + { + // mixed-case target address should be normalized to lowercase host + resp, err := suite.PostJSON(url, &models.WebhookPolicy{ + EventTypes: []string{"PUSH_ARTIFACT"}, + Targets: []*models.WebhookTargetObject{ + {Type: "http", Address: "http://WEBHOOK-TARGET.CORP.LOCAL:8080/events"}, + }, + }) + suite.NoError(err) + suite.Equal(201, resp.StatusCode) + } } func (suite *WebhookTestSuite) TestUpdateWebhookPolicyOfProject() { diff --git a/src/server/v2.0/models/zz_generated_placeholder.go b/src/server/v2.0/models/zz_generated_placeholder.go new file mode 100644 index 00000000000..b6a37356921 --- /dev/null +++ b/src/server/v2.0/models/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package models diff --git a/src/server/v2.0/restapi/operations/artifact/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/artifact/zz_generated_placeholder.go new file mode 100644 index 00000000000..1de9f6dea9b --- /dev/null +++ b/src/server/v2.0/restapi/operations/artifact/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package artifact diff --git a/src/server/v2.0/restapi/operations/auditlog/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/auditlog/zz_generated_placeholder.go new file mode 100644 index 00000000000..3f4598393f7 --- /dev/null +++ b/src/server/v2.0/restapi/operations/auditlog/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package auditlog diff --git a/src/server/v2.0/restapi/operations/configure/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/configure/zz_generated_placeholder.go new file mode 100644 index 00000000000..780dffb1ad3 --- /dev/null +++ b/src/server/v2.0/restapi/operations/configure/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package configure diff --git a/src/server/v2.0/restapi/operations/gc/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/gc/zz_generated_placeholder.go new file mode 100644 index 00000000000..1773c53e5ee --- /dev/null +++ b/src/server/v2.0/restapi/operations/gc/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package gc diff --git a/src/server/v2.0/restapi/operations/health/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/health/zz_generated_placeholder.go new file mode 100644 index 00000000000..85688fb093b --- /dev/null +++ b/src/server/v2.0/restapi/operations/health/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package health diff --git a/src/server/v2.0/restapi/operations/icon/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/icon/zz_generated_placeholder.go new file mode 100644 index 00000000000..52fa15f7229 --- /dev/null +++ b/src/server/v2.0/restapi/operations/icon/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package icon diff --git a/src/server/v2.0/restapi/operations/immutable/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/immutable/zz_generated_placeholder.go new file mode 100644 index 00000000000..f66f16975ea --- /dev/null +++ b/src/server/v2.0/restapi/operations/immutable/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package immutable diff --git a/src/server/v2.0/restapi/operations/jobservice/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/jobservice/zz_generated_placeholder.go new file mode 100644 index 00000000000..d9f1b739121 --- /dev/null +++ b/src/server/v2.0/restapi/operations/jobservice/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package jobservice diff --git a/src/server/v2.0/restapi/operations/label/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/label/zz_generated_placeholder.go new file mode 100644 index 00000000000..afa4a94bbbf --- /dev/null +++ b/src/server/v2.0/restapi/operations/label/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package label diff --git a/src/server/v2.0/restapi/operations/ldap/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/ldap/zz_generated_placeholder.go new file mode 100644 index 00000000000..fd04c34ba55 --- /dev/null +++ b/src/server/v2.0/restapi/operations/ldap/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package ldap diff --git a/src/server/v2.0/restapi/operations/member/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/member/zz_generated_placeholder.go new file mode 100644 index 00000000000..743ec5abeda --- /dev/null +++ b/src/server/v2.0/restapi/operations/member/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package member diff --git a/src/server/v2.0/restapi/operations/oidc/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/oidc/zz_generated_placeholder.go new file mode 100644 index 00000000000..d711e5d8f8a --- /dev/null +++ b/src/server/v2.0/restapi/operations/oidc/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package oidc diff --git a/src/server/v2.0/restapi/operations/permissions/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/permissions/zz_generated_placeholder.go new file mode 100644 index 00000000000..8df53f81050 --- /dev/null +++ b/src/server/v2.0/restapi/operations/permissions/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package permissions diff --git a/src/server/v2.0/restapi/operations/ping/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/ping/zz_generated_placeholder.go new file mode 100644 index 00000000000..4279797defd --- /dev/null +++ b/src/server/v2.0/restapi/operations/ping/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package ping diff --git a/src/server/v2.0/restapi/operations/preheat/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/preheat/zz_generated_placeholder.go new file mode 100644 index 00000000000..7c8a5c8b69a --- /dev/null +++ b/src/server/v2.0/restapi/operations/preheat/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package preheat diff --git a/src/server/v2.0/restapi/operations/project/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/project/zz_generated_placeholder.go new file mode 100644 index 00000000000..d5968373ee0 --- /dev/null +++ b/src/server/v2.0/restapi/operations/project/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package project diff --git a/src/server/v2.0/restapi/operations/project_metadata/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/project_metadata/zz_generated_placeholder.go new file mode 100644 index 00000000000..acca4057bcd --- /dev/null +++ b/src/server/v2.0/restapi/operations/project_metadata/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package project_metadata diff --git a/src/server/v2.0/restapi/operations/purge/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/purge/zz_generated_placeholder.go new file mode 100644 index 00000000000..53d74badcd7 --- /dev/null +++ b/src/server/v2.0/restapi/operations/purge/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package purge diff --git a/src/server/v2.0/restapi/operations/quota/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/quota/zz_generated_placeholder.go new file mode 100644 index 00000000000..00749e270cf --- /dev/null +++ b/src/server/v2.0/restapi/operations/quota/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package quota diff --git a/src/server/v2.0/restapi/operations/registry/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/registry/zz_generated_placeholder.go new file mode 100644 index 00000000000..689aedb86d0 --- /dev/null +++ b/src/server/v2.0/restapi/operations/registry/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package registry diff --git a/src/server/v2.0/restapi/operations/replication/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/replication/zz_generated_placeholder.go new file mode 100644 index 00000000000..fb3441e2a81 --- /dev/null +++ b/src/server/v2.0/restapi/operations/replication/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package replication diff --git a/src/server/v2.0/restapi/operations/repository/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/repository/zz_generated_placeholder.go new file mode 100644 index 00000000000..bc08bff2083 --- /dev/null +++ b/src/server/v2.0/restapi/operations/repository/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package repository diff --git a/src/server/v2.0/restapi/operations/retention/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/retention/zz_generated_placeholder.go new file mode 100644 index 00000000000..e2b6dc22eea --- /dev/null +++ b/src/server/v2.0/restapi/operations/retention/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package retention diff --git a/src/server/v2.0/restapi/operations/robot/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/robot/zz_generated_placeholder.go new file mode 100644 index 00000000000..f19d0ef96fd --- /dev/null +++ b/src/server/v2.0/restapi/operations/robot/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package robot diff --git a/src/server/v2.0/restapi/operations/scan/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/scan/zz_generated_placeholder.go new file mode 100644 index 00000000000..5a2e5fee706 --- /dev/null +++ b/src/server/v2.0/restapi/operations/scan/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package scan diff --git a/src/server/v2.0/restapi/operations/scan_all/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/scan_all/zz_generated_placeholder.go new file mode 100644 index 00000000000..05b989518f2 --- /dev/null +++ b/src/server/v2.0/restapi/operations/scan_all/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package scan_all diff --git a/src/server/v2.0/restapi/operations/scan_data_export/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/scan_data_export/zz_generated_placeholder.go new file mode 100644 index 00000000000..de7ec81a85f --- /dev/null +++ b/src/server/v2.0/restapi/operations/scan_data_export/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package scan_data_export diff --git a/src/server/v2.0/restapi/operations/scanner/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/scanner/zz_generated_placeholder.go new file mode 100644 index 00000000000..83a2de681b2 --- /dev/null +++ b/src/server/v2.0/restapi/operations/scanner/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package scanner diff --git a/src/server/v2.0/restapi/operations/schedule/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/schedule/zz_generated_placeholder.go new file mode 100644 index 00000000000..3d5f8cd100b --- /dev/null +++ b/src/server/v2.0/restapi/operations/schedule/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package schedule diff --git a/src/server/v2.0/restapi/operations/search/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/search/zz_generated_placeholder.go new file mode 100644 index 00000000000..98cfeb94fbe --- /dev/null +++ b/src/server/v2.0/restapi/operations/search/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package search diff --git a/src/server/v2.0/restapi/operations/securityhub/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/securityhub/zz_generated_placeholder.go new file mode 100644 index 00000000000..b2c73129966 --- /dev/null +++ b/src/server/v2.0/restapi/operations/securityhub/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package securityhub diff --git a/src/server/v2.0/restapi/operations/statistic/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/statistic/zz_generated_placeholder.go new file mode 100644 index 00000000000..1d521cfbf84 --- /dev/null +++ b/src/server/v2.0/restapi/operations/statistic/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package statistic diff --git a/src/server/v2.0/restapi/operations/system_cve_allowlist/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/system_cve_allowlist/zz_generated_placeholder.go new file mode 100644 index 00000000000..3fe24f04aef --- /dev/null +++ b/src/server/v2.0/restapi/operations/system_cve_allowlist/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package system_cve_allowlist diff --git a/src/server/v2.0/restapi/operations/systeminfo/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/systeminfo/zz_generated_placeholder.go new file mode 100644 index 00000000000..c7cafdb12f7 --- /dev/null +++ b/src/server/v2.0/restapi/operations/systeminfo/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package systeminfo diff --git a/src/server/v2.0/restapi/operations/user/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/user/zz_generated_placeholder.go new file mode 100644 index 00000000000..1fb1435231e --- /dev/null +++ b/src/server/v2.0/restapi/operations/user/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package user diff --git a/src/server/v2.0/restapi/operations/usergroup/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/usergroup/zz_generated_placeholder.go new file mode 100644 index 00000000000..c72537567bb --- /dev/null +++ b/src/server/v2.0/restapi/operations/usergroup/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package usergroup diff --git a/src/server/v2.0/restapi/operations/webhook/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/webhook/zz_generated_placeholder.go new file mode 100644 index 00000000000..edc24d3039f --- /dev/null +++ b/src/server/v2.0/restapi/operations/webhook/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package webhook diff --git a/src/server/v2.0/restapi/operations/webhookjob/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/webhookjob/zz_generated_placeholder.go new file mode 100644 index 00000000000..e552b7844b2 --- /dev/null +++ b/src/server/v2.0/restapi/operations/webhookjob/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package webhookjob diff --git a/src/server/v2.0/restapi/operations/zz_generated_placeholder.go b/src/server/v2.0/restapi/operations/zz_generated_placeholder.go new file mode 100644 index 00000000000..99a2fa67035 --- /dev/null +++ b/src/server/v2.0/restapi/operations/zz_generated_placeholder.go @@ -0,0 +1,23 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +package operations diff --git a/src/server/v2.0/restapi/zz_generated_placeholder.go b/src/server/v2.0/restapi/zz_generated_placeholder.go new file mode 100644 index 00000000000..ecb15e4fb6e --- /dev/null +++ b/src/server/v2.0/restapi/zz_generated_placeholder.go @@ -0,0 +1,44 @@ +// Copyright Project Harbor Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The rest of this package is generated by go-swagger from api/v2.0/swagger.yaml +// ("make gen_apis") and is not committed. This file is committed so that the +// package still exists on a fresh checkout, before code generation has run. +// +// Without it "go mod tidy" and "go list ./..." fail, because the packages that +// src/server/v2.0/handler imports do not exist yet. Dependabot runs "go mod tidy" +// on a plain checkout and therefore cannot update any Go module at all. + +// This file additionally anchors the module requirements of the generated code. +// The blank imports below are the complete set of external packages that the +// generated code under src/server/v2.0/{models,restapi} imports. Keeping them +// here makes "go mod tidy" compute the same go.mod and go.sum with and without +// generated code present; otherwise a tidy run on a fresh checkout would demote +// go-openapi/{loads,spec,validate} to "// indirect" and prune go.sum entries. + +package restapi + +import ( + // Blank imports: this package is empty until "make gen_apis" runs, so nothing + // would reference these modules and "go mod tidy" would rewrite go.mod/go.sum. + _ "github.com/go-openapi/errors" + _ "github.com/go-openapi/loads" + _ "github.com/go-openapi/runtime" + _ "github.com/go-openapi/runtime/middleware" + _ "github.com/go-openapi/runtime/security" + _ "github.com/go-openapi/spec" + _ "github.com/go-openapi/strfmt" + _ "github.com/go-openapi/swag" + _ "github.com/go-openapi/validate" +) diff --git a/tests/apitests/python/library/robot.py b/tests/apitests/python/library/robot.py index 53bde5be30a..fba72b5da72 100644 --- a/tests/apitests/python/library/robot.py +++ b/tests/apitests/python/library/robot.py @@ -128,5 +128,4 @@ def refresh_robot_account_secret(self, robot_id, robot_new_sec, expect_status_co data, status_code, _ = self._get_client(**kwargs).refresh_sec_with_http_info(robot_id, robot_sec) base._assert_status_code(expect_status_code, status_code) base._assert_status_code(200, status_code) - print("Refresh new secret:", data) return data diff --git a/tests/ci/distro_installer.sh b/tests/ci/distro_installer.sh index a7bff2acf71..02a31eeac14 100755 --- a/tests/ci/distro_installer.sh +++ b/tests/ci/distro_installer.sh @@ -3,5 +3,5 @@ set -x set -e -sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.26.4 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false -sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.26.4 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_online GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.26.7 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false +sudo make package_offline GOBUILDTAGS="include_oss include_gcs" VERSIONTAG=dev-gitaction PKGVERSIONTAG=dev-gitaction UIVERSIONTAG=dev-gitaction GOBUILDIMAGE=golang:1.26.7 COMPILETAG=compile_golangimage TRIVYFLAG=true EXPORTERFLAG=true HTTPPROXY= PULL_BASE_FROM_DOCKERHUB=false diff --git a/tests/resources/Harbor-Pages/Configuration.robot b/tests/resources/Harbor-Pages/Configuration.robot index 49291c256be..0d2997e6319 100644 --- a/tests/resources/Harbor-Pages/Configuration.robot +++ b/tests/resources/Harbor-Pages/Configuration.robot @@ -281,8 +281,13 @@ Delete Top Item In System CVE Allowlist Set CVE Allowlist Expires [Arguments] ${expired} Retry Button Click ${cve_allowlist_expires_btn} - ${element}= Set Variable If ${expired} ${cve_allowlist_expires_yesterday} ${cve_allowlist_expires_tomorrow} - Retry Element Click ${element} + # The picker opens on the month of the previously selected date, so jump back to the current month first + Retry Element Click ${datepicker_cur_month_btn} + # Clarity hides adjacent-month days, so yesterday/tomorrow can be unclickable at month boundaries; + # switch to the previous/next month and pick its 15th to get a date in the past/future + ${switcher}= Set Variable If ${expired} ${datepicker_prev_month_btn} ${datepicker_next_month_btn} + Retry Element Click ${switcher} + Retry Element Click ${datepicker_mid_month_day_btn} Retry Element Click //button[contains(.,'SAVE')] Get Project Count Quota Text From Project Quotas List diff --git a/tests/resources/Harbor-Pages/Configuration_Elements.robot b/tests/resources/Harbor-Pages/Configuration_Elements.robot index 6bc53ef2b19..e44fcd6d3e4 100644 --- a/tests/resources/Harbor-Pages/Configuration_Elements.robot +++ b/tests/resources/Harbor-Pages/Configuration_Elements.robot @@ -35,8 +35,10 @@ ${configuration_system_wl_add_confirm_btn} //*[@id='add-to-system'] ${configuration_system_wl_delete_a_cve_id_icon} //app-security//form/section//ul/li[1]/a[2]/clr-icon ${configuration_sys_repo_readonly_chb_id} //*[@id='repo_read_only_lbl'] ${cve_allowlist_expires_btn} //clr-date-container[.//div[@class='clr-input-group' and not(@hidden)]]//button -${cve_allowlist_expires_yesterday} //td[.//button[@class='day-btn is-today']]/preceding::td[1] -${cve_allowlist_expires_tomorrow} //td[.//button[@class='day-btn is-today']]/following::td[1] +${datepicker_cur_month_btn} //button[@class='calendar-btn switcher' and .//cds-icon[@shape='event']] +${datepicker_prev_month_btn} //button[@class='calendar-btn switcher' and .//cds-icon[@shape='angle' and @direction='left']] +${datepicker_next_month_btn} //button[@class='calendar-btn switcher' and .//cds-icon[@shape='angle' and @direction='right']] +${datepicker_mid_month_day_btn} //button[contains(@class,'day-btn') and not(contains(@class,'is-excluded')) and normalize-space()='15'] ${cfg_auth_automatic_onboarding_checkbox} (//input[@id='oidcAutoOnboard'])[1] ${cfg_auth_user_name_claim_input} //*[@id='oidcUserClaim']