From 5f30b159fa761d903cd4cd1a710d47e3bc805e2a Mon Sep 17 00:00:00 2001 From: manoj Date: Mon, 10 Oct 2022 00:24:14 +0530 Subject: [PATCH] added the couchbase provider template --- Makefile | 4 ++ server/constants/db_types.go | 2 + server/constants/env.go | 4 ++ server/db/db.go | 13 +++- .../db/providers/couchbase/email_template.go | 48 +++++++++++++ server/db/providers/couchbase/env.go | 33 +++++++++ server/db/providers/couchbase/otp.go | 22 ++++++ server/db/providers/couchbase/provider.go | 56 +++++++++++++++ server/db/providers/couchbase/session.go | 25 +++++++ server/db/providers/couchbase/user.go | 71 +++++++++++++++++++ .../couchbase/verification_requests.go | 46 ++++++++++++ server/db/providers/couchbase/webhook.go | 49 +++++++++++++ server/db/providers/couchbase/webhook_log.go | 27 +++++++ server/go.mod | 1 + server/go.sum | 18 +++-- 15 files changed, 413 insertions(+), 6 deletions(-) create mode 100644 server/db/providers/couchbase/email_template.go create mode 100644 server/db/providers/couchbase/env.go create mode 100644 server/db/providers/couchbase/otp.go create mode 100644 server/db/providers/couchbase/provider.go create mode 100644 server/db/providers/couchbase/session.go create mode 100644 server/db/providers/couchbase/user.go create mode 100644 server/db/providers/couchbase/verification_requests.go create mode 100644 server/db/providers/couchbase/webhook.go create mode 100644 server/db/providers/couchbase/webhook_log.go diff --git a/Makefile b/Makefile index ac0a427..fc1e5b9 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,10 @@ test-dynamodb: docker run -d --name dynamodb-local-test -p 8000:8000 amazon/dynamodb-local:latest cd server && go clean --testcache && TEST_DBS="dynamodb" go test -p 1 -v ./test docker rm -vf dynamodb-local-test +test-couchbase: + docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest + cd server && go clean --testcache && TEST_DBS="couchdb" go test -p 1 -v ./test + docker rm -vf couchbase-local-test test-all-db: rm -rf server/test/test.db && rm -rf test.db docker run -d --name authorizer_scylla_db -p 9042:9042 scylladb/scylla diff --git a/server/constants/db_types.go b/server/constants/db_types.go index ead7fc6..041827f 100644 --- a/server/constants/db_types.go +++ b/server/constants/db_types.go @@ -27,4 +27,6 @@ const ( DbTypePlanetScaleDB = "planetscale" // DbTypeDynamoDB is the Dynamo database type DbTypeDynamoDB = "dynamodb" + // DbTypeDynamoDB is the Dynamo database type + DbTypeCouchbaseDB = "couchbase" ) diff --git a/server/constants/env.go b/server/constants/env.go index cc1ddfc..3b0818e 100644 --- a/server/constants/env.go +++ b/server/constants/env.go @@ -27,6 +27,10 @@ const ( EnvAwsAccessKey = "AWS_ACCESS_KEY" // EnvAwsAccessKey key for env variable AWS_SECRET_KEY EnvAwsSecretKey = "AWS_SECRET_KEY" + // EnvAwsAccessKey key for env variable AWS_SECRET_KEY + EnvCouchbaseScope = "COUCHBASE_SCOPE" + // EnvAwsAccessKey key for env variable AWS_SECRET_KEY + EnvCouchbaseBucket = "COUCHBASE_BUCKET" // EnvKeyDatabaseName key for env variable DATABASE_NAME EnvKeyDatabaseName = "DATABASE_NAME" // EnvKeyDatabaseUsername key for env variable DATABASE_USERNAME diff --git a/server/db/db.go b/server/db/db.go index 5230306..3a1c018 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -7,6 +7,7 @@ import ( "github.com/authorizerdev/authorizer/server/db/providers" "github.com/authorizerdev/authorizer/server/db/providers/arangodb" "github.com/authorizerdev/authorizer/server/db/providers/cassandradb" + "github.com/authorizerdev/authorizer/server/db/providers/couchbase" "github.com/authorizerdev/authorizer/server/db/providers/dynamodb" "github.com/authorizerdev/authorizer/server/db/providers/mongodb" "github.com/authorizerdev/authorizer/server/db/providers/sql" @@ -21,11 +22,12 @@ func InitDB() error { envs := memorystore.RequiredEnvStoreObj.GetRequiredEnv() - isSQL := envs.DatabaseType != constants.DbTypeArangodb && envs.DatabaseType != constants.DbTypeMongodb && envs.DatabaseType != constants.DbTypeCassandraDB && envs.DatabaseType != constants.DbTypeScyllaDB && envs.DatabaseType != constants.DbTypeDynamoDB + isSQL := envs.DatabaseType != constants.DbTypeArangodb && envs.DatabaseType != constants.DbTypeMongodb && envs.DatabaseType != constants.DbTypeCassandraDB && envs.DatabaseType != constants.DbTypeScyllaDB && envs.DatabaseType != constants.DbTypeDynamoDB && envs.DatabaseType != constants.DbTypeCouchbaseDB isArangoDB := envs.DatabaseType == constants.DbTypeArangodb isMongoDB := envs.DatabaseType == constants.DbTypeMongodb isCassandra := envs.DatabaseType == constants.DbTypeCassandraDB || envs.DatabaseType == constants.DbTypeScyllaDB isDynamoDB := envs.DatabaseType == constants.DbTypeDynamoDB + isCouchbaseDB := envs.DatabaseType == constants.DbTypeCouchbaseDB if isSQL { log.Info("Initializing SQL Driver for: ", envs.DatabaseType) @@ -72,5 +74,14 @@ func InitDB() error { } } + if isCouchbaseDB { + log.Info("Initializing CouchbaseDB Driver for: ", envs.DatabaseType) + Provider, err = couchbase.NewProvider() + if err != nil { + log.Fatal("Failed to initialize Couchbase driver: ", err) + return err + } + } + return nil } diff --git a/server/db/providers/couchbase/email_template.go b/server/db/providers/couchbase/email_template.go new file mode 100644 index 0000000..714b6be --- /dev/null +++ b/server/db/providers/couchbase/email_template.go @@ -0,0 +1,48 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/google/uuid" +) + +// AddEmailTemplate to add EmailTemplate +func (p *provider) AddEmailTemplate(ctx context.Context, emailTemplate models.EmailTemplate) (*model.EmailTemplate, error) { + if emailTemplate.ID == "" { + emailTemplate.ID = uuid.New().String() + } + + emailTemplate.Key = emailTemplate.ID + emailTemplate.CreatedAt = time.Now().Unix() + emailTemplate.UpdatedAt = time.Now().Unix() + return emailTemplate.AsAPIEmailTemplate(), nil +} + +// UpdateEmailTemplate to update EmailTemplate +func (p *provider) UpdateEmailTemplate(ctx context.Context, emailTemplate models.EmailTemplate) (*model.EmailTemplate, error) { + emailTemplate.UpdatedAt = time.Now().Unix() + return emailTemplate.AsAPIEmailTemplate(), nil +} + +// ListEmailTemplates to list EmailTemplate +func (p *provider) ListEmailTemplate(ctx context.Context, pagination model.Pagination) (*model.EmailTemplates, error) { + return nil, nil +} + +// GetEmailTemplateByID to get EmailTemplate by id +func (p *provider) GetEmailTemplateByID(ctx context.Context, emailTemplateID string) (*model.EmailTemplate, error) { + return nil, nil +} + +// GetEmailTemplateByEventName to get EmailTemplate by event_name +func (p *provider) GetEmailTemplateByEventName(ctx context.Context, eventName string) (*model.EmailTemplate, error) { + return nil, nil +} + +// DeleteEmailTemplate to delete EmailTemplate +func (p *provider) DeleteEmailTemplate(ctx context.Context, emailTemplate *model.EmailTemplate) error { + return nil +} diff --git a/server/db/providers/couchbase/env.go b/server/db/providers/couchbase/env.go new file mode 100644 index 0000000..6bc3f78 --- /dev/null +++ b/server/db/providers/couchbase/env.go @@ -0,0 +1,33 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/google/uuid" +) + +// AddEnv to save environment information in database +func (p *provider) AddEnv(ctx context.Context, env models.Env) (models.Env, error) { + if env.ID == "" { + env.ID = uuid.New().String() + } + + env.CreatedAt = time.Now().Unix() + env.UpdatedAt = time.Now().Unix() + return env, nil +} + +// UpdateEnv to update environment information in database +func (p *provider) UpdateEnv(ctx context.Context, env models.Env) (models.Env, error) { + env.UpdatedAt = time.Now().Unix() + return env, nil +} + +// GetEnv to get environment information from database +func (p *provider) GetEnv(ctx context.Context) (models.Env, error) { + var env models.Env + + return env, nil +} diff --git a/server/db/providers/couchbase/otp.go b/server/db/providers/couchbase/otp.go new file mode 100644 index 0000000..6447ccf --- /dev/null +++ b/server/db/providers/couchbase/otp.go @@ -0,0 +1,22 @@ +package couchbase + +import ( + "context" + + "github.com/authorizerdev/authorizer/server/db/models" +) + +// UpsertOTP to add or update otp +func (p *provider) UpsertOTP(ctx context.Context, otp *models.OTP) (*models.OTP, error) { + return nil, nil +} + +// GetOTPByEmail to get otp for a given email address +func (p *provider) GetOTPByEmail(ctx context.Context, emailAddress string) (*models.OTP, error) { + return nil, nil +} + +// DeleteOTP to delete otp +func (p *provider) DeleteOTP(ctx context.Context, otp *models.OTP) error { + return nil +} diff --git a/server/db/providers/couchbase/provider.go b/server/db/providers/couchbase/provider.go new file mode 100644 index 0000000..d32ba14 --- /dev/null +++ b/server/db/providers/couchbase/provider.go @@ -0,0 +1,56 @@ +package couchbase + +import ( + "context" + "os" + "reflect" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/memorystore" + "github.com/couchbase/gocb/v2" +) + +// TODO change following provider to new db provider +type provider struct { + db *gocb.Bucket +} + +// NewProvider returns a new SQL provider +// TODO change following provider to new db provider +func NewProvider() (*provider, error) { + scopeName := os.Getenv(constants.EnvCouchbaseScope) + bucketName := os.Getenv(constants.EnvCouchbaseBucket) + dbURL := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseURL + userName := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabaseUsername + password := memorystore.RequiredEnvStoreObj.GetRequiredEnv().DatabasePassword + + opts := gocb.ClusterOptions{ + Username: userName, + Password: password, + } + + cluster, err := gocb.Connect(dbURL, opts) + if err != nil { + return nil, err + } + + bucket := cluster.Bucket(bucketName) + + v := reflect.ValueOf(models.Collections) + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + user := gocb.CollectionSpec{ + Name: field.String(), + ScopeName: scopeName, + } + collectionOpts := gocb.CreateCollectionOptions{ + Context: context.TODO(), + } + bucket.Collections().CreateCollection(user, &collectionOpts) + } + // bucket.Collection(models.Collections.User).Insert() + return &provider{ + db: bucket, + }, nil +} diff --git a/server/db/providers/couchbase/session.go b/server/db/providers/couchbase/session.go new file mode 100644 index 0000000..ea150a6 --- /dev/null +++ b/server/db/providers/couchbase/session.go @@ -0,0 +1,25 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/google/uuid" +) + +// AddSession to save session information in database +func (p *provider) AddSession(ctx context.Context, session models.Session) error { + if session.ID == "" { + session.ID = uuid.New().String() + } + + session.CreatedAt = time.Now().Unix() + session.UpdatedAt = time.Now().Unix() + return nil +} + +// DeleteSession to delete session information from database +func (p *provider) DeleteSession(ctx context.Context, userId string) error { + return nil +} diff --git a/server/db/providers/couchbase/user.go b/server/db/providers/couchbase/user.go new file mode 100644 index 0000000..67c4395 --- /dev/null +++ b/server/db/providers/couchbase/user.go @@ -0,0 +1,71 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/constants" + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/authorizerdev/authorizer/server/memorystore" + "github.com/google/uuid" +) + +// AddUser to save user information in database +func (p *provider) AddUser(ctx context.Context, user models.User) (models.User, error) { + if user.ID == "" { + user.ID = uuid.New().String() + } + + if user.Roles == "" { + defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles) + if err != nil { + return user, err + } + user.Roles = defaultRoles + } + + user.CreatedAt = time.Now().Unix() + user.UpdatedAt = time.Now().Unix() + + return user, nil +} + +// UpdateUser to update user information in database +func (p *provider) UpdateUser(ctx context.Context, user models.User) (models.User, error) { + user.UpdatedAt = time.Now().Unix() + return user, nil +} + +// DeleteUser to delete user information from database +func (p *provider) DeleteUser(ctx context.Context, user models.User) error { + return nil +} + +// ListUsers to get list of users from database +func (p *provider) ListUsers(ctx context.Context, pagination model.Pagination) (*model.Users, error) { + return nil, nil +} + +// GetUserByEmail to get user information from database using email address +func (p *provider) GetUserByEmail(ctx context.Context, email string) (models.User, error) { + var user models.User + + return user, nil +} + +// GetUserByID to get user information from database using user ID +func (p *provider) GetUserByID(ctx context.Context, id string) (models.User, error) { + var user models.User + + return user, nil +} + +// UpdateUsers to update multiple users, with parameters of user IDs slice +// If ids set to nil / empty all the users will be updated +func (p *provider) UpdateUsers(ctx context.Context, data map[string]interface{}, ids []string) error { + // set updated_at time for all users + data["updated_at"] = time.Now().Unix() + + return nil +} diff --git a/server/db/providers/couchbase/verification_requests.go b/server/db/providers/couchbase/verification_requests.go new file mode 100644 index 0000000..9692f79 --- /dev/null +++ b/server/db/providers/couchbase/verification_requests.go @@ -0,0 +1,46 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/google/uuid" +) + +// AddVerification to save verification request in database +func (p *provider) AddVerificationRequest(ctx context.Context, verificationRequest models.VerificationRequest) (models.VerificationRequest, error) { + if verificationRequest.ID == "" { + verificationRequest.ID = uuid.New().String() + } + + verificationRequest.CreatedAt = time.Now().Unix() + verificationRequest.UpdatedAt = time.Now().Unix() + + return verificationRequest, nil +} + +// GetVerificationRequestByToken to get verification request from database using token +func (p *provider) GetVerificationRequestByToken(ctx context.Context, token string) (models.VerificationRequest, error) { + var verificationRequest models.VerificationRequest + + return verificationRequest, nil +} + +// GetVerificationRequestByEmail to get verification request by email from database +func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email string, identifier string) (models.VerificationRequest, error) { + var verificationRequest models.VerificationRequest + + return verificationRequest, nil +} + +// ListVerificationRequests to get list of verification requests from database +func (p *provider) ListVerificationRequests(ctx context.Context, pagination model.Pagination) (*model.VerificationRequests, error) { + return nil, nil +} + +// DeleteVerificationRequest to delete verification request from database +func (p *provider) DeleteVerificationRequest(ctx context.Context, verificationRequest models.VerificationRequest) error { + return nil +} diff --git a/server/db/providers/couchbase/webhook.go b/server/db/providers/couchbase/webhook.go new file mode 100644 index 0000000..957012c --- /dev/null +++ b/server/db/providers/couchbase/webhook.go @@ -0,0 +1,49 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/google/uuid" +) + +// AddWebhook to add webhook +func (p *provider) AddWebhook(ctx context.Context, webhook models.Webhook) (*model.Webhook, error) { + if webhook.ID == "" { + webhook.ID = uuid.New().String() + } + + webhook.Key = webhook.ID + webhook.CreatedAt = time.Now().Unix() + webhook.UpdatedAt = time.Now().Unix() + return webhook.AsAPIWebhook(), nil +} + +// UpdateWebhook to update webhook +func (p *provider) UpdateWebhook(ctx context.Context, webhook models.Webhook) (*model.Webhook, error) { + webhook.UpdatedAt = time.Now().Unix() + return webhook.AsAPIWebhook(), nil +} + +// ListWebhooks to list webhook +func (p *provider) ListWebhook(ctx context.Context, pagination model.Pagination) (*model.Webhooks, error) { + return nil, nil +} + +// GetWebhookByID to get webhook by id +func (p *provider) GetWebhookByID(ctx context.Context, webhookID string) (*model.Webhook, error) { + return nil, nil +} + +// GetWebhookByEventName to get webhook by event_name +func (p *provider) GetWebhookByEventName(ctx context.Context, eventName string) (*model.Webhook, error) { + return nil, nil +} + +// DeleteWebhook to delete webhook +func (p *provider) DeleteWebhook(ctx context.Context, webhook *model.Webhook) error { + // Also delete webhook logs for given webhook id + return nil +} diff --git a/server/db/providers/couchbase/webhook_log.go b/server/db/providers/couchbase/webhook_log.go new file mode 100644 index 0000000..7080db1 --- /dev/null +++ b/server/db/providers/couchbase/webhook_log.go @@ -0,0 +1,27 @@ +package couchbase + +import ( + "context" + "time" + + "github.com/authorizerdev/authorizer/server/db/models" + "github.com/authorizerdev/authorizer/server/graph/model" + "github.com/google/uuid" +) + +// AddWebhookLog to add webhook log +func (p *provider) AddWebhookLog(ctx context.Context, webhookLog models.WebhookLog) (*model.WebhookLog, error) { + if webhookLog.ID == "" { + webhookLog.ID = uuid.New().String() + } + + webhookLog.Key = webhookLog.ID + webhookLog.CreatedAt = time.Now().Unix() + webhookLog.UpdatedAt = time.Now().Unix() + return webhookLog.AsAPIWebhookLog(), nil +} + +// ListWebhookLogs to list webhook logs +func (p *provider) ListWebhookLogs(ctx context.Context, pagination model.Pagination, webhookID string) (*model.WebhookLogs, error) { + return nil, nil +} diff --git a/server/go.mod b/server/go.mod index 19cf4a7..6d38e0b 100644 --- a/server/go.mod +++ b/server/go.mod @@ -7,6 +7,7 @@ require ( github.com/arangodb/go-driver v1.2.1 github.com/aws/aws-sdk-go v1.44.109 github.com/coreos/go-oidc/v3 v3.1.0 + github.com/couchbase/gocb/v2 v2.5.3 // indirect github.com/gin-gonic/gin v1.8.1 github.com/go-playground/validator/v10 v10.11.1 // indirect github.com/go-redis/redis/v8 v8.11.0 diff --git a/server/go.sum b/server/go.sum index 8f3f5c2..8078544 100644 --- a/server/go.sum +++ b/server/go.sum @@ -73,6 +73,11 @@ github.com/coreos/go-oidc/v3 v3.1.0 h1:6avEvcdvTa1qYsOZ6I5PRkSYHzpTNWgKYmaJfaYbr github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/couchbase/gocb/v2 v2.5.3 h1:Av1CdgqAcroF+3fQ2q3UrPST2T+v8vj81UcNdOSpsnw= +github.com/couchbase/gocb/v2 v2.5.3/go.mod h1:vXZeeZV6Kt2PSriPNenGjsiP4mnyN1TYw6B80cQ5QiQ= +github.com/couchbase/gocbcore/v10 v10.1.5 h1:5BTbWYL/Iz00OLq7ohsYT2ONuiaGAkD/qhn2nZOfBxY= +github.com/couchbase/gocbcore/v10 v10.1.5/go.mod h1:qkPnOBziCs0guMEEvd0cRFo+AjOW0yEL99cU3I4n3Ao= +github.com/couchbaselabs/gocaves/client v0.0.0-20220223122017-22859b310bd2/go.mod h1:AVekAZwIY2stsJOMWLAS/0uA/+qdp7pjO8EHnl61QkY= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -161,6 +166,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -353,6 +360,7 @@ github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic 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.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -492,12 +500,12 @@ golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b h1:uKO3Js8lXGjpjdc4J3rqs0/Ex5yDKUGfk43tTYWVLas= -golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b h1:uKO3Js8lXGjpjdc4J3rqs0/Ex5yDKUGfk43tTYWVLas= +golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -561,14 +569,14 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=