diff --git a/auth/middleware/middleware.go b/auth/middleware/middleware.go index 5111045..8fd225c 100644 --- a/auth/middleware/middleware.go +++ b/auth/middleware/middleware.go @@ -7,16 +7,19 @@ import ( "errors" "fmt" "io" + stdlog "log" "net/http" + "os" + "strings" "time" - "github.com/LerianStudio/lib-commons/v3/commons/log" - "github.com/LerianStudio/lib-commons/v3/commons/opentelemetry" - "github.com/LerianStudio/lib-commons/v3/commons/zap" + "github.com/LerianStudio/lib-commons/v4/commons/log" + "github.com/LerianStudio/lib-commons/v4/commons/opentelemetry" + "github.com/LerianStudio/lib-commons/v4/commons/zap" "go.opentelemetry.io/otel/attribute" - "github.com/LerianStudio/lib-commons/v3/commons" - libHTTP "github.com/LerianStudio/lib-commons/v3/commons/net/http" + "github.com/LerianStudio/lib-commons/v4/commons" + libHTTP "github.com/LerianStudio/lib-commons/v4/commons/net/http" "github.com/gofiber/fiber/v2" jwt "github.com/golang-jwt/jwt/v5" ) @@ -46,6 +49,54 @@ const ( pluginName string = "plugin-auth" ) +func logErrorf(ctx context.Context, logger log.Logger, format string, args ...any) { + if logger == nil { + return + } + + logger.Log(ctx, log.LevelError, fmt.Sprintf(format, args...)) +} + +func logInfof(ctx context.Context, logger log.Logger, format string, args ...any) { + if logger == nil { + return + } + + logger.Log(ctx, log.LevelInfo, fmt.Sprintf(format, args...)) +} + +func initializeDefaultLogger() (log.Logger, error) { + envName := strings.ToLower(strings.TrimSpace(os.Getenv("ENV_NAME"))) + + environment := zap.EnvironmentLocal + + switch envName { + case string(zap.EnvironmentProduction): + environment = zap.EnvironmentProduction + case string(zap.EnvironmentStaging): + environment = zap.EnvironmentStaging + case string(zap.EnvironmentUAT): + environment = zap.EnvironmentUAT + case string(zap.EnvironmentDevelopment), "dev": + environment = zap.EnvironmentDevelopment + } + + otelLibraryName := strings.TrimSpace(os.Getenv("OTEL_LIBRARY_NAME")) + if otelLibraryName == "" { + otelLibraryName = "lib-auth" + } + + logger, err := zap.New(zap.Config{ + Environment: environment, + OTelLibraryName: otelLibraryName, + }) + if err != nil { + return nil, err + } + + return logger, nil +} + // NewAuthClient creates a new instance of AuthClient. // It checks the health of the authorization service if the client is enabled and the address is provided. // If the service is healthy, it logs a successful connection message; otherwise, it logs the failure reason. @@ -57,11 +108,11 @@ func NewAuthClient(address string, enabled bool, logger *log.Logger) *AuthClient if logger != nil { l = *logger } else { - l, err = zap.InitializeLoggerWithError() + l, err = initializeDefaultLogger() if err != nil { - l = &log.NoneLogger{} + stdlog.Printf("failed to initialize logger, using NopLogger: %v", err) - l.Errorf("failed to initialize logger, using NoneLogger: %v\n", err) + l = log.NewNop() } } @@ -80,29 +131,29 @@ func NewAuthClient(address string, enabled bool, logger *log.Logger) *AuthClient resp, err := client.Get(healthURL) if err != nil { - l.Errorf(failedToConnectMsg, err) + logErrorf(context.Background(), l, failedToConnectMsg, err) return &AuthClient{Address: address, Enabled: enabled, Logger: l} } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - l.Errorf(failedToConnectMsg, resp.Status) + logErrorf(context.Background(), l, failedToConnectMsg, resp.Status) return &AuthClient{Address: address, Enabled: enabled, Logger: l} } body, err := io.ReadAll(resp.Body) if err != nil { - l.Errorf("Failed to read response body: %v\n", err) + logErrorf(context.Background(), l, "Failed to read response body: %v", err) return &AuthClient{Address: address, Enabled: enabled, Logger: l} } if string(body) == "healthy" { - l.Infof("Connected to %s ✅ \n", pluginName) + logInfof(context.Background(), l, "Connected to %s", pluginName) } else { - l.Errorf(failedToConnectMsg, string(body)) + logErrorf(context.Background(), l, failedToConnectMsg, string(body)) } return &AuthClient{ @@ -117,7 +168,7 @@ func NewAuthClient(address string, enabled bool, logger *log.Logger) *AuthClient // If the user is authorized, the request is passed to the next handler; otherwise, a 403 Forbidden status is returned. func (auth *AuthClient) Authorize(sub, resource, action string) fiber.Handler { return func(c *fiber.Ctx) error { - ctx := opentelemetry.ExtractHTTPContext(c) + ctx := opentelemetry.ExtractHTTPContext(c.UserContext(), c) _, tracer, reqID, _ := commons.NewTrackingFromContext(ctx) @@ -177,20 +228,20 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a token, _, err := new(jwt.Parser).ParseUnverified(accessToken, jwt.MapClaims{}) if err != nil { - auth.Logger.Errorf("Failed to parse token: %v", err) + logErrorf(ctx, auth.Logger, "Failed to parse token: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to parse token", err) + opentelemetry.HandleSpanError(span, "Failed to parse token", err) return false, http.StatusInternalServerError, err } claims, ok := token.Claims.(jwt.MapClaims) if !ok { - auth.Logger.Errorf("Failed to parse claims: token.Claims is not of type jwt.MapClaims") + logErrorf(ctx, auth.Logger, "Failed to parse claims: token.Claims is not of type jwt.MapClaims") err := errors.New("token claims are not in the expected format") - opentelemetry.HandleSpanError(&span, "Failed to parse claims", err) + opentelemetry.HandleSpanError(span, "Failed to parse claims", err) return false, http.StatusInternalServerError, err } @@ -202,11 +253,11 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a } else { owner, _ := claims["owner"].(string) if owner == "" { - auth.Logger.Errorf("Missing owner claim in token") + logErrorf(ctx, auth.Logger, "Missing owner claim in token") err := errors.New("missing owner claim in token") - opentelemetry.HandleSpanError(&span, "Missing owner claim in token", err) + opentelemetry.HandleSpanError(span, "Missing owner claim in token", err) return false, http.StatusUnauthorized, err } @@ -221,41 +272,41 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a "action": action, } - err = opentelemetry.SetSpanAttributesFromStruct(&span, "app.request.payload", requestBody) + err = opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", requestBody, nil) if err != nil { - opentelemetry.HandleSpanError(&span, "Failed to convert request body to JSON string", err) + opentelemetry.HandleSpanError(span, "Failed to convert request body to JSON string", err) return false, http.StatusInternalServerError, err } requestBodyJSON, err := json.Marshal(requestBody) if err != nil { - auth.Logger.Errorf("Failed to marshal request body: %v", err) + logErrorf(ctx, auth.Logger, "Failed to marshal request body: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to marshal request body", err) + opentelemetry.HandleSpanError(span, "Failed to marshal request body", err) return false, http.StatusInternalServerError, err } req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/v1/authorize", auth.Address), bytes.NewBuffer(requestBodyJSON)) if err != nil { - auth.Logger.Errorf("Failed to create request: %v", err) + logErrorf(ctx, auth.Logger, "Failed to create request: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to create request", err) + opentelemetry.HandleSpanError(span, "Failed to create request", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to create request: %w", err) } - opentelemetry.InjectHTTPContext(&req.Header, ctx) + opentelemetry.InjectHTTPContext(ctx, req.Header) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", accessToken) resp, err := client.Do(req) if err != nil { - auth.Logger.Errorf("Failed to make request: %v", err) + logErrorf(ctx, auth.Logger, "Failed to make request: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to make request", err) + opentelemetry.HandleSpanError(span, "Failed to make request", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to make request: %w", err) } @@ -263,35 +314,35 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a body, err := io.ReadAll(resp.Body) if err != nil { - auth.Logger.Errorf("Failed to read response body: %v", err) + logErrorf(ctx, auth.Logger, "Failed to read response body: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to read response body", err) + opentelemetry.HandleSpanError(span, "Failed to read response body", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to read response body: %w", err) } var respError commons.Response if err := json.Unmarshal(body, &respError); err != nil { - auth.Logger.Errorf("Failed to unmarshal auth error response: %v", err) + logErrorf(ctx, auth.Logger, "Failed to unmarshal auth error response: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to unmarshal auth error response", err) + opentelemetry.HandleSpanError(span, "Failed to unmarshal auth error response", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to unmarshal auth error response: %w", err) } if respError.Code != "" && resp.StatusCode != http.StatusInternalServerError { - auth.Logger.Errorf("Authorization request failed: %s", respError.Message) + logErrorf(ctx, auth.Logger, "Authorization request failed: %s", respError.Message) - opentelemetry.HandleSpanError(&span, "Authorization request failed", respError) + opentelemetry.HandleSpanError(span, "Authorization request failed", respError) return false, resp.StatusCode, respError } var response AuthResponse if err := json.Unmarshal(body, &response); err != nil { - auth.Logger.Errorf("Failed to unmarshal response: %v", err) + logErrorf(ctx, auth.Logger, "Failed to unmarshal response: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to unmarshal response", err) + opentelemetry.HandleSpanError(span, "Failed to unmarshal response", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to unmarshal response: %w", err) } @@ -324,40 +375,40 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien "clientSecret": clientSecret, } - err := opentelemetry.SetSpanAttributesFromStruct(&span, "app.request.payload", requestBody) + err := opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", requestBody, nil) if err != nil { - opentelemetry.HandleSpanError(&span, "Failed to convert request body to JSON string", err) + opentelemetry.HandleSpanError(span, "Failed to convert request body to JSON string", err) return "", fmt.Errorf("failed to convert request body to JSON string: %w", err) } requestBodyJSON, err := json.Marshal(requestBody) if err != nil { - auth.Logger.Errorf("Failed to marshal request body: %v", err) + logErrorf(ctx, auth.Logger, "Failed to marshal request body: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to marshal request body", err) + opentelemetry.HandleSpanError(span, "Failed to marshal request body", err) return "", fmt.Errorf("failed to marshal request body: %w", err) } req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/v1/login/oauth/access_token", auth.Address), bytes.NewBuffer(requestBodyJSON)) if err != nil { - auth.Logger.Errorf("Failed to create request: %v", err) + logErrorf(ctx, auth.Logger, "Failed to create request: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to create request", err) + opentelemetry.HandleSpanError(span, "Failed to create request", err) return "", fmt.Errorf("failed to create request: %w", err) } - opentelemetry.InjectHTTPContext(&req.Header, ctx) + opentelemetry.InjectHTTPContext(ctx, req.Header) req.Header.Set("Content-Type", "application/json") resp, err := client.Do(req) if err != nil { - auth.Logger.Errorf("Failed to make request: %v", err) + logErrorf(ctx, auth.Logger, "Failed to make request: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to make request", err) + opentelemetry.HandleSpanError(span, "Failed to make request", err) return "", fmt.Errorf("failed to make request: %w", err) } @@ -365,35 +416,35 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien body, err := io.ReadAll(resp.Body) if err != nil { - auth.Logger.Errorf("Failed to read response body: %v", err) + logErrorf(ctx, auth.Logger, "Failed to read response body: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to read response body", err) + opentelemetry.HandleSpanError(span, "Failed to read response body", err) return "", fmt.Errorf("failed to read response body: %w", err) } var respError commons.Response if err := json.Unmarshal(body, &respError); err != nil { - auth.Logger.Errorf("Failed to unmarshal auth error response: %v", err) + logErrorf(ctx, auth.Logger, "Failed to unmarshal auth error response: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to unmarshal auth error response", err) + opentelemetry.HandleSpanError(span, "Failed to unmarshal auth error response", err) return "", fmt.Errorf("failed to unmarshal auth error response: %w", err) } if respError.Code != "" && resp.StatusCode != http.StatusInternalServerError { - auth.Logger.Errorf("Failed to get application token: %s", respError.Message) + logErrorf(ctx, auth.Logger, "Failed to get application token: %s", respError.Message) - opentelemetry.HandleSpanError(&span, "Failed to get application token", respError) + opentelemetry.HandleSpanError(span, "Failed to get application token", respError) return "", respError } var response oauth2Token if err := json.Unmarshal(body, &response); err != nil { - auth.Logger.Errorf("Failed to unmarshal response: %v", err) + logErrorf(ctx, auth.Logger, "Failed to unmarshal response: %v", err) - opentelemetry.HandleSpanError(&span, "Failed to unmarshal response", err) + opentelemetry.HandleSpanError(span, "Failed to unmarshal response", err) return "", fmt.Errorf("failed to unmarshal response: %w", err) } diff --git a/auth/middleware/middlewareGRPC.go b/auth/middleware/middlewareGRPC.go index 15a0aa2..87e3482 100644 --- a/auth/middleware/middlewareGRPC.go +++ b/auth/middleware/middlewareGRPC.go @@ -8,8 +8,8 @@ import ( "os" "strings" - "github.com/LerianStudio/lib-commons/v3/commons" - "github.com/LerianStudio/lib-commons/v3/commons/opentelemetry" + "github.com/LerianStudio/lib-commons/v4/commons" + "github.com/LerianStudio/lib-commons/v4/commons/opentelemetry" jwt "github.com/golang-jwt/jwt/v5" "go.opentelemetry.io/otel/attribute" "google.golang.org/grpc" @@ -63,7 +63,7 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer pol, found := policyForMethod(cfg, info.FullMethod) if !found { - opentelemetry.HandleSpanError(&span, "no policy configured for method", fmt.Errorf("%s", info.FullMethod)) + opentelemetry.HandleSpanError(span, "no policy configured for method", fmt.Errorf("%s", info.FullMethod)) return nil, status.Error(codes.Internal, "internal configuration error") } @@ -75,7 +75,7 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer sub, err = cfg.SubResolver(ctx, info.FullMethod, req) if err != nil { - opentelemetry.HandleSpanError(&span, "failed to resolve subject", err) + opentelemetry.HandleSpanError(span, "failed to resolve subject", err) return nil, status.Error(codes.Internal, "internal configuration error") } @@ -86,8 +86,8 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer "resource": pol.Resource, "action": pol.Action, } - if err := opentelemetry.SetSpanAttributesFromStruct(&span, "app.request.payload", payload); err != nil { - opentelemetry.HandleSpanError(&span, "failed to set span payload", err) + if err := opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", payload, nil); err != nil { + opentelemetry.HandleSpanError(span, "failed to set span payload", err) } authorized, httpStatus, err := auth.checkAuthorization(ctx, sub, pol.Resource, pol.Action, token) diff --git a/auth/middleware/middleware_test.go b/auth/middleware/middleware_test.go index ea6ddec..d0a72f7 100644 --- a/auth/middleware/middleware_test.go +++ b/auth/middleware/middleware_test.go @@ -7,7 +7,7 @@ import ( "net/http/httptest" "testing" - "github.com/LerianStudio/lib-commons/v3/commons/log" + "github.com/LerianStudio/lib-commons/v4/commons/log" jwt "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -51,24 +51,11 @@ func mockAuthServer(t *testing.T, authorized bool, statusCode int) *httptest.Ser // testLogger is a minimal log.Logger implementation for tests that discards all output. type testLogger struct{} -func (l *testLogger) Info(_ ...any) {} -func (l *testLogger) Infof(_ string, _ ...any) {} -func (l *testLogger) Infoln(_ ...any) {} -func (l *testLogger) Error(_ ...any) {} -func (l *testLogger) Errorf(_ string, _ ...any) {} -func (l *testLogger) Errorln(_ ...any) {} -func (l *testLogger) Warn(_ ...any) {} -func (l *testLogger) Warnf(_ string, _ ...any) {} -func (l *testLogger) Warnln(_ ...any) {} -func (l *testLogger) Debug(_ ...any) {} -func (l *testLogger) Debugf(_ string, _ ...any) {} -func (l *testLogger) Debugln(_ ...any) {} -func (l *testLogger) Fatal(_ ...any) {} -func (l *testLogger) Fatalf(_ string, _ ...any) {} -func (l *testLogger) Fatalln(_ ...any) {} -func (l *testLogger) WithFields(_ ...any) log.Logger { return l } -func (l *testLogger) WithDefaultMessageTemplate(_ string) log.Logger { return l } -func (l *testLogger) Sync() error { return nil } +func (l *testLogger) Log(_ context.Context, _ log.Level, _ string, _ ...log.Field) {} +func (l *testLogger) With(_ ...log.Field) log.Logger { return l } +func (l *testLogger) WithGroup(_ string) log.Logger { return l } +func (l *testLogger) Enabled(_ log.Level) bool { return false } +func (l *testLogger) Sync(_ context.Context) error { return nil } // --------------------------------------------------------------------------- // checkAuthorization - subject construction diff --git a/go.mod b/go.mod index 20cbc00..df41dc3 100644 --- a/go.mod +++ b/go.mod @@ -1,38 +1,41 @@ module github.com/LerianStudio/lib-auth/v2 -go 1.25.0 +go 1.25.7 require ( - github.com/LerianStudio/lib-commons/v3 v3.0.0-beta.8 + github.com/LerianStudio/lib-commons/v4 v4.0.0 github.com/gofiber/fiber/v2 v2.52.12 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/stretchr/testify v1.11.1 - go.opentelemetry.io/otel v1.40.0 - google.golang.org/grpc v1.79.1 + go.opentelemetry.io/otel v1.42.0 + google.golang.org/grpc v1.79.2 ) require github.com/google/uuid v1.6.0 // indirect require ( - github.com/Masterminds/squirrel v1.5.4 // 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.7.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.30.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/joho/godotenv v1.5.1 // indirect 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/leodido/go-urn v1.4.0 // 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.20 // indirect + github.com/mattn/go-runewidth v0.0.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/sony/gobreaker v1.0.0 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect @@ -40,21 +43,22 @@ require ( github.com/valyala/fasthttp v1.69.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/bridges/otelzap v0.15.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect - go.opentelemetry.io/otel/log v0.16.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.16.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.17.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect + go.opentelemetry.io/otel/log v0.18.0 // indirect + go.opentelemetry.io/otel/metric v1.42.0 // indirect + go.opentelemetry.io/otel/sdk v1.42.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.18.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect + go.opentelemetry.io/otel/trace v1.42.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect + golang.org/x/crypto v0.48.0 // indirect golang.org/x/net v0.51.0 // indirect golang.org/x/sys v0.41.0 // indirect golang.org/x/text v0.34.0 // indirect diff --git a/go.sum b/go.sum index 3e53a70..000d0ce 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ -github.com/LerianStudio/lib-commons/v3 v3.0.0-beta.8 h1:zH/tQ+I1rUrPUB6wIUY3rJohFrp4CH7rXprMs6+RoPg= -github.com/LerianStudio/lib-commons/v3 v3.0.0-beta.8/go.mod h1:eegTRzYBTMBmXew279htSmBWX0n4syWT9iTDr2ZCwNo= -github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= -github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/LerianStudio/lib-commons/v4 v4.0.0 h1:OEdpRKnbLoOhZoUZyI5FgIe7ZbwJzu/syfgpkDzyi3o= +github.com/LerianStudio/lib-commons/v4 v4.0.0/go.mod h1:WMQ17ouiJ13uUVhH/eY+p++4xb/NOtR44yIMGZ0r8Ow= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= @@ -11,9 +9,10 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= 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= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= +github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= 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= @@ -22,6 +21,14 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= github.com/gofiber/fiber/v2 v2.52.12 h1:0LdToKclcPOj8PktUdIKo9BUohjjwfnQl42Dhw8/WUw= github.com/gofiber/fiber/v2 v2.52.12/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= @@ -42,16 +49,14 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 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.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= -github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w= +github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -59,10 +64,11 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sony/gobreaker v1.0.0 h1:feX5fGGXSl3dYd4aHZItw+FpHLvvoaqkawKjVNiFMNQ= github.com/sony/gobreaker v1.0.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= @@ -80,34 +86,34 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/bridges/otelzap v0.15.0 h1:x4qzjKkTl2hXmLl+IviSXvzaTyCJSYvpFZL5SRVLBxs= -go.opentelemetry.io/contrib/bridges/otelzap v0.15.0/go.mod h1:h7dZHJgqkzUiKFXCTJBrPWH0LEZaZXBFzKWstjWBRxw= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0 h1:ZVg+kCXxd9LtAaQNKBxAvJ5NpMf7LpvEr4MIZqb0TMQ= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.16.0/go.mod h1:hh0tMeZ75CCXrHd9OXRYxTlCAdxcXioWHFIpYw2rZu8= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 h1:NOyNnS19BF2SUDApbOKbDtWZ0IK7b8FJ2uAGdIWOGb0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0/go.mod h1:VL6EgVikRLcJa9ftukrHu/ZkkhFBSo1lzvdBC9CF1ss= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= -go.opentelemetry.io/otel/log v0.16.0 h1:DeuBPqCi6pQwtCK0pO4fvMB5eBq6sNxEnuTs88pjsN4= -go.opentelemetry.io/otel/log v0.16.0/go.mod h1:rWsmqNVTLIA8UnwYVOItjyEZDbKIkMxdQunsIhpUMes= -go.opentelemetry.io/otel/log/logtest v0.16.0 h1:jr1CG3Z6FD9pwUaL/D0s0X4lY2ZVm1jP3JfCtzGxUmE= -go.opentelemetry.io/otel/log/logtest v0.16.0/go.mod h1:qeeZw+cI/rAtCzZ03Kq1ozq6C4z/PCa+K+bb0eJfKNs= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/sdk/log v0.16.0 h1:e/b4bdlQwC5fnGtG3dlXUrNOnP7c8YLVSpSfEBIkTnI= -go.opentelemetry.io/otel/sdk/log v0.16.0/go.mod h1:JKfP3T6ycy7QEuv3Hj8oKDy7KItrEkus8XJE6EoSzw4= -go.opentelemetry.io/otel/sdk/log/logtest v0.16.0 h1:/XVkpZ41rVRTP4DfMgYv1nEtNmf65XPPyAdqV90TMy4= -go.opentelemetry.io/otel/sdk/log/logtest v0.16.0/go.mod h1:iOOPgQr5MY9oac/F5W86mXdeyWZGleIx3uXO98X2R6Y= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/contrib/bridges/otelzap v0.17.0 h1:oCltVHJcblcth2z9B9dRTeZIZTe2Sf9Ad9h8bcc+s8M= +go.opentelemetry.io/contrib/bridges/otelzap v0.17.0/go.mod h1:G/VE1A/hRn6mEWdfC8rMvSdQVGM64KUPi4XilLkwcQw= +go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= +go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= +go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= +go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= +go.opentelemetry.io/otel/log/logtest v0.18.0 h1:2QeyoKJdIgK2LJhG1yn78o/zmpXx1EditeyRDREqVS8= +go.opentelemetry.io/otel/log/logtest v0.18.0/go.mod h1:v1vh3PYR9zIa5MK6HwkH2lMrLBg/Y9Of6Qc+krlesX0= +go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= +go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= +go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= +go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= +go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= +go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0 h1:l3mYuPsuBx6UKE47BVcPrZoZ0q/KER57vbj2qkgDLXA= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0/go.mod h1:7cHtiVJpZebB3wybTa4NG+FUo5NPe3PROz1FqB0+qdw= +go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= +go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= +go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= +go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= 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/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -118,6 +124,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -133,8 +141,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1: google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -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/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= +google.golang.org/grpc v1.79.2/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=