From e4c54e8f5ea8f3ac3405ddd0da233249e7b481b4 Mon Sep 17 00:00:00 2001 From: Brecci Date: Mon, 9 Feb 2026 18:04:53 -0300 Subject: [PATCH 1/3] fix(license): replace panic with os.Exit(1) in DefaultHandler Using panic for license termination allowed recovery middleware to catch the failure, causing the app to continue running unlicensed. os.Exit(1) ensures the process terminates regardless of recovery middleware, so Docker can restart the container to retry license validation. X-Lerian-Ref: 0x1 --- commons/license/manager.go | 10 ++++-- commons/license/manager_test.go | 64 +++++++++++++++++++++++++++------ commons/server/shutdown.go | 12 ------- 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/commons/license/manager.go b/commons/license/manager.go index 978ae75a..8d2baed6 100644 --- a/commons/license/manager.go +++ b/commons/license/manager.go @@ -3,6 +3,7 @@ package license import ( "errors" "fmt" + "os" "sync" ) @@ -16,10 +17,13 @@ var ( // Handler defines the function signature for termination handlers type Handler func(reason string) -// DefaultHandler is the default termination behavior -// It triggers a panic which will be caught by the graceful shutdown handler +// DefaultHandler is the default termination behavior. +// It logs the failure reason to stderr and terminates the process with exit code 1. +// This ensures the application cannot continue running with an invalid license, +// even when a recovery middleware is present that would catch panics. func DefaultHandler(reason string) { - panic("LICENSE VALIDATION FAILED: " + reason) + fmt.Fprintf(os.Stderr, "LICENSE VALIDATION FAILED: %s\n", reason) + os.Exit(1) } // DefaultHandlerWithError returns an error instead of panicking. diff --git a/commons/license/manager_test.go b/commons/license/manager_test.go index 3ddfb826..0b19ad9b 100644 --- a/commons/license/manager_test.go +++ b/commons/license/manager_test.go @@ -1,7 +1,10 @@ package license_test import ( + "bytes" "errors" + "os" + "os/exec" "testing" "github.com/LerianStudio/lib-commons/v2/commons/license" @@ -41,11 +44,33 @@ func TestSetHandlerWithNil(t *testing.T) { } func TestDefaultHandler(t *testing.T) { - manager := license.New() - - assert.Panics(t, func() { + // DefaultHandler calls os.Exit(1), so we test it in a subprocess + if os.Getenv("TEST_DEFAULT_HANDLER_EXIT") == "1" { + manager := license.New() manager.Terminate("default handler test") - }, "Default handler should panic") + + return + } + + cmd := exec.Command(os.Args[0], "-test.run=TestDefaultHandler") + cmd.Env = append(os.Environ(), "TEST_DEFAULT_HANDLER_EXIT=1") + + var stderr bytes.Buffer + cmd.Stderr = &stderr + + err := cmd.Run() + + // Verify process exited with non-zero code + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + assert.Equal(t, 1, exitErr.ExitCode(), "Expected exit code 1") + } else { + t.Fatal("Expected process to exit with code 1") + } + + // Verify error message was printed to stderr + assert.Contains(t, stderr.String(), "LICENSE VALIDATION FAILED") + assert.Contains(t, stderr.String(), "default handler test") } func TestDefaultHandlerWithError(t *testing.T) { @@ -139,12 +164,29 @@ func TestTerminateSafe_UninitializedManager(t *testing.T) { } func TestTerminateSafe_WithDefaultHandler(t *testing.T) { - manager := license.New() - - // Note: This will panic because DefaultHandler panics. - // TerminateSafe invokes the handler before returning nil, - // so the panic comes from the handler during TerminateSafe execution. - assert.Panics(t, func() { + // DefaultHandler calls os.Exit(1), so we test it in a subprocess + if os.Getenv("TEST_TERMINATE_SAFE_DEFAULT_EXIT") == "1" { + manager := license.New() _ = manager.TerminateSafe("test") - }, "Default handler should still panic when invoked via TerminateSafe") + + return + } + + cmd := exec.Command(os.Args[0], "-test.run=TestTerminateSafe_WithDefaultHandler") + cmd.Env = append(os.Environ(), "TEST_TERMINATE_SAFE_DEFAULT_EXIT=1") + + var stderr bytes.Buffer + cmd.Stderr = &stderr + + err := cmd.Run() + + // Verify process exited with non-zero code + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + assert.Equal(t, 1, exitErr.ExitCode(), "Expected exit code 1") + } else { + t.Fatal("Expected process to exit with code 1") + } + + assert.Contains(t, stderr.String(), "LICENSE VALIDATION FAILED") } diff --git a/commons/server/shutdown.go b/commons/server/shutdown.go index c6ee4d2f..59713cca 100644 --- a/commons/server/shutdown.go +++ b/commons/server/shutdown.go @@ -286,12 +286,6 @@ func (sm *ServerManager) executeShutdown() { } } - // Shutdown license background refresh if available - if sm.licenseClient != nil { - sm.logInfo("Shutting down license background refresh...") - sm.licenseClient.Terminate("shutdown") - } - sm.logInfo("Graceful shutdown completed") } @@ -376,11 +370,5 @@ func (gs *GracefulShutdown) executeShutdown() { } } - // Shutdown license background refresh if available - if gs.licenseClient != nil { - gs.logger.Info("Shutting down license background refresh...") - gs.licenseClient.Terminate("shutdown") - } - gs.logger.Info("Graceful shutdown completed") } From afdf1eea8ebd721d950e66ba33ec63858d51ea72 Mon Sep 17 00:00:00 2001 From: Brecci Date: Tue, 10 Feb 2026 17:53:07 -0300 Subject: [PATCH 2/3] refactor(license): extract subprocess test helper Deduplicates the os.Exit subprocess test pattern from TestDefaultHandler and TestTerminateSafe_WithDefaultHandler into a reusable runSubprocessTest t.Helper. X-Lerian-Ref: 0x1 --- commons/license/manager_test.go | 54 +++++++++++++++------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/commons/license/manager_test.go b/commons/license/manager_test.go index 0b19ad9b..180bc295 100644 --- a/commons/license/manager_test.go +++ b/commons/license/manager_test.go @@ -43,24 +43,20 @@ func TestSetHandlerWithNil(t *testing.T) { assert.True(t, handlerCalled, "Original handler should still be called when nil is passed") } -func TestDefaultHandler(t *testing.T) { - // DefaultHandler calls os.Exit(1), so we test it in a subprocess - if os.Getenv("TEST_DEFAULT_HANDLER_EXIT") == "1" { - manager := license.New() - manager.Terminate("default handler test") +// runSubprocessTest runs the named test in a subprocess with the given env var set to "1". +// It asserts the process exits with code 1 and stderr contains "LICENSE VALIDATION FAILED" +// plus any additional expected messages. +func runSubprocessTest(t *testing.T, testName, envVar string, expectedMessages ...string) { + t.Helper() - return - } - - cmd := exec.Command(os.Args[0], "-test.run=TestDefaultHandler") - cmd.Env = append(os.Environ(), "TEST_DEFAULT_HANDLER_EXIT=1") + cmd := exec.Command(os.Args[0], "-test.run="+testName) + cmd.Env = append(os.Environ(), envVar+"=1") var stderr bytes.Buffer cmd.Stderr = &stderr err := cmd.Run() - // Verify process exited with non-zero code var exitErr *exec.ExitError if errors.As(err, &exitErr) { assert.Equal(t, 1, exitErr.ExitCode(), "Expected exit code 1") @@ -68,9 +64,23 @@ func TestDefaultHandler(t *testing.T) { t.Fatal("Expected process to exit with code 1") } - // Verify error message was printed to stderr assert.Contains(t, stderr.String(), "LICENSE VALIDATION FAILED") - assert.Contains(t, stderr.String(), "default handler test") + + for _, msg := range expectedMessages { + assert.Contains(t, stderr.String(), msg) + } +} + +func TestDefaultHandler(t *testing.T) { + // DefaultHandler calls os.Exit(1), so we test it in a subprocess + if os.Getenv("TEST_DEFAULT_HANDLER_EXIT") == "1" { + manager := license.New() + manager.Terminate("default handler test") + + return + } + + runSubprocessTest(t, "TestDefaultHandler", "TEST_DEFAULT_HANDLER_EXIT", "default handler test") } func TestDefaultHandlerWithError(t *testing.T) { @@ -172,21 +182,5 @@ func TestTerminateSafe_WithDefaultHandler(t *testing.T) { return } - cmd := exec.Command(os.Args[0], "-test.run=TestTerminateSafe_WithDefaultHandler") - cmd.Env = append(os.Environ(), "TEST_TERMINATE_SAFE_DEFAULT_EXIT=1") - - var stderr bytes.Buffer - cmd.Stderr = &stderr - - err := cmd.Run() - - // Verify process exited with non-zero code - var exitErr *exec.ExitError - if errors.As(err, &exitErr) { - assert.Equal(t, 1, exitErr.ExitCode(), "Expected exit code 1") - } else { - t.Fatal("Expected process to exit with code 1") - } - - assert.Contains(t, stderr.String(), "LICENSE VALIDATION FAILED") + runSubprocessTest(t, "TestTerminateSafe_WithDefaultHandler", "TEST_TERMINATE_SAFE_DEFAULT_EXIT") } From c9ee8f7a8b3e21b190c4520e417b935be0964164 Mon Sep 17 00:00:00 2001 From: Brecci Date: Wed, 18 Feb 2026 18:05:31 -0300 Subject: [PATCH 3/3] fix: bump go version to fix vulnerability GO-2026-4337 --- go.mod | 31 ++++++++++++++++--------------- go.sum | 28 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index b7948c44..09c9b65d 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/LerianStudio/lib-commons/v2 -go 1.24.2 +go 1.25.0 -toolchain go1.25.6 +toolchain go1.25.7 require ( cloud.google.com/go/iam v1.5.3 @@ -16,7 +16,7 @@ require ( github.com/jackc/pgx/v5 v5.8.0 github.com/joho/godotenv v1.5.1 github.com/rabbitmq/amqp091-go v1.10.0 - github.com/redis/go-redis/v9 v9.17.3 + github.com/redis/go-redis/v9 v9.18.0 github.com/shirou/gopsutil v3.21.11+incompatible github.com/shopspring/decimal v1.4.0 github.com/sony/gobreaker v1.0.0 @@ -38,19 +38,19 @@ require ( go.uber.org/zap v1.27.1 golang.org/x/oauth2 v0.35.0 golang.org/x/text v0.34.0 - google.golang.org/api v0.265.0 - google.golang.org/grpc v1.78.0 + google.golang.org/api v0.267.0 + google.golang.org/grpc v1.79.1 google.golang.org/protobuf v1.36.11 ) require ( - cloud.google.com/go/auth v0.18.1 // indirect + cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/clipperhouse/uax29/v2 v2.6.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -59,9 +59,9 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.11 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.12 // indirect github.com/googleapis/gax-go/v2 v2.17.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -70,10 +70,10 @@ require ( github.com/klauspost/compress v1.18.4 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.11.1 // indirect + github.com/lib/pq v1.11.2 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.20 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect @@ -90,13 +90,14 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.47.0 // indirect - golang.org/x/net v0.49.0 // indirect + golang.org/x/crypto v0.48.0 // indirect + golang.org/x/net v0.50.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect golang.org/x/time v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a5b7b94b..0d5bba62 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ cloud.google.com/go/auth v0.18.1 h1:IwTEx92GFUo2pJ6Qea0EU3zYvKnTAeRCODxfA/G5UWs= cloud.google.com/go/auth v0.18.1/go.mod h1:GfTYoS9G3CWpRA3Va9doKN9mjPGRS+v41jmZAhBzbrA= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= @@ -30,6 +32,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clipperhouse/uax29/v2 v2.6.0 h1:z0cDbUV+aPASdFb2/ndFnS9ts/WNXgTNNGFoKXuhpos= github.com/clipperhouse/uax29/v2 v2.6.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -97,10 +101,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.11 h1:vAe81Msw+8tKUxi2Dqh/NZMz7475yUvmRIkXr4oN2ao= github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8= +github.com/googleapis/enterprise-certificate-proxy v0.3.12 h1:Fg+zsqzYEs1ZnvmcztTYxhgCBsx3eEhEwQ1W/lHq/sQ= +github.com/googleapis/enterprise-certificate-proxy v0.3.12/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -128,12 +136,16 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/lib/pq v1.11.1 h1:wuChtj2hfsGmmx3nf1m7xC2XpK6OtelS2shMY+bGMtI= github.com/lib/pq v1.11.1/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= +github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs= +github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= +github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -157,6 +169,8 @@ github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzuk github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/redis/go-redis/v9 v9.17.3 h1:fN29NdNrE17KttK5Ndf20buqfDZwGNgoUr9qjl1DQx4= github.com/redis/go-redis/v9 v9.17.3/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= +github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= +github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0= github.com/redis/rueidis v1.0.69 h1:WlUefRhuDekji5LsD387ys3UCJtSFeBVf0e5yI0B8b4= github.com/redis/rueidis v1.0.69/go.mod h1:Lkhr2QTgcoYBhxARU7kJRO8SyVlgUuEkcJO1Y8MCluA= github.com/redis/rueidis/rueidiscompat v1.0.69 h1:IWVYY9lXdjNO3do2VpJT7aDFi8zbCUuQxZB6E2Grahs= @@ -238,6 +252,8 @@ go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZY go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= @@ -250,12 +266,16 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= +golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -290,14 +310,22 @@ gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.265.0 h1:FZvfUdI8nfmuNrE34aOWFPmLC+qRBEiNm3JdivTvAAU= google.golang.org/api v0.265.0/go.mod h1:uAvfEl3SLUj/7n6k+lJutcswVojHPp2Sp08jWCu8hLY= +google.golang.org/api v0.267.0 h1:w+vfWPMPYeRs8qH1aYYsFX68jMls5acWl/jocfLomwE= +google.golang.org/api v0.267.0/go.mod h1:Jzc0+ZfLnyvXma3UtaTl023TdhZu6OMBP9tJ+0EmFD0= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= +google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20 h1:Jr5R2J6F6qWyzINc+4AM8t5pfUz6beZpHp678GNrMbE= google.golang.org/genproto/googleapis/rpc v0.0.0-20260203192932-546029d2fa20/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=