From 5bcdbf5d23a36b571dad8109a25f45406552b558 Mon Sep 17 00:00:00 2001 From: Myles <96409608+ice-myles@users.noreply.github.com> Date: Wed, 22 May 2024 18:43:44 +0300 Subject: [PATCH] Simplified email registration (#132) --- .golangci.yml | 2 + auth/email_link/DDL.sql | 1 - auth/email_link/contract.go | 14 +- auth/email_link/email_modify.go | 6 +- auth/email_link/emaillink.go | 2 +- auth/email_link/link_start_auth.go | 79 +++----- auth/email_link/link_verify.go | 141 ++++++++----- auth/email_link/status.go | 71 ------- .../translations/email/modify_email/az.html | 8 - .../translations/email/modify_email/az.txt | 3 - .../translations/email/modify_email/bn.html | 8 - .../translations/email/modify_email/bn.txt | 3 - .../translations/email/modify_email/de.html | 8 - .../translations/email/modify_email/de.txt | 3 - .../translations/email/modify_email/en.html | 3 +- .../translations/email/modify_email/gu.html | 8 - .../translations/email/modify_email/gu.txt | 3 - .../translations/email/modify_email/hi.html | 8 - .../translations/email/modify_email/hi.txt | 3 - .../translations/email/modify_email/id.html | 8 - .../translations/email/modify_email/id.txt | 3 - .../translations/email/modify_email/it.html | 8 - .../translations/email/modify_email/it.txt | 3 - .../translations/email/modify_email/mr.html | 8 - .../translations/email/modify_email/mr.txt | 3 - .../translations/email/modify_email/pl.html | 8 - .../translations/email/modify_email/pl.txt | 3 - .../translations/email/modify_email/th.html | 8 - .../translations/email/modify_email/th.txt | 3 - .../translations/email/modify_email/vi.html | 8 - .../translations/email/modify_email/vi.txt | 3 - .../translations/email/modify_email/zh.html | 8 - .../translations/email/modify_email/zh.txt | 3 - .../translations/email/notify_changed/az.html | 8 - .../translations/email/notify_changed/az.txt | 3 - .../translations/email/notify_changed/bn.html | 8 - .../translations/email/notify_changed/bn.txt | 3 - .../translations/email/notify_changed/de.html | 8 - .../translations/email/notify_changed/de.txt | 3 - .../translations/email/notify_changed/gu.html | 8 - .../translations/email/notify_changed/gu.txt | 3 - .../translations/email/notify_changed/hi.html | 8 - .../translations/email/notify_changed/hi.txt | 3 - .../translations/email/notify_changed/id.html | 8 - .../translations/email/notify_changed/id.txt | 3 - .../translations/email/notify_changed/it.html | 8 - .../translations/email/notify_changed/it.txt | 3 - .../translations/email/notify_changed/mr.html | 8 - .../translations/email/notify_changed/mr.txt | 3 - .../translations/email/notify_changed/pl.html | 8 - .../translations/email/notify_changed/pl.txt | 3 - .../translations/email/notify_changed/th.html | 8 - .../translations/email/notify_changed/th.txt | 3 - .../translations/email/notify_changed/vi.html | 8 - .../translations/email/notify_changed/vi.txt | 3 - .../translations/email/notify_changed/zh.html | 8 - .../translations/email/notify_changed/zh.txt | 3 - .../translations/email/signin/az.html | 9 - .../translations/email/signin/az.txt | 3 - .../translations/email/signin/bn.html | 9 - .../translations/email/signin/bn.txt | 3 - .../translations/email/signin/de.html | 9 - .../translations/email/signin/de.txt | 3 - .../translations/email/signin/en.html | 4 +- .../translations/email/signin/gu.html | 9 - .../translations/email/signin/gu.txt | 3 - .../translations/email/signin/hi.html | 9 - .../translations/email/signin/hi.txt | 3 - .../translations/email/signin/id.html | 9 - .../translations/email/signin/id.txt | 3 - .../translations/email/signin/it.html | 9 - .../translations/email/signin/it.txt | 3 - .../translations/email/signin/mr.html | 9 - .../translations/email/signin/mr.txt | 3 - .../translations/email/signin/pl.html | 12 -- .../translations/email/signin/pl.txt | 3 - .../translations/email/signin/th.html | 9 - .../translations/email/signin/th.txt | 3 - .../translations/email/signin/vi.html | 9 - .../translations/email/signin/vi.txt | 3 - .../translations/email/signin/zh.html | 9 - .../translations/email/signin/zh.txt | 3 - auth/email_link/users.go | 21 -- cmd/eskimo-hut/api/docs.go | 82 +------- cmd/eskimo-hut/api/swagger.json | 82 +------- cmd/eskimo-hut/api/swagger.yaml | 57 +----- cmd/eskimo-hut/auth.go | 81 ++------ cmd/eskimo-hut/contract.go | 12 +- cmd/eskimo-hut/users.go | 2 +- cmd/fixture/fixture.go | 1 + ...rebase_phone_login_with_ice_email_login.go | 2 +- go.mod | 93 ++++----- go.sum | 188 +++++++++--------- 93 files changed, 322 insertions(+), 1033 deletions(-) delete mode 100644 auth/email_link/status.go delete mode 100644 auth/email_link/translations/email/modify_email/az.html delete mode 100644 auth/email_link/translations/email/modify_email/az.txt delete mode 100644 auth/email_link/translations/email/modify_email/bn.html delete mode 100644 auth/email_link/translations/email/modify_email/bn.txt delete mode 100644 auth/email_link/translations/email/modify_email/de.html delete mode 100644 auth/email_link/translations/email/modify_email/de.txt delete mode 100644 auth/email_link/translations/email/modify_email/gu.html delete mode 100644 auth/email_link/translations/email/modify_email/gu.txt delete mode 100644 auth/email_link/translations/email/modify_email/hi.html delete mode 100644 auth/email_link/translations/email/modify_email/hi.txt delete mode 100644 auth/email_link/translations/email/modify_email/id.html delete mode 100644 auth/email_link/translations/email/modify_email/id.txt delete mode 100644 auth/email_link/translations/email/modify_email/it.html delete mode 100644 auth/email_link/translations/email/modify_email/it.txt delete mode 100644 auth/email_link/translations/email/modify_email/mr.html delete mode 100644 auth/email_link/translations/email/modify_email/mr.txt delete mode 100644 auth/email_link/translations/email/modify_email/pl.html delete mode 100644 auth/email_link/translations/email/modify_email/pl.txt delete mode 100644 auth/email_link/translations/email/modify_email/th.html delete mode 100644 auth/email_link/translations/email/modify_email/th.txt delete mode 100644 auth/email_link/translations/email/modify_email/vi.html delete mode 100644 auth/email_link/translations/email/modify_email/vi.txt delete mode 100644 auth/email_link/translations/email/modify_email/zh.html delete mode 100644 auth/email_link/translations/email/modify_email/zh.txt delete mode 100644 auth/email_link/translations/email/notify_changed/az.html delete mode 100644 auth/email_link/translations/email/notify_changed/az.txt delete mode 100644 auth/email_link/translations/email/notify_changed/bn.html delete mode 100644 auth/email_link/translations/email/notify_changed/bn.txt delete mode 100644 auth/email_link/translations/email/notify_changed/de.html delete mode 100644 auth/email_link/translations/email/notify_changed/de.txt delete mode 100644 auth/email_link/translations/email/notify_changed/gu.html delete mode 100644 auth/email_link/translations/email/notify_changed/gu.txt delete mode 100644 auth/email_link/translations/email/notify_changed/hi.html delete mode 100644 auth/email_link/translations/email/notify_changed/hi.txt delete mode 100644 auth/email_link/translations/email/notify_changed/id.html delete mode 100644 auth/email_link/translations/email/notify_changed/id.txt delete mode 100644 auth/email_link/translations/email/notify_changed/it.html delete mode 100644 auth/email_link/translations/email/notify_changed/it.txt delete mode 100644 auth/email_link/translations/email/notify_changed/mr.html delete mode 100644 auth/email_link/translations/email/notify_changed/mr.txt delete mode 100644 auth/email_link/translations/email/notify_changed/pl.html delete mode 100644 auth/email_link/translations/email/notify_changed/pl.txt delete mode 100644 auth/email_link/translations/email/notify_changed/th.html delete mode 100644 auth/email_link/translations/email/notify_changed/th.txt delete mode 100644 auth/email_link/translations/email/notify_changed/vi.html delete mode 100644 auth/email_link/translations/email/notify_changed/vi.txt delete mode 100644 auth/email_link/translations/email/notify_changed/zh.html delete mode 100644 auth/email_link/translations/email/notify_changed/zh.txt delete mode 100644 auth/email_link/translations/email/signin/az.html delete mode 100644 auth/email_link/translations/email/signin/az.txt delete mode 100644 auth/email_link/translations/email/signin/bn.html delete mode 100644 auth/email_link/translations/email/signin/bn.txt delete mode 100644 auth/email_link/translations/email/signin/de.html delete mode 100644 auth/email_link/translations/email/signin/de.txt delete mode 100644 auth/email_link/translations/email/signin/gu.html delete mode 100644 auth/email_link/translations/email/signin/gu.txt delete mode 100644 auth/email_link/translations/email/signin/hi.html delete mode 100644 auth/email_link/translations/email/signin/hi.txt delete mode 100644 auth/email_link/translations/email/signin/id.html delete mode 100644 auth/email_link/translations/email/signin/id.txt delete mode 100644 auth/email_link/translations/email/signin/it.html delete mode 100644 auth/email_link/translations/email/signin/it.txt delete mode 100644 auth/email_link/translations/email/signin/mr.html delete mode 100644 auth/email_link/translations/email/signin/mr.txt delete mode 100644 auth/email_link/translations/email/signin/pl.html delete mode 100644 auth/email_link/translations/email/signin/pl.txt delete mode 100644 auth/email_link/translations/email/signin/th.html delete mode 100644 auth/email_link/translations/email/signin/th.txt delete mode 100644 auth/email_link/translations/email/signin/vi.html delete mode 100644 auth/email_link/translations/email/signin/vi.txt delete mode 100644 auth/email_link/translations/email/signin/zh.html delete mode 100644 auth/email_link/translations/email/signin/zh.txt diff --git a/.golangci.yml b/.golangci.yml index 9f04e36f..75d5e75f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -517,6 +517,8 @@ linters-settings: linters: disable: + # Non adequate behaviour at 1.58 version. + - mnd - tagalign # TODO remove asap! - gomoddirectives diff --git a/auth/email_link/DDL.sql b/auth/email_link/DDL.sql index 4fe958a0..099b70d1 100644 --- a/auth/email_link/DDL.sql +++ b/auth/email_link/DDL.sql @@ -9,7 +9,6 @@ CREATE TABLE IF NOT EXISTS email_link_sign_ins ( previously_issued_token_seq BIGINT DEFAULT 0 NOT NULL, confirmation_code_wrong_attempts_count BIGINT DEFAULT 0 NOT NULL, email TEXT NOT NULL, - otp TEXT NOT NULL, confirmation_code TEXT, user_id TEXT, phone_number_to_email_migration_user_id TEXT, diff --git a/auth/email_link/contract.go b/auth/email_link/contract.go index c75b3dba..61680ec6 100644 --- a/auth/email_link/contract.go +++ b/auth/email_link/contract.go @@ -29,9 +29,8 @@ type ( Client interface { IceUserIDClient SendSignInLinkToEmail(ctx context.Context, emailValue, deviceUniqueID, language, clientIP string) (loginSession string, err error) - SignIn(ctx context.Context, emailLinkPayload, confirmationCode string) error + SignIn(ctx context.Context, loginFlowToken, confirmationCode string) (tokens *Tokens, emailConfirmed bool, err error) RegenerateTokens(ctx context.Context, prevToken string) (tokens *Tokens, err error) - Status(ctx context.Context, loginSession string) (tokens *Tokens, emailConfirmed bool, err error) UpdateMetadata(ctx context.Context, userID string, metadata *users.JSON) (*users.JSON, error) } IceUserIDClient interface { @@ -120,18 +119,12 @@ type ( Email string `json:"email,omitempty" example:"someone1@example.com"` DeviceUniqueID string `json:"deviceUniqueId,omitempty" example:"6FB988F3-36F4-433D-9C7C-555887E57EB2" db:"device_unique_id"` } - magicLinkToken struct { - *jwt.RegisteredClaims - OTP string `json:"otp" example:"c8f64979-9cea-4649-a89a-35607e734e68"` - OldEmail string `json:"oldEmail,omitempty"` - NotifyEmail string `json:"notifyEmail,omitempty"` - DeviceUniqueID string `json:"deviceUniqueId,omitempty"` - } loginFlowToken struct { *jwt.RegisteredClaims DeviceUniqueID string `json:"deviceUniqueId,omitempty"` - ConfirmationCode string `json:"confirmationCode,omitempty"` ClientIP string `json:"clientIP,omitempty"` //nolint:tagliatelle //. + OldEmail string `json:"oldEmail,omitempty"` + NotifyEmail string `json:"notifyEmail,omitempty"` LoginSessionNumber int64 `json:"loginSessionNumber,omitempty"` } emailLinkSignIn struct { @@ -143,7 +136,6 @@ type ( UserID *string `json:"userId" example:"did:ethr:0x4B73C58370AEfcEf86A6021afCDe5673511376B2"` PhoneNumberToEmailMigrationUserID *string `json:"-" example:"did:ethr:0x4B73C58370AEfcEf86A6021afCDe5673511376B2"` Email string `json:"email,omitempty" example:"someone1@example.com"` - OTP string `json:"otp,omitempty" example:"207d0262-2554-4df9-b954-08cb42718b25"` Language string `json:"language,omitempty" example:"en"` DeviceUniqueID string `json:"deviceUniqueId,omitempty" example:"6FB988F3-36F4-433D-9C7C-555887E57EB2" db:"device_unique_id"` ConfirmationCode string `json:"confirmationCode,omitempty" example:"123"` diff --git a/auth/email_link/email_modify.go b/auth/email_link/email_modify.go index 00f2ebf6..b9a07863 100644 --- a/auth/email_link/email_modify.go +++ b/auth/email_link/email_modify.go @@ -41,9 +41,9 @@ func (c *client) handleEmailModification(ctx context.Context, els *emailLinkSign } } if notifyEmail != "" { - resetEmailOTP, now := generateOTP(), time.Now() + now := time.Now() resetConfirmationCode := generateConfirmationCode() - uErr := c.upsertEmailLinkSignIn(ctx, oldEmail, els.DeviceUniqueID, resetEmailOTP, resetConfirmationCode, now) + uErr := c.upsertEmailLinkSignIn(ctx, oldEmail, els.DeviceUniqueID, resetConfirmationCode, now) if uErr != nil { return multierror.Append( //nolint:wrapcheck // . errors.Wrapf(c.resetEmailModification(ctx, usr.ID, oldEmail), "[reset] resetEmailModification failed for email:%v", oldEmail), @@ -53,7 +53,7 @@ func (c *client) handleEmailModification(ctx context.Context, els *emailLinkSign } resetEmailPayload, rErr := c.generateMagicLinkPayload( &loginID{Email: oldEmail, DeviceUniqueID: els.DeviceUniqueID}, - newEmail, "", resetEmailOTP, now) + newEmail, now) if rErr != nil { return multierror.Append( //nolint:wrapcheck // . errors.Wrapf(c.resetEmailModification(ctx, usr.ID, oldEmail), "[reset] resetEmailModification failed for email:%v", oldEmail), diff --git a/auth/email_link/emaillink.go b/auth/email_link/emaillink.go index 72a9c8dd..36de71b9 100644 --- a/auth/email_link/emaillink.go +++ b/auth/email_link/emaillink.go @@ -235,7 +235,7 @@ func (c *client) deleteOldLoginAttempts(ctx context.Context) error { } func (c *client) startOldLoginAttemptsCleaner(ctx context.Context) { - ticker := stdlibtime.NewTicker(stdlibtime.Duration(1+rand.Intn(24)) * stdlibtime.Minute) //nolint:gosec,gomnd // Not an issue. + ticker := stdlibtime.NewTicker(stdlibtime.Duration(1+rand.Intn(24)) * stdlibtime.Minute) //nolint:gosec,gomnd,mnd // Not an issue. defer ticker.Stop() for { diff --git a/auth/email_link/link_start_auth.go b/auth/email_link/link_start_auth.go index 02ee219b..3ff73116 100644 --- a/auth/email_link/link_start_auth.go +++ b/auth/email_link/link_start_auth.go @@ -10,7 +10,6 @@ import ( stdlibtime "time" "github.com/golang-jwt/jwt/v5" - "github.com/google/uuid" "github.com/hashicorp/go-multierror" "github.com/pkg/errors" @@ -42,9 +41,8 @@ func (c *client) SendSignInLinkToEmail(ctx context.Context, emailValue, deviceUn return "", errors.Wrapf(vErr, "can't validate modification email for:%#v", oldID) } } - otp := generateOTP() confirmationCode := generateConfirmationCode() - loginSession, err = c.generateLoginSession(&id, confirmationCode, clientIP, loginSessionNumber) + loginSession, err = c.generateLoginSession(&id, clientIP, oldEmail, loginSessionNumber) if err != nil { return "", errors.Wrap(err, "can't call generateLoginSession") } @@ -53,9 +51,9 @@ func (c *client) SendSignInLinkToEmail(ctx context.Context, emailValue, deviceUn return "", errors.Wrapf(ipErr, "failed increment login attempts for IP:%v (session num %v)", clientIP, loginSessionNumber) } } - if uErr := c.upsertEmailLinkSignIn(ctx, id.Email, id.DeviceUniqueID, otp, confirmationCode, now); uErr != nil { + if uErr := c.upsertEmailLinkSignIn(ctx, id.Email, id.DeviceUniqueID, confirmationCode, now); uErr != nil { if errors.Is(uErr, ErrUserDuplicate) { - oldLoginSession, oErr := c.restoreOldLoginSession(ctx, &id, clientIP, loginSessionNumber) + oldLoginSession, oErr := c.restoreOldLoginSession(ctx, &id, clientIP, oldEmail, loginSessionNumber) if oErr != nil { return "", multierror.Append( //nolint:wrapcheck // . errors.Wrapf(oErr, "failed to calculate oldLoginSession"), @@ -71,14 +69,7 @@ func (c *client) SendSignInLinkToEmail(ctx context.Context, emailValue, deviceUn errors.Wrapf(uErr, "failed to store/update email link sign ins for id:%#v", id), ).ErrorOrNil() } - payload, pErr := c.generateMagicLinkPayload(&id, oldEmail, oldEmail, otp, now) - if pErr != nil { - return "", multierror.Append( //nolint:wrapcheck // . - errors.Wrapf(c.decrementIPLoginAttempts(ctx, clientIP, loginSessionNumber), "[rollback] failed to rollback login attempts for ip"), - errors.Wrapf(pErr, "can't generate magic link payload for id: %#v", id), - ).ErrorOrNil() - } - if sErr := c.sendMagicLink(ctx, &id, oldEmail, payload, language); sErr != nil { + if sErr := c.sendConfirmationCode(ctx, &id, oldEmail, confirmationCode, language); sErr != nil { return "", multierror.Append( //nolint:wrapcheck // . errors.Wrapf(c.decrementIPLoginAttempts(ctx, clientIP, loginSessionNumber), "[rollback] failed to rollback login attempts for ip"), errors.Wrapf(sErr, "can't send magic link for id:%#v", id), @@ -88,15 +79,8 @@ func (c *client) SendSignInLinkToEmail(ctx context.Context, emailValue, deviceUn return loginSession, nil } -func (c *client) restoreOldLoginSession(ctx context.Context, id *loginID, clientIP string, loginSessionNumber int64) (string, error) { - existingSignIn, dErr := c.getEmailLinkSignIn(ctx, id, true) - if dErr != nil { - return "", multierror.Append( //nolint:wrapcheck // . - errors.Wrapf(c.decrementIPLoginAttempts(ctx, clientIP, loginSessionNumber), "[rollback] failed to rollback login attempts for ip"), - errors.Wrapf(dErr, "can't get email link sign in information by:%#v", id), - ).ErrorOrNil() - } - oldLoginSession, dErr := c.generateLoginSession(id, existingSignIn.ConfirmationCode, clientIP, loginSessionNumber) +func (c *client) restoreOldLoginSession(ctx context.Context, id *loginID, clientIP, oldEmail string, loginSessionNumber int64) (string, error) { + oldLoginSession, dErr := c.generateLoginSession(id, clientIP, oldEmail, loginSessionNumber) if dErr != nil { return "", multierror.Append( //nolint:wrapcheck // . errors.Wrapf(c.decrementIPLoginAttempts(ctx, clientIP, loginSessionNumber), "[rollback] failed to rollback login attempts for ip"), @@ -164,8 +148,7 @@ func (c *client) validateEmailModification(ctx context.Context, newEmail string, return nil } -func (c *client) sendMagicLink(ctx context.Context, id *loginID, oldEmail, payload, language string) error { - authLink := c.getAuthLink(payload, language) +func (c *client) sendConfirmationCode(ctx context.Context, id *loginID, oldEmail, confirmationCode, language string) error { var emailType string if oldEmail != "" { emailType = modifyEmailType @@ -173,21 +156,21 @@ func (c *client) sendMagicLink(ctx context.Context, id *loginID, oldEmail, paylo emailType = signInEmailType } - return errors.Wrapf(c.sendEmailWithType(ctx, emailType, id.Email, language, authLink), "failed to send validation email for id:%#v", id) + return errors.Wrapf(c.sendEmailWithType(ctx, emailType, id.Email, language, confirmationCode), "failed to send validation email for id:%#v", id) } -func (c *client) sendEmailWithType(ctx context.Context, emailType, toEmail, language, link string) error { +func (c *client) sendEmailWithType(ctx context.Context, emailType, toEmail, language, confirmationCode string) error { var tmpl *emailTemplate tmpl, ok := allEmailLinkTemplates[emailType][language] if !ok { tmpl = allEmailLinkTemplates[emailType][defaultLanguage] } data := struct { - Email string - Link string + Email string + ConfirmationCode string }{ - Email: toEmail, - Link: link, + Email: toEmail, + ConfirmationCode: confirmationCode, } return errors.Wrapf(c.emailClient.Send(ctx, &email.Parcel{ @@ -206,30 +189,27 @@ func (c *client) sendEmailWithType(ctx context.Context, emailType, toEmail, lang }), "failed to send email with type:%v for user with email:%v", emailType, toEmail) } -//nolint:revive,lll // . -func (c *client) upsertEmailLinkSignIn(ctx context.Context, toEmail, deviceUniqueID, otp, code string, now *time.Time) error { +//nolint:lll // . +func (c *client) upsertEmailLinkSignIn(ctx context.Context, toEmail, deviceUniqueID, code string, now *time.Time) error { confirmationCodeWrongAttempts := 0 - params := []any{now.Time, toEmail, deviceUniqueID, otp, code, confirmationCodeWrongAttempts, userIDForPhoneNumberToEmailMigration(ctx)} + params := []any{now.Time, toEmail, deviceUniqueID, code, confirmationCodeWrongAttempts, userIDForPhoneNumberToEmailMigration(ctx)} sql := fmt.Sprintf(`INSERT INTO email_link_sign_ins ( created_at, email, device_unique_id, - otp, confirmation_code, confirmation_code_wrong_attempts_count, phone_number_to_email_migration_user_id) - VALUES ($1, $2, $3, $4, $5, $6, NULLIF($7,'')) + VALUES ($1, $2, $3, $4, $5, NULLIF($6,'')) ON CONFLICT (email, device_unique_id) DO UPDATE - SET otp = EXCLUDED.otp, - created_at = EXCLUDED.created_at, + SET created_at = EXCLUDED.created_at, confirmation_code = EXCLUDED.confirmation_code, confirmation_code_wrong_attempts_count = EXCLUDED.confirmation_code_wrong_attempts_count, phone_number_to_email_migration_user_id = COALESCE(NULLIF(EXCLUDED.phone_number_to_email_migration_user_id,''),email_link_sign_ins.phone_number_to_email_migration_user_id), email_confirmed_at = null, user_id = null WHERE (extract(epoch from email_link_sign_ins.created_at)::bigint/%[1]v) != (extract(epoch from EXCLUDED.created_at::timestamp)::bigint/%[1]v) - AND (email_link_sign_ins.otp != EXCLUDED.otp - OR email_link_sign_ins.confirmation_code != EXCLUDED.confirmation_code + AND (email_link_sign_ins.confirmation_code != EXCLUDED.confirmation_code OR email_link_sign_ins.confirmation_code_wrong_attempts_count != EXCLUDED.confirmation_code_wrong_attempts_count)`, uint64(duplicatedSignInRequestsInLessThan/stdlibtime.Second)) rowsInserted, err := storage.Exec(ctx, c.db, sql, params...) @@ -259,8 +239,8 @@ func (c *client) upsertIPLoginAttempt(ctx context.Context, id *loginID, clientIP return nil } -func (c *client) generateMagicLinkPayload(id *loginID, oldEmail, notifyEmail, otp string, now *time.Time) (string, error) { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, magicLinkToken{ +func (c *client) generateMagicLinkPayload(id *loginID, oldEmail string, now *time.Time) (string, error) { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, loginFlowToken{ RegisteredClaims: &jwt.RegisteredClaims{ Issuer: jwtIssuer, Subject: id.Email, @@ -269,24 +249,18 @@ func (c *client) generateMagicLinkPayload(id *loginID, oldEmail, notifyEmail, ot NotBefore: jwt.NewNumericDate(*now.Time), IssuedAt: jwt.NewNumericDate(*now.Time), }, - OTP: otp, OldEmail: oldEmail, - NotifyEmail: notifyEmail, DeviceUniqueID: id.DeviceUniqueID, }) payload, err := token.SignedString([]byte(c.cfg.EmailValidation.JwtSecret)) if err != nil { - return "", errors.Wrapf(err, "can't generate link payload for id:%#v,otp:%v,now:%v", id, otp, now) + return "", errors.Wrapf(err, "can't generate link payload for id:%#v,now:%v", id, now) } return payload, nil } -func (c *client) getAuthLink(token, language string) string { - return fmt.Sprintf("%s?token=%s&lang=%s", c.cfg.EmailValidation.AuthLink, token, language) -} - -func (c *client) generateLoginSession(id *loginID, confirmationCode, clientIP string, loginSessionNumber int64) (string, error) { +func (c *client) generateLoginSession(id *loginID, clientIP, oldEmail string, loginSessionNumber int64) (string, error) { now := time.Now() token := jwt.NewWithClaims(jwt.SigningMethodHS256, loginFlowToken{ RegisteredClaims: &jwt.RegisteredClaims{ @@ -298,8 +272,9 @@ func (c *client) generateLoginSession(id *loginID, confirmationCode, clientIP st IssuedAt: jwt.NewNumericDate(*now.Time), }, DeviceUniqueID: id.DeviceUniqueID, - ConfirmationCode: confirmationCode, LoginSessionNumber: loginSessionNumber, + OldEmail: oldEmail, + NotifyEmail: oldEmail, ClientIP: clientIP, }) payload, err := token.SignedString([]byte(c.cfg.LoginSession.JwtSecret)) @@ -310,10 +285,6 @@ func (c *client) generateLoginSession(id *loginID, confirmationCode, clientIP st return payload, nil } -func generateOTP() string { - return uuid.NewString() -} - func generateConfirmationCode() string { result, err := rand.Int(rand.Reader, big.NewInt(999)) //nolint:gomnd // It's max value. log.Panic(err, "random wrong") diff --git a/auth/email_link/link_verify.go b/auth/email_link/link_verify.go index 4cd0da0c..e2d341c6 100644 --- a/auth/email_link/link_verify.go +++ b/auth/email_link/link_verify.go @@ -17,56 +17,75 @@ import ( "github.com/ice-blockchain/wintr/time" ) -//nolint:funlen // . -func (c *client) SignIn(ctx context.Context, emailLinkPayload, confirmationCode string) error { - var token magicLinkToken - if err := parseJwtToken(emailLinkPayload, c.cfg.EmailValidation.JwtSecret, &token); err != nil { - return errors.Wrapf(err, "invalid email token:%v", emailLinkPayload) +func (c *client) SignIn(ctx context.Context, loginSession, confirmationCode string) (tokens *Tokens, emailConfirmed bool, err error) { + now := time.Now() + var token loginFlowToken + if err = parseJwtToken(loginSession, c.cfg.EmailValidation.JwtSecret, &token); err != nil { + return nil, false, errors.Wrapf(err, "invalid login flow token:%v", loginSession) } email := token.Subject id := loginID{Email: email, DeviceUniqueID: token.DeviceUniqueID} els, err := c.getEmailLinkSignInByPk(ctx, &id, token.OldEmail) if err != nil { if storage.IsErr(err, storage.ErrNotFound) { - return errors.Wrapf(ErrNoConfirmationRequired, "[getEmailLinkSignInByPk] no pending confirmation for email:%v", email) + return nil, false, errors.Wrapf(ErrNoConfirmationRequired, "[getEmailLinkSignInByPk] no pending confirmation for email:%v", id.Email) } - return errors.Wrapf(err, "failed to get user info by email:%v(old email:%v)", email, token.OldEmail) + return nil, false, errors.Wrapf(err, "failed to get user info by email:%v(old email:%v)", id.Email, token.OldEmail) } - if vErr := c.verifySignIn(ctx, els, &id, emailLinkPayload, confirmationCode, token.OTP); vErr != nil { - return errors.Wrapf(vErr, "can't verify sign in for id:%#v", id) + emailConfirmed, issuedTokenSeq, err := c.signIn(ctx, now, els, &id, token.OldEmail, token.NotifyEmail, confirmationCode) + if err != nil { + return nil, false, errors.Wrapf(err, "can't sign in for email:%v, deviceUniqueID:%v", id.Email, id.DeviceUniqueID) + } + els.TokenIssuedAt = now + tokens, err = c.generateTokens(els.TokenIssuedAt, els, issuedTokenSeq) + if err != nil { + return nil, false, errors.Wrapf(err, "can't generate tokens for id:%#v", id) + } + if rErr := c.resetLoginSession(ctx, &id, els, confirmationCode, token.ClientIP, token.LoginSessionNumber); rErr != nil { + return nil, false, errors.Wrapf(rErr, "can't reset login session for id:%#v", id) } - var emailConfirmed bool - if token.OldEmail != "" || (els.PhoneNumberToEmailMigrationUserID != nil && *els.PhoneNumberToEmailMigrationUserID != "") { - if err = c.handleEmailModification(ctx, els, email, token.OldEmail, token.NotifyEmail); err != nil { - return errors.Wrapf(err, "failed to handle email modification:%v", email) + + return tokens, emailConfirmed, nil +} + +//nolint:funlen,revive // . +func (c *client) signIn( + ctx context.Context, now *time.Time, els *emailLinkSignIn, id *loginID, oldEmail, notifyEmail, confirmationCode string, +) (emailConfirmed bool, issuedTokenSeq int64, err error) { + if els.UserID != nil && els.ConfirmationCode == *els.UserID { + return false, 0, errors.Wrapf(ErrNoPendingLoginSession, "tokens already provided for id:%#v", id) + } + if vErr := c.verifySignIn(ctx, els, id, confirmationCode); vErr != nil { + return false, 0, errors.Wrapf(vErr, "can't verify sign in for id:%#v", id) + } + if oldEmail != "" || (els.PhoneNumberToEmailMigrationUserID != nil && *els.PhoneNumberToEmailMigrationUserID != "") { + if err = c.handleEmailModification(ctx, els, id.Email, oldEmail, notifyEmail); err != nil { + return false, 0, errors.Wrapf(err, "failed to handle email modification:%v", id.Email) } - emailConfirmed = token.OldEmail != "" - els.Email = email + emailConfirmed = oldEmail != "" + els.Email = id.Email } - if fErr := c.finishAuthProcess(ctx, &id, *els.UserID, token.OTP, els.IssuedTokenSeq, emailConfirmed, els.Metadata); fErr != nil { + issuedTokenSeq, fErr := c.finishAuthProcess(ctx, now, id, *els.UserID, els.IssuedTokenSeq, emailConfirmed, els.Metadata) + if fErr != nil { var mErr *multierror.Error - if token.OldEmail != "" { + if oldEmail != "" { mErr = multierror.Append(mErr, - errors.Wrapf(c.resetEmailModification(ctx, *els.UserID, token.OldEmail), - "[reset] resetEmailModification failed for email:%v", token.OldEmail), - errors.Wrapf(c.resetFirebaseEmailModification(ctx, els.Metadata, token.OldEmail), - "[reset] resetEmailModification failed for email:%v", token.OldEmail), + errors.Wrapf(c.resetEmailModification(ctx, *els.UserID, oldEmail), + "[reset] resetEmailModification failed for email:%v", oldEmail), + errors.Wrapf(c.resetFirebaseEmailModification(ctx, els.Metadata, oldEmail), + "[reset] resetEmailModification failed for email:%v", oldEmail), ) } - mErr = multierror.Append(mErr, errors.Wrapf(fErr, "can't finish auth process for userID:%v,email:%v,otp:%v", els.UserID, email, token.OTP)) + mErr = multierror.Append(mErr, errors.Wrapf(fErr, "can't finish auth process for userID:%v,email:%v", els.UserID, id.Email)) - return mErr.ErrorOrNil() //nolint:wrapcheck // . + return false, 0, mErr.ErrorOrNil() //nolint:wrapcheck // . } - return nil + return emailConfirmed, issuedTokenSeq, nil } -//nolint:revive // . -func (c *client) verifySignIn(ctx context.Context, els *emailLinkSignIn, id *loginID, emailLinkPayload, confirmationCode, tokenOTP string) error { - if els.OTP == *els.UserID || els.OTP != tokenOTP { - return errors.Wrapf(ErrNoConfirmationRequired, "no pending confirmation for email:%v", id.Email) - } +func (c *client) verifySignIn(ctx context.Context, els *emailLinkSignIn, id *loginID, confirmationCode string) error { var shouldBeBlocked bool var mErr *multierror.Error if els.ConfirmationCodeWrongAttemptsCount >= c.cfg.ConfirmationCode.MaxWrongAttemptsCount { @@ -88,7 +107,7 @@ func (c *client) verifySignIn(ctx context.Context, els *emailLinkSignIn, id *log mErr = multierror.Append(mErr, errors.Wrapf(iErr, "can't increment wrong confirmation code attempts count for email:%v,deviceUniqueID:%v", id.Email, id.DeviceUniqueID)) } - mErr = multierror.Append(mErr, errors.Wrapf(ErrConfirmationCodeWrong, "wrong confirmation code:%v for linkPayload:%v", confirmationCode, emailLinkPayload)) + mErr = multierror.Append(mErr, errors.Wrapf(ErrConfirmationCodeWrong, "wrong confirmation code:%v", confirmationCode)) return mErr.ErrorOrNil() //nolint:wrapcheck // Not needed. } @@ -116,10 +135,10 @@ func (c *client) increaseWrongConfirmationCodeAttemptsCount(ctx context.Context, //nolint:revive,funlen // . func (c *client) finishAuthProcess( - ctx context.Context, - id *loginID, userID, otp string, issuedTokenSeq int64, + ctx context.Context, now *time.Time, + id *loginID, userID string, issuedTokenSeq int64, emailConfirmed bool, md *users.JSON, -) error { +) (int64, error) { emailConfirmedAt := "null" if emailConfirmed { emailConfirmedAt = "$2" @@ -137,37 +156,65 @@ func (c *client) finishAuthProcess( } } if err := mergo.Merge(&mdToUpdate, md, mergo.WithOverride, mergo.WithTypeCheck); err != nil { - return errors.Wrapf(err, "failed to merge %#v and %v:%v", md, auth.IceIDClaim, userID) + return 0, errors.Wrapf(err, "failed to merge %#v and %v:%v", md, auth.IceIDClaim, userID) + } + params := []any{id.Email, now.Time, userID, id.DeviceUniqueID, issuedTokenSeq, mdToUpdate} + type resp struct { + IssuedTokenSeq int64 } - params := []any{id.Email, time.Now().Time, userID, otp, id.DeviceUniqueID, issuedTokenSeq, mdToUpdate} sql := fmt.Sprintf(` with metadata_update as ( INSERT INTO account_metadata(user_id, metadata) - VALUES ($3, $7::jsonb) ON CONFLICT(user_id) DO UPDATE + VALUES ($3, $6::jsonb) ON CONFLICT(user_id) DO UPDATE SET metadata = EXCLUDED.metadata WHERE account_metadata.metadata != EXCLUDED.metadata ) UPDATE email_link_sign_ins SET token_issued_at = $2, user_id = $3, - otp = $3, email_confirmed_at = %[1]v, phone_number_to_email_migration_user_id = null, issued_token_seq = COALESCE(issued_token_seq, 0) + 1, previously_issued_token_seq = COALESCE(issued_token_seq, 0) + 1 WHERE email_link_sign_ins.email = $1 - AND otp = $4 - AND device_unique_id = $5 - AND issued_token_seq = $6 - `, emailConfirmedAt) - - rowsUpdated, err := storage.Exec(ctx, c.db, sql, params...) + AND device_unique_id = $4 + AND issued_token_seq = $5 + RETURNING issued_token_seq`, emailConfirmedAt) + updatedValue, err := storage.ExecOne[resp](ctx, c.db, sql, params...) if err != nil { - return errors.Wrapf(err, "failed to insert generated token data for:%#v", params...) + if errors.Is(err, storage.ErrNotFound) { + return 0, errors.Wrapf(ErrNoConfirmationRequired, "[finishAuthProcess] No records were updated to finish: race condition") + } + + return 0, errors.Wrapf(err, "failed to insert generated token data for:%#v", params...) } - if rowsUpdated == 0 { - return errors.Wrapf(ErrNoConfirmationRequired, "[finishAuthProcess] No records were updated to finish: race condition") + + return updatedValue.IssuedTokenSeq, nil +} + +//nolint:revive // . +func (c *client) resetLoginSession( + ctx context.Context, id *loginID, els *emailLinkSignIn, + prevConfirmationCode, clientIP string, loginSessionNumber int64, +) error { + decrementIPAttempts := "" + params := []any{els.UserID, id.Email, id.DeviceUniqueID, prevConfirmationCode, els.IssuedTokenSeq + 1} + if clientIP != "" && loginSessionNumber > 0 { + decrementIPAttempts = `with decrement_ip_login_attempts as ( + UPDATE sign_ins_per_ip SET + login_attempts = GREATEST(sign_ins_per_ip.login_attempts - 1, 0) + WHERE ip = $6 AND login_session_number = $7 + )` + params = append(params, clientIP, loginSessionNumber) } + sql := fmt.Sprintf(`%v UPDATE email_link_sign_ins + SET confirmation_code = $1 + WHERE email = $2 + AND device_unique_id = $3 + AND confirmation_code = $4 + AND issued_token_seq = $5`, decrementIPAttempts) - return nil + _, err := storage.Exec(ctx, c.db, sql, params...) + + return errors.Wrapf(err, "failed to reset login session by id:%#v and confirmationCode:%v", id, prevConfirmationCode) } diff --git a/auth/email_link/status.go b/auth/email_link/status.go deleted file mode 100644 index e73c84c8..00000000 --- a/auth/email_link/status.go +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: ice License 1.0 - -package emaillinkiceauth - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - - "github.com/ice-blockchain/wintr/connectors/storage/v2" -) - -func (c *client) Status(ctx context.Context, loginSession string) (tokens *Tokens, emailConfirmed bool, err error) { - var token loginFlowToken - if err = parseJwtToken(loginSession, c.cfg.LoginSession.JwtSecret, &token); err != nil { - return nil, false, errors.Wrapf(err, "can't parse login session:%v", loginSession) - } - id := loginID{Email: token.Subject, DeviceUniqueID: token.DeviceUniqueID} - els, err := c.getConfirmedEmailLinkSignIn(ctx, &id, token.ConfirmationCode) - if err != nil { - if storage.IsErr(err, storage.ErrNotFound) { - return nil, false, errors.Wrapf(ErrNoPendingLoginSession, "no pending login session:%v,id:%#v", loginSession, id) - } - - return nil, false, errors.Wrapf(err, "failed to get confirmed email link sign in for loginSession:%v,id:%#v", loginSession, id) - } - if els.UserID == nil || els.OTP != *els.UserID { - return nil, false, errors.Wrapf(ErrStatusNotVerified, "not verified for id:%#v", id) - } - if els.ConfirmationCode == *els.UserID { - return nil, false, errors.Wrapf(ErrNoPendingLoginSession, "tokens already provided for id:%#v", id) - } - tokens, err = c.generateTokens(els.TokenIssuedAt, els, els.IssuedTokenSeq) - if err != nil { - return nil, false, errors.Wrapf(err, "can't generate tokens for id:%#v", id) - } - if rErr := c.resetLoginSession(ctx, &id, els, token.ConfirmationCode, token.ClientIP, token.LoginSessionNumber); rErr != nil { - return nil, false, errors.Wrapf(rErr, "can't reset login session for id:%#v", id) - } - emailConfirmed = els.EmailConfirmedAt != nil - - return tokens, emailConfirmed, nil -} - -//nolint:revive // . -func (c *client) resetLoginSession( - ctx context.Context, id *loginID, els *emailLinkSignIn, - prevConfirmationCode, clientIP string, loginSessionNumber int64, -) error { - decrementIPAttempts := "" - params := []any{els.UserID, id.Email, id.DeviceUniqueID, els.OTP, prevConfirmationCode, els.IssuedTokenSeq} - if clientIP != "" && loginSessionNumber > 0 { - decrementIPAttempts = `with decrement_ip_login_attempts as ( - UPDATE sign_ins_per_ip SET - login_attempts = GREATEST(sign_ins_per_ip.login_attempts - 1, 0) - WHERE ip = $7 AND login_session_number = $8 - )` - params = append(params, clientIP, loginSessionNumber) - } - sql := fmt.Sprintf(`%v UPDATE email_link_sign_ins - SET confirmation_code = $1 - WHERE email = $2 - AND device_unique_id = $3 - AND otp = $4 - AND confirmation_code = $5 - AND issued_token_seq = $6`, decrementIPAttempts) - _, err := storage.Exec(ctx, c.db, sql, params...) - - return errors.Wrapf(err, "failed to reset login session by id:%#v and confirmationCode:%v", id, prevConfirmationCode) -} diff --git a/auth/email_link/translations/email/modify_email/az.html b/auth/email_link/translations/email/modify_email/az.html deleted file mode 100644 index b53a6f81..00000000 --- a/auth/email_link/translations/email/modify_email/az.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Salam Qaradamı,

-

Email ünvanınızı doğrulamak üçün bu linkə daxil olun.

-

Ehtiyacınız olmadıqda, bu mesajı nəzərə almayın.

-

Təşəkkürlər,

-

ice Komandası

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/az.txt b/auth/email_link/translations/email/modify_email/az.txt deleted file mode 100644 index c17d00ec..00000000 --- a/auth/email_link/translations/email/modify_email/az.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice üçün e-poçtunuzu doğrulayın" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/bn.html b/auth/email_link/translations/email/modify_email/bn.html deleted file mode 100644 index b8bf4e45..00000000 --- a/auth/email_link/translations/email/modify_email/bn.html +++ /dev/null @@ -1,8 +0,0 @@ - -

হাই স্নোম্যান,

-

আপনার ইমেল ঠিকানা যাচাই করতে এই লিঙ্কটি অনুসরণ করুন।

-

আপনি যদি এটি যাচাই করতে অনুরোধ করেননি তবে আপনি এই বার্তাটি উপেক্ষা করতে পারেন।

-

ধন্যবাদ,

-

ice টীম

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/bn.txt b/auth/email_link/translations/email/modify_email/bn.txt deleted file mode 100644 index 82ef85ba..00000000 --- a/auth/email_link/translations/email/modify_email/bn.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice এর জন্য আপনার ইমেল যাচাই করুন" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/de.html b/auth/email_link/translations/email/modify_email/de.html deleted file mode 100644 index 05ae6945..00000000 --- a/auth/email_link/translations/email/modify_email/de.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Hallo Schneemann,

-

Folgen Sie diesem Link, um Ihre E-Mail-Adresse zu verifizieren.

-

Wenn Sie diese Verifizierung nicht angefordert haben, können Sie diese Nachricht ignorieren.

-

Danke,

-

ice Team

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/de.txt b/auth/email_link/translations/email/modify_email/de.txt deleted file mode 100644 index 4183033b..00000000 --- a/auth/email_link/translations/email/modify_email/de.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Verifizieren Sie Ihre E-Mail für ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/en.html b/auth/email_link/translations/email/modify_email/en.html index dfba1ced..c4c5da88 100644 --- a/auth/email_link/translations/email/modify_email/en.html +++ b/auth/email_link/translations/email/modify_email/en.html @@ -3,7 +3,8 @@ -->

Hi Snowman,

-

Follow this link to verify your email address.

+

Your confirmation code:

+

{{.ConfirmationCode}}

If you did not ask to verify this, you can ignore this message.

Thanks,

ice Team

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/gu.html b/auth/email_link/translations/email/modify_email/gu.html deleted file mode 100644 index bb0ac8f1..00000000 --- a/auth/email_link/translations/email/modify_email/gu.html +++ /dev/null @@ -1,8 +0,0 @@ - -

હાય સ્નોમેન,

-

તમારી ઇમેલ સરનામું ચકાસવા માટે આ લિંકને અનુસરો.

-

જો તમે આ ચકાસણીની વિનંતી કરી નથી તો આ સંદેશને ઉપેક્ષા કરી શકો છો.

-

આભાર,

-

ice ટીમ

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/gu.txt b/auth/email_link/translations/email/modify_email/gu.txt deleted file mode 100644 index 9e7dbd2a..00000000 --- a/auth/email_link/translations/email/modify_email/gu.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice માટે તમારી ઇમેઇલ ચકાસો" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/hi.html b/auth/email_link/translations/email/modify_email/hi.html deleted file mode 100644 index faaafd79..00000000 --- a/auth/email_link/translations/email/modify_email/hi.html +++ /dev/null @@ -1,8 +0,0 @@ - -

हाय स्नोमैन,

-

अपना ईमेल पता सत्यापित करने के लिए इस लिंक का पालन करें।

-

यदि आपने इस सत्यापन का अनुरोध नहीं किया है, तो आप इस संदेश को अनदेखा कर सकते हैं।

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/hi.txt b/auth/email_link/translations/email/modify_email/hi.txt deleted file mode 100644 index 472ebc1f..00000000 --- a/auth/email_link/translations/email/modify_email/hi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice के लिए अपना ईमेल सत्यापित करें" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/id.html b/auth/email_link/translations/email/modify_email/id.html deleted file mode 100644 index fa670121..00000000 --- a/auth/email_link/translations/email/modify_email/id.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Halo Snowman,

-

Ikuti tautan ini untuk memverifikasi alamat email Anda.

-

Jika Anda tidak meminta verifikasi ini, Anda dapat mengabaikan pesan ini.

-

Terima kasih,

-

Tim ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/id.txt b/auth/email_link/translations/email/modify_email/id.txt deleted file mode 100644 index ec2f08c8..00000000 --- a/auth/email_link/translations/email/modify_email/id.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Verifikasi email Anda untuk ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/it.html b/auth/email_link/translations/email/modify_email/it.html deleted file mode 100644 index a3e9cd00..00000000 --- a/auth/email_link/translations/email/modify_email/it.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Ciao Snomwman,

-

Segui questo link per verificare il tuo indirizzo email.

-

Se non hai richiesto questa verifica, puoi ignorare questo messaggio.

-

Grazie,

-

Il Team di ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/it.txt b/auth/email_link/translations/email/modify_email/it.txt deleted file mode 100644 index 065fea50..00000000 --- a/auth/email_link/translations/email/modify_email/it.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Verifica la tua email per ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/mr.html b/auth/email_link/translations/email/modify_email/mr.html deleted file mode 100644 index 871de232..00000000 --- a/auth/email_link/translations/email/modify_email/mr.html +++ /dev/null @@ -1,8 +0,0 @@ - -

हाय स्नोमॅन,

-

तुमचा ईमेल पत्ता सत्यापित करण्यासाठी ह्या लिंकवर क्लिक करा.

-

जर तुम्ही ह्या सत्यापनाची विनंती केली नसाल तर तुम्ही ह्या संदेशाला उपेक्षा करू शकता.

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/mr.txt b/auth/email_link/translations/email/modify_email/mr.txt deleted file mode 100644 index 40cfa3a6..00000000 --- a/auth/email_link/translations/email/modify_email/mr.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "iceसाठी आपला ईमेल सत्यापित करा" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/pl.html b/auth/email_link/translations/email/modify_email/pl.html deleted file mode 100644 index 1afc42c6..00000000 --- a/auth/email_link/translations/email/modify_email/pl.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Cześć Bałwanie,

-

Przejdź pod ten link, aby zweryfikować swój adres e-mail.

-

Jeśli nie prosiłeś o weryfikację, możesz zignorować tę wiadomość.

-

Dzięki,

-

Zespół ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/pl.txt b/auth/email_link/translations/email/modify_email/pl.txt deleted file mode 100644 index 3051cf70..00000000 --- a/auth/email_link/translations/email/modify_email/pl.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Zweryfikuj swój adres e-mail dla ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/th.html b/auth/email_link/translations/email/modify_email/th.html deleted file mode 100644 index ecafd8f7..00000000 --- a/auth/email_link/translations/email/modify_email/th.html +++ /dev/null @@ -1,8 +0,0 @@ - -

สวัสดี Snowman,

-

คลิก ลิงก์นี้ เพื่อยืนยันที่อยู่อีเมลของคุณ

-

หากคุณไม่ได้ขอให้ยืนยันนี้ คุณสามารถละเว้นข้อความนี้ได้

-

ขอบคุณ,

-

ทีม ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/th.txt b/auth/email_link/translations/email/modify_email/th.txt deleted file mode 100644 index 3e5f842d..00000000 --- a/auth/email_link/translations/email/modify_email/th.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ยืนยันอีเมลของคุณสำหรับ ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/vi.html b/auth/email_link/translations/email/modify_email/vi.html deleted file mode 100644 index e4dda1b9..00000000 --- a/auth/email_link/translations/email/modify_email/vi.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Xin chào Người tuyết,

-

Click vào liên kết này để xác minh địa chỉ email của bạn.

-

Nếu bạn không yêu cầu xác minh này, bạn có thể bỏ qua thông báo này.

-

Cảm ơn,

-

Đội ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/vi.txt b/auth/email_link/translations/email/modify_email/vi.txt deleted file mode 100644 index a83db502..00000000 --- a/auth/email_link/translations/email/modify_email/vi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Xác minh email của bạn cho ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/zh.html b/auth/email_link/translations/email/modify_email/zh.html deleted file mode 100644 index 4472b50d..00000000 --- a/auth/email_link/translations/email/modify_email/zh.html +++ /dev/null @@ -1,8 +0,0 @@ - -

嗨,雪人

-

点击此链接验证您的电子邮件地址。

-

如果您没有请求进行验证,您可以忽略此消息。

-

谢谢,

-

ice团队

\ No newline at end of file diff --git a/auth/email_link/translations/email/modify_email/zh.txt b/auth/email_link/translations/email/modify_email/zh.txt deleted file mode 100644 index a6c5aa5a..00000000 --- a/auth/email_link/translations/email/modify_email/zh.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "验证您的电子邮件以使用 ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/az.html b/auth/email_link/translations/email/notify_changed/az.html deleted file mode 100644 index 62b113ea..00000000 --- a/auth/email_link/translations/email/notify_changed/az.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Salam Qaradamı,

-

ice üçün giriş etmək üçün olan emailiniz {{.NewEmail}} olaraq dəyişdirildi.

-

Emailinizi dəyişdirmək üçün tələb etmədiysinizsə, giriş emailinizi sıfırlamaq üçün bu linki izləyin.

-

Təşəkkürlər,

-

ice Komandası

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/az.txt b/auth/email_link/translations/email/notify_changed/az.txt deleted file mode 100644 index ba91d4b0..00000000 --- a/auth/email_link/translations/email/notify_changed/az.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice üçün giriş etmək üçün olan emailiniz dəyişdirildi" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/bn.html b/auth/email_link/translations/email/notify_changed/bn.html deleted file mode 100644 index ef7abbee..00000000 --- a/auth/email_link/translations/email/notify_changed/bn.html +++ /dev/null @@ -1,8 +0,0 @@ - -

হাই স্নোম্যান,

-

আপনার ice এ সাইন ইন করার জন্য ইমেলটি {{.NewEmail}} এ পরিবর্তন করা হয়েছে।

-

যদি আপনি আপনার ইমেল পরিবর্তনের অনুরোধ না করে থাকেন, তবে সাইন ইন ইমেল রিসেট করতে এই লিংকটি ফলো করুন।

-

ধন্যবাদ,

-

ice টীম

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/bn.txt b/auth/email_link/translations/email/notify_changed/bn.txt deleted file mode 100644 index e2f1321c..00000000 --- a/auth/email_link/translations/email/notify_changed/bn.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "আপনার ইমেল ঠিকানা ice এর জন্য পরিবর্তিত হয়েছে" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/de.html b/auth/email_link/translations/email/notify_changed/de.html deleted file mode 100644 index 5d7acdbd..00000000 --- a/auth/email_link/translations/email/notify_changed/de.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Hallo Schneemann,

-

Deine Anmelde-E-Mail für ice wurde auf {{.NewEmail}} geändert.

-

Wenn du nicht darum gebeten hast, deine E-Mail zu ändern, folge diesem Link, um deine Anmelde-E-Mail zurückzusetzen.

-

Danke,

-

ice Team

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/de.txt b/auth/email_link/translations/email/notify_changed/de.txt deleted file mode 100644 index 82af75eb..00000000 --- a/auth/email_link/translations/email/notify_changed/de.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Deine Anmelde-E-Mail für ice wurde geändert" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/gu.html b/auth/email_link/translations/email/notify_changed/gu.html deleted file mode 100644 index f318cfa2..00000000 --- a/auth/email_link/translations/email/notify_changed/gu.html +++ /dev/null @@ -1,8 +0,0 @@ - -

હાય સ્નોમેન,

-

આપની ice માટેની સાઇન-ઇન ઇમેલ બદલાઈ ગઈ છે અને હમણા {{.NewEmail}} પર થઈ ગઈ છે.

-

જો આપે આપની ઇમેલ બદલવાની વિનંતી કરી નહોતી, તો આપણે આપની સાઇન-ઇન ઇમેલને રીસેટ કરવા માટે આ લિંકને અનુસરો.

-

આભાર,

-

ice ટીમ

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/gu.txt b/auth/email_link/translations/email/notify_changed/gu.txt deleted file mode 100644 index 828cb80f..00000000 --- a/auth/email_link/translations/email/notify_changed/gu.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "આપની ice માટેની સાઇન-ઇન ઈમેલ બદલાઈ ગઈ છે" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/hi.html b/auth/email_link/translations/email/notify_changed/hi.html deleted file mode 100644 index 462bff8c..00000000 --- a/auth/email_link/translations/email/notify_changed/hi.html +++ /dev/null @@ -1,8 +0,0 @@ - -

हाय स्नोमैन,

-

आपका ice के लिए साइन-इन ईमेल बदल दिया गया है और अब यह है: {{.NewEmail}}

-

यदि आपने इसे बदलने के लिए नहीं कहा है, तो अपने साइन-इन ईमेल को रीसेट करने के लिए इस लिंक का पालन करें।

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/hi.txt b/auth/email_link/translations/email/notify_changed/hi.txt deleted file mode 100644 index 21568d71..00000000 --- a/auth/email_link/translations/email/notify_changed/hi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice के लिए आपकी साइन-इन ईमेल बदल गई है" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/id.html b/auth/email_link/translations/email/notify_changed/id.html deleted file mode 100644 index 617fdada..00000000 --- a/auth/email_link/translations/email/notify_changed/id.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Halo Snowman,

-

Email masuk Anda untuk ice telah diubah menjadi {{.NewEmail}}.

-

Jika Anda tidak meminta untuk mengubah email Anda, ikuti tautan ini untuk mereset email masuk Anda.

-

Terima kasih,

-

Tim ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/id.txt b/auth/email_link/translations/email/notify_changed/id.txt deleted file mode 100644 index bfb13e0f..00000000 --- a/auth/email_link/translations/email/notify_changed/id.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Email masuk Anda untuk ice telah diubah" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/it.html b/auth/email_link/translations/email/notify_changed/it.html deleted file mode 100644 index 00661e80..00000000 --- a/auth/email_link/translations/email/notify_changed/it.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Ciao Snowman,

-

La tua email di accesso per ice è stata cambiata in {{.NewEmail}}.

-

Se non hai richiesto di cambiare la tua email, segui questo link per reimpostare la tua email di accesso.

-

Grazie,

-

Il Team di ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/it.txt b/auth/email_link/translations/email/notify_changed/it.txt deleted file mode 100644 index c2e3485e..00000000 --- a/auth/email_link/translations/email/notify_changed/it.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "La tua email di accesso per ice è stata cambiata" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/mr.html b/auth/email_link/translations/email/notify_changed/mr.html deleted file mode 100644 index 864b81af..00000000 --- a/auth/email_link/translations/email/notify_changed/mr.html +++ /dev/null @@ -1,8 +0,0 @@ - -

हाय स्नोमन,

-

आपला ice मध्ये साइन-इन करण्यासाठीचा ईमेल {{.NewEmail}} पर्यंत बदलला गेला आहे.

-

जर तुम्ही ह्या ईमेल बदलायला विनंती केली नसाल तर या लिंकला अनुसरून आपला साइन-इन ईमेल रीसेट करा.

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/mr.txt b/auth/email_link/translations/email/notify_changed/mr.txt deleted file mode 100644 index 6b0aa978..00000000 --- a/auth/email_link/translations/email/notify_changed/mr.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice मध्ये आपली साइन-इन ईमेल बदलली गेली आहे" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/pl.html b/auth/email_link/translations/email/notify_changed/pl.html deleted file mode 100644 index 7480ff70..00000000 --- a/auth/email_link/translations/email/notify_changed/pl.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Cześć Bałwanie,

-

Twój email do logowania w ice został zmieniony na {{.NewEmail}}.

-

Jeśli nie prosiłeś o zmianę emaila, kliknij ten link, aby zresetować swój email do logowania.

-

Dziękujemy,

-

Zespół ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/pl.txt b/auth/email_link/translations/email/notify_changed/pl.txt deleted file mode 100644 index 1b844f59..00000000 --- a/auth/email_link/translations/email/notify_changed/pl.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Twoje konto email do logowania w ice zostało zmienione" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/th.html b/auth/email_link/translations/email/notify_changed/th.html deleted file mode 100644 index 1d29dde6..00000000 --- a/auth/email_link/translations/email/notify_changed/th.html +++ /dev/null @@ -1,8 +0,0 @@ - -

สวัสดี Snowman,

-

อีเมลการเข้าสู่ระบบของคุณสำหรับ ice ถูกเปลี่ยนเป็น {{.NewEmail}}

-

หากคุณไม่ได้ขอเปลี่ยนอีเมลของคุณ คลิก ลิงก์นี้ เพื่อรีเซ็ตอีเมลการเข้าสู่ระบบของคุณ

-

ขอบคุณ,

-

ทีม ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/th.txt b/auth/email_link/translations/email/notify_changed/th.txt deleted file mode 100644 index 5cd846fc..00000000 --- a/auth/email_link/translations/email/notify_changed/th.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "อีเมลการเข้าสู่ระบบของคุณสำหรับ ice ถูกเปลี่ยนแปลงแล้ว" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/vi.html b/auth/email_link/translations/email/notify_changed/vi.html deleted file mode 100644 index a8a03fa9..00000000 --- a/auth/email_link/translations/email/notify_changed/vi.html +++ /dev/null @@ -1,8 +0,0 @@ - -

Xin chào Snowman,

-

Địa chỉ email đăng nhập của bạn cho ice đã được thay đổi thành {{.NewEmail}}.

-

Nếu bạn không yêu cầu thay đổi email, hãy nhấp vào liên kết này để đặt lại địa chỉ email đăng nhập của bạn.

-

Cảm ơn,

-

Đội ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/vi.txt b/auth/email_link/translations/email/notify_changed/vi.txt deleted file mode 100644 index 5742ea53..00000000 --- a/auth/email_link/translations/email/notify_changed/vi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Email đăng nhập của bạn cho ice đã được thay đổi" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/zh.html b/auth/email_link/translations/email/notify_changed/zh.html deleted file mode 100644 index 35eb6784..00000000 --- a/auth/email_link/translations/email/notify_changed/zh.html +++ /dev/null @@ -1,8 +0,0 @@ - -

嗨,雪人

-

您的 ice 登录电子邮件已更改为 {{.NewEmail}}

-

如果您没有要求更改电子邮件,请点击此链接重置您的登录电子邮件。

-

谢谢,

-

ice 团队

\ No newline at end of file diff --git a/auth/email_link/translations/email/notify_changed/zh.txt b/auth/email_link/translations/email/notify_changed/zh.txt deleted file mode 100644 index c060561f..00000000 --- a/auth/email_link/translations/email/notify_changed/zh.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "您的 ice 登录电子邮件已更改" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/az.html b/auth/email_link/translations/email/signin/az.html deleted file mode 100644 index c7021c29..00000000 --- a/auth/email_link/translations/email/signin/az.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Salam Qaradamı,

-

Bu e-poçt ünvanı ilə ice-də oturum açmaq üçün bir sorğu aldıq. {{.Email}} hesabınızla oturum açmaq istəyirsinizsə, bu linkə klikləyin:

-

ice-də oturum açın

-

Bu linki siz tələb etməmisinizsə, bu e-poçtu rahatlıqla ignore edə bilərsiniz.

-

Təşəkkürlər,

-

ice Komandası

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/az.txt b/auth/email_link/translations/email/signin/az.txt deleted file mode 100644 index c9b87e04..00000000 --- a/auth/email_link/translations/email/signin/az.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice-yə daxil olun" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/bn.html b/auth/email_link/translations/email/signin/bn.html deleted file mode 100644 index ecab8b74..00000000 --- a/auth/email_link/translations/email/signin/bn.html +++ /dev/null @@ -1,9 +0,0 @@ - -

হাই স্নোম্যান,

-

এই ইমেল ঠিকানা ব্যবহার করে ice-তে সাইন ইন করার অনুরোধ পেয়েছি। আপনি আপনার {{.Email}} অ্যাকাউন্ট দিয়ে সাইন ইন করতে চান তাহলে এই লিঙ্কটিতে ক্লিক করুন:

-

ice-তে সাইন ইন করুন

-

আপনি এই লিঙ্কটি অনুরোধ করেননি তাহলে এই ইমেলটি নিরাপদে বাতিল করতে পারেন।

-

ধন্যবাদ,

-

ice দল

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/bn.txt b/auth/email_link/translations/email/signin/bn.txt deleted file mode 100644 index 87966b25..00000000 --- a/auth/email_link/translations/email/signin/bn.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice-এ সাইন ইন করুন" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/de.html b/auth/email_link/translations/email/signin/de.html deleted file mode 100644 index f1dee803..00000000 --- a/auth/email_link/translations/email/signin/de.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Hallo Schneemann,

-

Wir haben eine Anfrage erhalten, um sich bei ice mit dieser E-Mail-Adresse anzumelden. Wenn Sie sich mit Ihrem {{.Email}}-Konto anmelden möchten, klicken Sie auf den folgenden Link:

-

Bei ice anmelden

-

Wenn Sie diese E-Mail nicht angefordert haben, können Sie sie sicher ignorieren.

-

Vielen Dank,

-

ice-Team

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/de.txt b/auth/email_link/translations/email/signin/de.txt deleted file mode 100644 index 5f70f633..00000000 --- a/auth/email_link/translations/email/signin/de.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Bei ice anmelden" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/en.html b/auth/email_link/translations/email/signin/en.html index 7c66e775..4bed6a0e 100644 --- a/auth/email_link/translations/email/signin/en.html +++ b/auth/email_link/translations/email/signin/en.html @@ -3,8 +3,8 @@ -->

Hi Snowman,

-

We received a request to sign in to ice using this email address. If you want to sign in with your {{.Email}} account, click this link:

-

Sign in to ice

+

We received a request to sign in to ice using this email address. If you want to sign in with your {{.Email}} account, use this confirmation code:

+

{{.ConfirmationCode}}

If you did not request this link, you can safely ignore this email.

Thanks,

ice Team

diff --git a/auth/email_link/translations/email/signin/gu.html b/auth/email_link/translations/email/signin/gu.html deleted file mode 100644 index 1ec91875..00000000 --- a/auth/email_link/translations/email/signin/gu.html +++ /dev/null @@ -1,9 +0,0 @@ - -

હાય સ્નોમેન,

-

આ ઇમેઇલ સરનામાથી આઇસ માં સાઇન ઇન કરવાની વિનંતી મેળવી છે. જો તમને તમારા {{.Email}} એકાઉન્ટથી સાઇન ઇન કરવી હોય, આ લિંક પર ક્લિક કરો:

-

આઇસ માં સાઇન ઇન કરો

-

જો તમે આ લિંકને વિનંતી ન કર્યા હોય, તો આ ઇમેઇલને સાવધાનીપૂર્વક નજરાત લો.

-

આભાર,

-

આઇસ ટીમ

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/gu.txt b/auth/email_link/translations/email/signin/gu.txt deleted file mode 100644 index 738b93b2..00000000 --- a/auth/email_link/translations/email/signin/gu.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "iceમાં સાઇન ઇન કરો" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/hi.html b/auth/email_link/translations/email/signin/hi.html deleted file mode 100644 index ac3428ca..00000000 --- a/auth/email_link/translations/email/signin/hi.html +++ /dev/null @@ -1,9 +0,0 @@ - -

नमस्ते हिम मानव,

-

हमें इस ईमेल पते का उपयोग करके ice में साइन इन करने का अनुरोध प्राप्त हुआ है। अगर आप अपने {{.Email}} खाते के साथ साइन इन करना चाहते हैं, तो इस लिंक पर क्लिक करें:

-

ice में साइन इन करें

-

यदि आपने इस लिंक का अनुरोध नहीं किया है, तो इस ईमेल को ध्यानपूर्वक अनदेखा कर सकते हैं।

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/hi.txt b/auth/email_link/translations/email/signin/hi.txt deleted file mode 100644 index 5d11fe32..00000000 --- a/auth/email_link/translations/email/signin/hi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "ice में साइन इन करें" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/id.html b/auth/email_link/translations/email/signin/id.html deleted file mode 100644 index 421afdbc..00000000 --- a/auth/email_link/translations/email/signin/id.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Halo Snowman,

-

Kami menerima permintaan untuk masuk ke ice menggunakan alamat email ini. Jika Anda ingin masuk dengan akun {{.Email}} Anda, klik tautan ini:

-

Masuk ke ice

-

Jika Anda tidak meminta tautan ini, Anda dapat mengabaikan email ini dengan aman.

-

Terima kasih,

-

Tim ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/id.txt b/auth/email_link/translations/email/signin/id.txt deleted file mode 100644 index d01afe4c..00000000 --- a/auth/email_link/translations/email/signin/id.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Masuk ke ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/it.html b/auth/email_link/translations/email/signin/it.html deleted file mode 100644 index 7562ed52..00000000 --- a/auth/email_link/translations/email/signin/it.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Ciao Snowman,

-

Abbiamo ricevuto una richiesta di accesso a ice utilizzando questo indirizzo email. Se desideri accedere con il tuo account {{.Email}}, clicca su questo link:

-

Accedi a ice

-

Se non hai richiesto questo link, puoi ignorare tranquillamente questa email.

-

Grazie,

-

Il Team di ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/it.txt b/auth/email_link/translations/email/signin/it.txt deleted file mode 100644 index 04cf7631..00000000 --- a/auth/email_link/translations/email/signin/it.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Accedi a ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/mr.html b/auth/email_link/translations/email/signin/mr.html deleted file mode 100644 index 159ef6ef..00000000 --- a/auth/email_link/translations/email/signin/mr.html +++ /dev/null @@ -1,9 +0,0 @@ - -

हाय स्नोमन,

-

आपल्या ईमेल पत्त्याचा वापर करून ice मध्ये साइन इन करण्याचा एक विनंती मिळाला आहे. आपल्या {{.Email}} खात्याने साइन इन करायला आवडेल तर हा दुवा दबा:

-

ice मध्ये साइन इन करा

-

आपण हा लिंक विनंती केलेला नसल्यास, आपण हे ईमेल सुरक्षितपणे उपेक्षा करू शकता.

-

धन्यवाद,

-

ice टीम

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/mr.txt b/auth/email_link/translations/email/signin/mr.txt deleted file mode 100644 index aa60c1e0..00000000 --- a/auth/email_link/translations/email/signin/mr.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "iceमध्ये साइन इन करा" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/pl.html b/auth/email_link/translations/email/signin/pl.html deleted file mode 100644 index 40d27210..00000000 --- a/auth/email_link/translations/email/signin/pl.html +++ /dev/null @@ -1,12 +0,0 @@ - -

Cześć Bałwanie,

-

Otrzymaliśmy prośbę o zalogowanie się do ice przy użyciu tego adresu e-mail. Jeśli chcesz zalogować się na swoje konto {{.Email}}, kliknij ten link:

-

Zaloguj się do ice

-

Jeśli nie złożyłeś tej prośby, możesz bezpiecznie zignorować tę wiadomość e-mail.

-

Dzięki,

-

Zespół ice

- - - diff --git a/auth/email_link/translations/email/signin/pl.txt b/auth/email_link/translations/email/signin/pl.txt deleted file mode 100644 index b6341bbd..00000000 --- a/auth/email_link/translations/email/signin/pl.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Zaloguj się do ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/th.html b/auth/email_link/translations/email/signin/th.html deleted file mode 100644 index 4f7d54ff..00000000 --- a/auth/email_link/translations/email/signin/th.html +++ /dev/null @@ -1,9 +0,0 @@ - -

สวัสดี Snowman,

-

เราได้รับคำขอให้เข้าสู่ระบบ ice โดยใช้ที่อยู่อีเมลนี้ หากคุณต้องการเข้าสู่ระบบด้วยบัญชี {{.Email}} ของคุณ คลิกที่ลิงก์นี้:

-

เข้าสู่ระบบ ice

-

หากคุณไม่ได้ขอลิงก์นี้ คุณสามารถเพิกเฉยต่ออีเมลนี้ได้อย่างปลอดภัย

-

ขอบคุณ,

-

ทีม ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/th.txt b/auth/email_link/translations/email/signin/th.txt deleted file mode 100644 index a419b2cf..00000000 --- a/auth/email_link/translations/email/signin/th.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "เข้าสู่ระบบ ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/vi.html b/auth/email_link/translations/email/signin/vi.html deleted file mode 100644 index d4690fe7..00000000 --- a/auth/email_link/translations/email/signin/vi.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Xin chào Người tuyết,

-

Chúng tôi nhận được yêu cầu đăng nhập vào ice bằng địa chỉ email này. Nếu bạn muốn đăng nhập bằng tài khoản {{.Email}} của bạn, hãy nhấp vào liên kết này:

-

Đăng nhập vào ice

-

Nếu bạn không yêu cầu liên kết này, bạn có thể bỏ qua email này một cách an toàn.

-

Cảm ơn bạn,

-

Đội ice

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/vi.txt b/auth/email_link/translations/email/signin/vi.txt deleted file mode 100644 index 3b27be44..00000000 --- a/auth/email_link/translations/email/signin/vi.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ -"subject": "Đăng nhập vào ice" -} \ No newline at end of file diff --git a/auth/email_link/translations/email/signin/zh.html b/auth/email_link/translations/email/signin/zh.html deleted file mode 100644 index 39850162..00000000 --- a/auth/email_link/translations/email/signin/zh.html +++ /dev/null @@ -1,9 +0,0 @@ - -

嗨,雪人

-

我们收到了使用此电子邮件地址登录 ice 的请求。如果您要使用您的{{.Email}}账户登录,请点击此链接:

-

登录 ice

-

如果您没有请求此链接,可以安全地忽略此电子邮件。

-

谢谢,

-

ice团队

\ No newline at end of file diff --git a/auth/email_link/translations/email/signin/zh.txt b/auth/email_link/translations/email/signin/zh.txt deleted file mode 100644 index c3abd26b..00000000 --- a/auth/email_link/translations/email/signin/zh.txt +++ /dev/null @@ -1,3 +0,0 @@ -{ - "subject": "登录 ice" -} \ No newline at end of file diff --git a/auth/email_link/users.go b/auth/email_link/users.go index 576fd1bd..4ace4dc4 100644 --- a/auth/email_link/users.go +++ b/auth/email_link/users.go @@ -91,7 +91,6 @@ func (c *client) getUserByIDOrPk(ctx context.Context, userID string, id *loginID COALESCE(issued_token_seq, 0) AS issued_token_seq, blocked_until, COALESCE(confirmation_code_wrong_attempts_count, 0) AS confirmation_code_wrong_attempts_count, - otp, confirmation_code, user_id, phone_number_to_email_migration_user_id, @@ -109,7 +108,6 @@ func (c *client) getUserByIDOrPk(ctx context.Context, userID string, id *loginID issued_token_seq, blocked_until, confirmation_code_wrong_attempts_count, - otp, confirmation_code, $1 AS user_id, phone_number_to_email_migration_user_id, @@ -130,7 +128,6 @@ func (c *client) getUserByIDOrPk(ctx context.Context, userID string, id *loginID emails.issued_token_seq AS issued_token_seq, emails.blocked_until AS blocked_until, emails.confirmation_code_wrong_attempts_count AS confirmation_code_wrong_attempts_count, - emails.otp AS otp, emails.confirmation_code AS confirmation_code, u.id AS user_id, emails.phone_number_to_email_migration_user_id AS phone_number_to_email_migration_user_id, @@ -154,24 +151,6 @@ func (c *client) getUserByIDOrPk(ctx context.Context, userID string, id *loginID return usr, nil } -func (c *client) getConfirmedEmailLinkSignIn(ctx context.Context, id *loginID, confirmationCode string) (*emailLinkSignIn, error) { - if ctx.Err() != nil { - return nil, errors.Wrap(ctx.Err(), "get user by id or email failed because context failed") - } - sql := `SELECT email_link_sign_ins.*, account_metadata.metadata - FROM email_link_sign_ins - LEFT JOIN account_metadata ON email_link_sign_ins.user_id = account_metadata.user_id - WHERE confirmation_code = $1 - AND email = $2 - AND device_unique_id = $3` - usr, err := storage.Get[emailLinkSignIn](ctx, c.db, sql, confirmationCode, id.Email, id.DeviceUniqueID) - if err != nil { - return nil, errors.Wrapf(err, "failed to get user by confirmation code:%v and id:%#v", confirmationCode, id) - } - - return usr, nil -} - //nolint:revive // . func (c *client) getEmailLinkSignIn(ctx context.Context, id *loginID, fromMaster bool) (*emailLinkSignIn, error) { if ctx.Err() != nil { diff --git a/cmd/eskimo-hut/api/docs.go b/cmd/eskimo-hut/api/docs.go index b6bd4fa9..006c74cb 100644 --- a/cmd/eskimo-hut/api/docs.go +++ b/cmd/eskimo-hut/api/docs.go @@ -20,69 +20,6 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/auth/getConfirmationStatus": { - "post": { - "description": "Status of the auth process", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Auth" - ], - "parameters": [ - { - "description": "Request params", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/main.StatusArg" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/main.Auth" - } - }, - "403": { - "description": "if invalid or expired login session provided", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "404": { - "description": "if login session not found or confirmation code verifying failed", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "422": { - "description": "if syntax fails", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "504": { - "description": "if request times out", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - } - } - } - }, "/auth/getMetadata": { "post": { "description": "Fetches user's metadata based on token's data", @@ -459,9 +396,9 @@ const docTemplate = `{ } } }, - "/auth/signInWithEmailLink": { + "/auth/signInWithConfirmationCode": { "post": { - "description": "Finishes login flow using magic link", + "description": "Finishes login flow using confirmation code", "produces": [ "application/json" ], @@ -475,7 +412,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/main.MagicLinkPayload" + "$ref": "#/definitions/main.LoginFlowPayload" } } ], @@ -1618,14 +1555,14 @@ const docTemplate = `{ } } }, - "main.MagicLinkPayload": { + "main.LoginFlowPayload": { "type": "object", "properties": { "confirmationCode": { "type": "string", "example": "999" }, - "emailToken": { + "loginSession": { "type": "string", "example": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM" } @@ -1967,15 +1904,6 @@ const docTemplate = `{ } } }, - "main.StatusArg": { - "type": "object", - "properties": { - "loginSession": { - "type": "string", - "example": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM" - } - } - }, "main.User": { "type": "object", "properties": { diff --git a/cmd/eskimo-hut/api/swagger.json b/cmd/eskimo-hut/api/swagger.json index fd18a084..4590b130 100644 --- a/cmd/eskimo-hut/api/swagger.json +++ b/cmd/eskimo-hut/api/swagger.json @@ -14,69 +14,6 @@ }, "basePath": "/v1w", "paths": { - "/auth/getConfirmationStatus": { - "post": { - "description": "Status of the auth process", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Auth" - ], - "parameters": [ - { - "description": "Request params", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/main.StatusArg" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/main.Auth" - } - }, - "403": { - "description": "if invalid or expired login session provided", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "404": { - "description": "if login session not found or confirmation code verifying failed", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "422": { - "description": "if syntax fails", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - }, - "504": { - "description": "if request times out", - "schema": { - "$ref": "#/definitions/server.ErrorResponse" - } - } - } - } - }, "/auth/getMetadata": { "post": { "description": "Fetches user's metadata based on token's data", @@ -453,9 +390,9 @@ } } }, - "/auth/signInWithEmailLink": { + "/auth/signInWithConfirmationCode": { "post": { - "description": "Finishes login flow using magic link", + "description": "Finishes login flow using confirmation code", "produces": [ "application/json" ], @@ -469,7 +406,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/main.MagicLinkPayload" + "$ref": "#/definitions/main.LoginFlowPayload" } } ], @@ -1612,14 +1549,14 @@ } } }, - "main.MagicLinkPayload": { + "main.LoginFlowPayload": { "type": "object", "properties": { "confirmationCode": { "type": "string", "example": "999" }, - "emailToken": { + "loginSession": { "type": "string", "example": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM" } @@ -1961,15 +1898,6 @@ } } }, - "main.StatusArg": { - "type": "object", - "properties": { - "loginSession": { - "type": "string", - "example": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM" - } - } - }, "main.User": { "type": "object", "properties": { diff --git a/cmd/eskimo-hut/api/swagger.yaml b/cmd/eskimo-hut/api/swagger.yaml index 68f0e954..9bc7a31b 100644 --- a/cmd/eskimo-hut/api/swagger.yaml +++ b/cmd/eskimo-hut/api/swagger.yaml @@ -43,12 +43,12 @@ definitions: example: did:ethr:0x4B73C58370AEfcEf86A6021afCDe5673511376B2 type: string type: object - main.MagicLinkPayload: + main.LoginFlowPayload: properties: confirmationCode: example: "999" type: string - emailToken: + loginSession: example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM type: string type: object @@ -282,12 +282,6 @@ definitions: example: en type: string type: object - main.StatusArg: - properties: - loginSession: - example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM - type: string - type: object main.User: properties: agendaPhoneNumberHashes: @@ -567,47 +561,6 @@ info: title: User Accounts, User Devices, User Statistics API version: latest paths: - /auth/getConfirmationStatus: - post: - consumes: - - application/json - description: Status of the auth process - parameters: - - description: Request params - in: body - name: request - required: true - schema: - $ref: '#/definitions/main.StatusArg' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/main.Auth' - "403": - description: if invalid or expired login session provided - schema: - $ref: '#/definitions/server.ErrorResponse' - "404": - description: if login session not found or confirmation code verifying failed - schema: - $ref: '#/definitions/server.ErrorResponse' - "422": - description: if syntax fails - schema: - $ref: '#/definitions/server.ErrorResponse' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/server.ErrorResponse' - "504": - description: if request times out - schema: - $ref: '#/definitions/server.ErrorResponse' - tags: - - Auth /auth/getMetadata: post: description: Fetches user's metadata based on token's data @@ -861,16 +814,16 @@ paths: $ref: '#/definitions/server.ErrorResponse' tags: - Auth - /auth/signInWithEmailLink: + /auth/signInWithConfirmationCode: post: - description: Finishes login flow using magic link + description: Finishes login flow using confirmation code parameters: - description: Request params in: body name: request required: true schema: - $ref: '#/definitions/main.MagicLinkPayload' + $ref: '#/definitions/main.LoginFlowPayload' produces: - application/json responses: diff --git a/cmd/eskimo-hut/auth.go b/cmd/eskimo-hut/auth.go index 5aaab3cf..72dd4394 100644 --- a/cmd/eskimo-hut/auth.go +++ b/cmd/eskimo-hut/auth.go @@ -25,8 +25,7 @@ func (s *service) setupAuthRoutes(router *server.Router) { Group("v1w"). POST("auth/sendSignInLinkToEmail", server.RootHandler(s.SendSignInLinkToEmail)). POST("auth/refreshTokens", server.RootHandler(s.RegenerateTokens)). - POST("auth/signInWithEmailLink", server.RootHandler(s.SignIn)). - POST("auth/getConfirmationStatus", server.RootHandler(s.Status)). + POST("auth/signInWithConfirmationCode", server.RootHandler(s.SignIn)). POST("auth/getMetadata", server.RootHandler(s.Metadata)). POST("auth/processFaceRecognitionResult", server.RootHandler(s.ProcessFaceRecognitionResult)). POST("auth/getValidUserForPhoneNumberMigration", server.RootHandler(s.GetValidUserForPhoneNumberMigration)) @@ -88,23 +87,26 @@ func (s *service) SendSignInLinkToEmail( //nolint:gocritic,funlen // . // SignIn godoc // // @Schemes -// @Description Finishes login flow using magic link +// @Description Finishes login flow using confirmation code // @Tags Auth // @Produce json -// @Param request body MagicLinkPayload true "Request params" +// @Param request body LoginFlowPayload true "Request params" // @Success 200 {object} any // @Failure 400 {object} server.ErrorResponse "if invalid or expired payload provided" // @Failure 404 {object} server.ErrorResponse "if email does not need to be confirmed by magic link" // @Failure 422 {object} server.ErrorResponse "if syntax fails" // @Failure 500 {object} server.ErrorResponse // @Failure 504 {object} server.ErrorResponse "if request times out" -// @Router /auth/signInWithEmailLink [POST]. -func (s *service) SignIn( //nolint:gocritic //. +// @Router /auth/signInWithConfirmationCode [POST]. +// +//nolint:gocritic,funlen //. +func (s *service) SignIn( ctx context.Context, - req *server.Request[MagicLinkPayload, any], -) (*server.Response[any], *server.Response[server.ErrorResponse]) { - if err := s.authEmailLinkClient.SignIn(ctx, req.Data.EmailToken, req.Data.ConfirmationCode); err != nil { - err = errors.Wrapf(err, "finish login using magic link failed for %#v", req.Data) + req *server.Request[LoginFlowPayload, Status], +) (*server.Response[Status], *server.Response[server.ErrorResponse]) { + tokens, emailConfirmed, err := s.authEmailLinkClient.SignIn(ctx, req.Data.LoginSession, req.Data.ConfirmationCode) + if err != nil { + err = errors.Wrapf(err, "finish login using confirmation code %#v", req.Data) switch { case errors.Is(err, users.ErrRaceCondition): return nil, server.BadRequest(err, raceConditionErrorCode) @@ -117,9 +119,9 @@ func (s *service) SignIn( //nolint:gocritic //. case errors.Is(err, emaillink.ErrNoConfirmationRequired): return nil, server.NotFound(err, confirmationCodeNotFoundErrorCode) case errors.Is(err, emaillink.ErrExpiredToken): - return nil, server.BadRequest(err, linkExpiredErrorCode) + return nil, server.BadRequest(err, expiredLoginSessionErrorCode) case errors.Is(err, emaillink.ErrInvalidToken): - return nil, server.BadRequest(err, invalidOTPCodeErrorCode) + return nil, server.BadRequest(err, invalidLoginSessionErrorCode) case errors.Is(err, emaillink.ErrConfirmationCodeAttemptsExceeded): return nil, server.BadRequest(err, confirmationCodeAttemptsExceededErrorCode) case errors.Is(err, emaillink.ErrConfirmationCodeWrong): @@ -128,8 +130,14 @@ func (s *service) SignIn( //nolint:gocritic //. return nil, server.Unexpected(err) } } + if emailConfirmed { + tokens = nil + } - return server.OK[any](), nil + return server.OK(&Status{ + RefreshedToken: &RefreshedToken{Tokens: tokens}, + EmailConfirmed: emailConfirmed, + }), nil } // RegenerateTokens godoc @@ -173,53 +181,6 @@ func (s *service) RegenerateTokens( //nolint:gocritic // . return server.OK(&RefreshedToken{Tokens: tokens}), nil } -// Status godoc -// -// @Schemes -// @Description Status of the auth process -// @Tags Auth -// @Accept json -// @Produce json -// @Param request body StatusArg true "Request params" -// @Success 200 {object} Auth -// @Failure 422 {object} server.ErrorResponse "if syntax fails" -// @Failure 403 {object} server.ErrorResponse "if invalid or expired login session provided" -// @Failure 404 {object} server.ErrorResponse "if login session not found or confirmation code verifying failed" -// @Failure 500 {object} server.ErrorResponse -// @Failure 504 {object} server.ErrorResponse "if request times out" -// @Router /auth/getConfirmationStatus [POST]. -func (s *service) Status( //nolint:gocritic // . - ctx context.Context, - req *server.Request[StatusArg, Status], -) (*server.Response[Status], *server.Response[server.ErrorResponse]) { - tokens, emailConfirmed, err := s.authEmailLinkClient.Status(ctx, req.Data.LoginSession) - if err != nil { - err = errors.Wrapf(err, "failed to get status for: %#v", req.Data) - if err != nil { - switch { - case errors.Is(err, emaillink.ErrNoPendingLoginSession): - return nil, server.NotFound(err, noPendingLoginSessionErrorCode) - case errors.Is(err, emaillink.ErrStatusNotVerified): - return server.OK(&Status{}), nil - case errors.Is(err, emaillink.ErrInvalidToken): - return nil, server.Forbidden(err) - case errors.Is(err, emaillink.ErrExpiredToken): - return nil, server.Forbidden(err) - default: - return nil, server.Unexpected(err) - } - } - } - if emailConfirmed { - tokens = nil - } - - return server.OK(&Status{ - RefreshedToken: &RefreshedToken{Tokens: tokens}, - EmailConfirmed: emailConfirmed, - }), nil -} - // Metadata godoc // // @Schemes diff --git a/cmd/eskimo-hut/contract.go b/cmd/eskimo-hut/contract.go index 73c41a31..74d99b0a 100644 --- a/cmd/eskimo-hut/contract.go +++ b/cmd/eskimo-hut/contract.go @@ -140,6 +140,10 @@ type ( EmailToken string `json:"emailToken" required:"true" allowUnauthorized:"true" example:"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM"` //nolint:lll // . ConfirmationCode string `json:"confirmationCode" required:"true" example:"999"` } + LoginFlowPayload struct { + LoginSession string `json:"loginSession" required:"true" allowUnauthorized:"true" example:"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2ODQzMjQ0NTYsImV4cCI6MTcxNTg2MDQ1NiwiYXVkIjoiIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIm90cCI6IjUxMzRhMzdkLWIyMWEtNGVhNi1hNzk2LTAxOGIwMjMwMmFhMCJ9.q3xa8Gwg2FVCRHLZqkSedH3aK8XBqykaIy85rRU40nM"` //nolint:lll // . + ConfirmationCode string `json:"confirmationCode" required:"true" example:"999"` + } RefreshToken struct { Authorization string `header:"Authorization" swaggerignore:"true" required:"true" allowForbiddenWriteOperation:"true" allowUnauthorized:"true"` } @@ -182,17 +186,15 @@ const ( emailAlreadySetErrorCode = "EMAIL_ALREADY_SET" accountLostErrorCode = "ACCOUNT_LOST" - linkExpiredErrorCode = "EXPIRED_LINK" - invalidOTPCodeErrorCode = "INVALID_OTP" - dataMismatchErrorCode = "DATA_MISMATCH" + expiredLoginSessionErrorCode = "EXPIRED_LOGIN_SESSION" + invalidLoginSessionErrorCode = "INVALID_LOGIN_SESSION" + dataMismatchErrorCode = "DATA_MISMATCH" confirmationCodeNotFoundErrorCode = "CONFIRMATION_CODE_NOT_FOUND" confirmationCodeAttemptsExceededErrorCode = "CONFIRMATION_CODE_ATTEMPTS_EXCEEDED" confirmationCodeWrongErrorCode = "CONFIRMATION_CODE_WRONG" tooManyRequests = "TOO_MANY_REQUESTS" - noPendingLoginSessionErrorCode = "NO_PENDING_LOGIN_SESSION" - quizUnknownQuestionNumErrorCode = "QUIZ_UNKNOWN_QUESTION_NUM" quizDisbledErrorCode = "QUIZ_DISABLED" diff --git a/cmd/eskimo-hut/users.go b/cmd/eskimo-hut/users.go index d6da64c3..09d2df5d 100644 --- a/cmd/eskimo-hut/users.go +++ b/cmd/eskimo-hut/users.go @@ -257,7 +257,7 @@ func validateHiddenProfileElements(req *server.Request[ModifyUserRequestBody, Mo } } if !valid { - invalidHiddenProfileElement = &actual //nolint:gosec,revive,exportloopref // Its safe. Its the last iteration. + invalidHiddenProfileElement = &actual //nolint:revive,exportloopref // Its safe. Its the last iteration. break } diff --git a/cmd/fixture/fixture.go b/cmd/fixture/fixture.go index 8287d311..b193606e 100644 --- a/cmd/fixture/fixture.go +++ b/cmd/fixture/fixture.go @@ -122,6 +122,7 @@ func (b *TestConnectorsBridge) GetUser(ctx context.Context, tb testing.TB, userI return body, status } +//nolint:canonicalheader // . func (*TestConnectorsBridge) RequestHeaders(token string, contentTypeOrClientIP ...string) http.Header { reqHeaders := http.Header{} reqHeaders.Set("Authorization", fmt.Sprintf("Bearer %v", token)) diff --git a/cmd/scripts/merge_firebase_phone_login_with_ice_email_login/merge_firebase_phone_login_with_ice_email_login.go b/cmd/scripts/merge_firebase_phone_login_with_ice_email_login/merge_firebase_phone_login_with_ice_email_login.go index 9d7523b5..f45379a0 100644 --- a/cmd/scripts/merge_firebase_phone_login_with_ice_email_login/merge_firebase_phone_login_with_ice_email_login.go +++ b/cmd/scripts/merge_firebase_phone_login_with_ice_email_login/merge_firebase_phone_login_with_ice_email_login.go @@ -73,7 +73,7 @@ func main() { continue } - usr := record //nolint:copyloopvar // We need the copy here to use in goroutine next. + usr := record wg.Add(1) concurrencyGuard <- struct{}{} go func() { diff --git a/go.mod b/go.mod index d7641158..9e66bab2 100644 --- a/go.mod +++ b/go.mod @@ -4,52 +4,55 @@ go 1.22 require ( dario.cat/mergo v1.0.0 - github.com/PuerkitoBio/goquery v1.9.1 - github.com/goccy/go-json v0.10.2 + github.com/PuerkitoBio/goquery v1.9.2 + github.com/goccy/go-json v0.10.3 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/uuid v1.6.0 github.com/hashicorp/go-multierror v1.1.1 github.com/ice-blockchain/go-tarantool-client v0.0.0-20230327200757-4fc71fa3f7bb github.com/ice-blockchain/wintr v1.135.0 - github.com/imroc/req/v3 v3.43.3 + github.com/imroc/req/v3 v3.43.5 github.com/ip2location/ip2location-go/v9 v9.7.0 github.com/jackc/pgx/v5 v5.5.5 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.9.0 github.com/swaggo/swag v1.16.3 - github.com/testcontainers/testcontainers-go v0.30.0 + github.com/testcontainers/testcontainers-go v0.31.0 github.com/zeebo/xxh3 v1.0.2 golang.org/x/mod v0.17.0 - golang.org/x/net v0.24.0 + golang.org/x/net v0.25.0 ) require ( - cloud.google.com/go v0.112.2 // indirect + cloud.google.com/go v0.113.0 // indirect + cloud.google.com/go/auth v0.4.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/firestore v1.15.0 // indirect - cloud.google.com/go/iam v1.1.7 // indirect - cloud.google.com/go/longrunning v0.5.6 // indirect - cloud.google.com/go/storage v1.40.0 // indirect + cloud.google.com/go/iam v1.1.8 // indirect + cloud.google.com/go/longrunning v0.5.7 // indirect + cloud.google.com/go/storage v1.41.0 // indirect firebase.google.com/go/v4 v4.14.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.12.2 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Microsoft/hcsshim v0.12.3 // indirect github.com/andybalholm/brotli v1.1.0 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/bytedance/sonic v1.11.5-alpha3 // indirect + github.com/bytedance/sonic v1.11.7 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cloudflare/circl v1.3.7 // indirect - github.com/cloudwego/base64x v0.1.2 // indirect + github.com/cloudflare/circl v1.3.8 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect - github.com/containerd/containerd v1.7.15 // indirect + github.com/containerd/containerd v1.7.17 // indirect github.com/containerd/errdefs v0.1.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v26.0.1+incompatible // indirect + github.com/docker/docker v26.1.3+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -57,8 +60,8 @@ require ( github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/georgysavva/scany/v2 v2.1.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.9.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/gin-gonic/gin v1.10.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -66,17 +69,17 @@ require ( github.com/go-openapi/swag v0.23.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.19.0 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/goccy/go-reflect v1.2.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/pprof v0.0.0-20240416155748-26353dc0451f // indirect + github.com/google/pprof v0.0.0-20240521024322-9665fa269a30 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -99,16 +102,16 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/morikuni/aec v1.0.0 // indirect - github.com/onsi/ginkgo/v2 v2.17.1 // indirect + github.com/onsi/ginkgo/v2 v2.18.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.12 // indirect - github.com/pelletier/go-toml/v2 v2.2.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.42.0 // indirect - github.com/refraction-networking/utls v1.6.4 // indirect + github.com/quic-go/quic-go v0.44.0 // indirect + github.com/refraction-networking/utls v1.6.6 // indirect github.com/rs/zerolog v1.32.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -126,34 +129,34 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/twmb/franz-go v1.16.1 // indirect github.com/twmb/franz-go/pkg/kadm v1.11.0 // indirect - github.com/twmb/franz-go/pkg/kmsg v1.7.0 // indirect + github.com/twmb/franz-go/pkg/kmsg v1.8.0 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect - go.opentelemetry.io/otel v1.25.0 // indirect - go.opentelemetry.io/otel/metric v1.25.0 // indirect - go.opentelemetry.io/otel/trace v1.25.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.7.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect - golang.org/x/oauth2 v0.19.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.173.0 // indirect + golang.org/x/tools v0.21.0 // indirect + google.golang.org/api v0.181.0 // indirect google.golang.org/appengine/v2 v2.0.6 // indirect - google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/genproto v0.0.0-20240521202816-d264139d666e // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/uint128 v1.3.0 // indirect diff --git a/go.sum b/go.sum index a02d32a3..211be635 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,20 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= +cloud.google.com/go v0.113.0 h1:g3C70mn3lWfckKBiCVsAshabrDg01pQ0pnX1MNtnMkA= +cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8= +cloud.google.com/go/auth v0.4.2 h1:sb0eyLkhRtpq5jA+a8KWw0W70YcdVca7KJ8TM0AFYDg= +cloud.google.com/go/auth v0.4.2/go.mod h1:Kqvlz1cf1sNA0D+sYJnkPQOP+JMHkuHeIgVmCRtZOLc= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= +cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= +cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= +cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= +cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= +cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= +cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= firebase.google.com/go/v4 v4.14.0 h1:Tc9jWzMUApUFUA5UUx/HcBeZ+LPjlhG2vNRfWJrcMwU= @@ -22,29 +26,30 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.12.2 h1:AcXy+yfRvrx20g9v7qYaJv5Rh+8GaHOS6b8G6Wx/nKs= -github.com/Microsoft/hcsshim v0.12.2/go.mod h1:RZV12pcHCXQ42XnlQ3pz6FZfmrC1C+R4gaOHhRNML1g= -github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI= -github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.12.3 h1:LS9NXqXhMoqNCplK1ApmVSfB4UnVLRDWRapB6EIlxE0= +github.com/Microsoft/hcsshim v0.12.3/go.mod h1:Iyl1WVpZzr+UkzjekHZbV8o5Z9ZkxNGx6CtY2Qg/JVQ= +github.com/PuerkitoBio/goquery v1.9.2 h1:4/wZksC3KgkQw7SQgkKotmKljk0M6V8TUvA8Wb4yPeE= +github.com/PuerkitoBio/goquery v1.9.2/go.mod h1:GHPCaP0ODyyxqcNoFGYlAprUFH81NuRPd0GX3Zu2Mvk= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/bytedance/sonic v1.11.5-alpha3 h1:sxepBMt+5mb0YQZOAzXYOiUQ5D4+EWqOfnklxyZRofQ= -github.com/bytedance/sonic v1.11.5-alpha3/go.mod h1:NYwWBqBszgmWi7sDnT+p6Yj1Jwf2gzpN0UY7R3VYH+c= +github.com/bytedance/sonic v1.11.7 h1:k/l9p1hZpNIMJSk37wL9ltkcpqLfIho1vYthi4xT2t4= +github.com/bytedance/sonic v1.11.7/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/cloudwego/base64x v0.1.2-alpha3/go.mod h1:jSIw/Ru6lyma8wP6MbQJ+7ZAgXkHthTuuClUTUxcYwY= -github.com/cloudwego/base64x v0.1.2 h1:+/5aoq3u+nG+oaQRlnFg/oWu788X6KzDpquxoNJ6Vt0= -github.com/cloudwego/base64x v0.1.2/go.mod h1:jSIw/Ru6lyma8wP6MbQJ+7ZAgXkHthTuuClUTUxcYwY= +github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= +github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -95,11 +100,11 @@ github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/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/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= @@ -116,16 +121,16 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o 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.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= -github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms= github.com/goccy/go-reflect v1.2.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfmR66YhFtE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -165,10 +170,10 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20240416155748-26353dc0451f h1:WpZiq8iqvGjJ3m3wzAVKL6+0vz7VkE79iSy9GII00II= -github.com/google/pprof v0.0.0-20240416155748-26353dc0451f/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/pprof v0.0.0-20240521024322-9665fa269a30 h1:r6YdmbD41tGHeCWDyHF691LWtL7D1iSTyJaKejTWwVU= +github.com/google/pprof v0.0.0-20240521024322-9665fa269a30/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -176,8 +181,8 @@ 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.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= +github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= 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= @@ -189,8 +194,8 @@ github.com/ice-blockchain/go-tarantool-client v0.0.0-20230327200757-4fc71fa3f7bb github.com/ice-blockchain/go-tarantool-client v0.0.0-20230327200757-4fc71fa3f7bb/go.mod h1:ZsQU7i3mxhgBBu43Oev7WPFbIjP4TniN/b1UPNGbrq8= github.com/ice-blockchain/wintr v1.135.0 h1:jT+Jh6SAkYpYrrQrSLHh4nEGVwNYzosd5KjDZBE/25Q= github.com/ice-blockchain/wintr v1.135.0/go.mod h1:pVCNepiemtnyQ9j/oxchD3uZVP2B8v2LcFSb4e6/U/s= -github.com/imroc/req/v3 v3.43.3 h1:WdZhpUev9THtuwEZsW2LOYacl12fm7IkB7OgACv40+k= -github.com/imroc/req/v3 v3.43.3/go.mod h1:SQIz5iYop16MJxbo8ib+4LnostGCok8NQf8ToyQc2xA= +github.com/imroc/req/v3 v3.43.5 h1:fL7dOEfld+iEv1rwnIxseJz2/Y7JZ/HgbAURLZkat80= +github.com/imroc/req/v3 v3.43.5/go.mod h1:SQIz5iYop16MJxbo8ib+4LnostGCok8NQf8ToyQc2xA= github.com/ip2location/ip2location-go/v9 v9.7.0 h1:ipwl67HOWcrw+6GOChkEXcreRQR37NabqBd2ayYa4Q0= github.com/ip2location/ip2location-go/v9 v9.7.0/go.mod h1:MPLnsKxwQlvd2lBNcQCsLoyzJLDBFizuO67wXXdzoyI= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -249,18 +254,18 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8= -github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/ginkgo/v2 v2.18.0 h1:W9Y7IWXxPUpAit9ieMOLI7PJZGaW22DTKgiVAuhDTLc= +github.com/onsi/ginkgo/v2 v2.18.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= -github.com/pelletier/go-toml/v2 v2.2.1 h1:9TA9+T8+8CUCO2+WYnDLCgrYi9+omqKXyjDtosvtEhg= -github.com/pelletier/go-toml/v2 v2.2.1/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -271,10 +276,10 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.42.0 h1:uSfdap0eveIl8KXnipv9K7nlwZ5IqLlYOpJ58u5utpM= -github.com/quic-go/quic-go v0.42.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= -github.com/refraction-networking/utls v1.6.4 h1:aeynTroaYn7y+mFtqv8D0bQ4bw0y9nJHneGxJ7lvRDM= -github.com/refraction-networking/utls v1.6.4/go.mod h1:2VL2xfiqgFAZtJKeUTlf+PSYFs3Eu7km0gCtXJ3m8zs= +github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= +github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= +github.com/refraction-networking/utls v1.6.6 h1:igFsYBUJPYM8Rno9xUuDoM5GQrVEqY4llzEXOkL43Ig= +github.com/refraction-networking/utls v1.6.6/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -306,7 +311,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE 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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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= @@ -330,8 +334,8 @@ github.com/twmb/franz-go v1.16.1 h1:rpWc7fB9jd7TgmCyfxzenBI+QbgS8ZfJOUQE+tzPtbE= github.com/twmb/franz-go v1.16.1/go.mod h1:/pER254UPPGp/4WfGqRi+SIRGE50RSQzVubQp6+N4FA= github.com/twmb/franz-go/pkg/kadm v1.11.0 h1:FfeWJ0qadntFpAcQt8JzNXW4dijjytZNLrzJuzzzuxA= github.com/twmb/franz-go/pkg/kadm v1.11.0/go.mod h1:qrhkdH+SWS3ivmbqOgHbpgVHamhaKcjH0UM+uOp0M1A= -github.com/twmb/franz-go/pkg/kmsg v1.7.0 h1:a457IbvezYfA5UkiBvyV3zj0Is3y1i8EJgqjJYoij2E= -github.com/twmb/franz-go/pkg/kmsg v1.7.0/go.mod h1:se9Mjdt0Nwzc9lnjJ0HyDtLyBnaBDAd7pCje47OhSyw= +github.com/twmb/franz-go/pkg/kmsg v1.8.0 h1:lAQB9Z3aMrIP9qF9288XcFf/ccaSxEitNA1CDTEIeTA= +github.com/twmb/franz-go/pkg/kmsg v1.8.0/go.mod h1:HzYEb8G3uu5XevZbtU0dVbkphaKTHk0X68N5ka4q6mU= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= @@ -347,34 +351,34 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0 h1:zvpPXY7RfYAGSdYQLjp6zxdJNSYD/+FFoCTQN9IPxBs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.50.0/go.mod h1:BMn8NB1vsxTljvuorms2hyOs8IBuuBEq0pl7ltOfy30= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= -go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= -go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= -go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= -go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= -go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0 h1:9l89oX4ba9kHbBol3Xin3leYJ+252h0zszDtBwyKe2A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.52.0/go.mod h1:XLZfZboOJWHNKUv7eH0inh0E9VV6eWDFB/9yJyTLPp0= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= -golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -398,11 +402,11 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -427,8 +431,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -439,8 +443,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -453,16 +457,16 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/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= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.173.0 h1:fz6B7GWYWLS/HfruiTsRYVKQQApJ6vasTYWAK6+Qo8g= -google.golang.org/api v0.173.0/go.mod h1:ins7pTzjeBPQ3SdC/plzki6d/dQWwAWy8qVZ4Vgkzl8= +google.golang.org/api v0.181.0 h1:rPdjwnWgiPPOJx3IcSAQ2III5aX5tCer6wMpa/xmZi4= +google.golang.org/api v0.181.0/go.mod h1:MnQ+M0CFsfUwA5beZ+g/vCBCPXvtmZwRz2qzZk8ih1k= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw= @@ -470,19 +474,19 @@ google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 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 v0.0.0-20240415180920-8c6c420018be h1:g4aX8SUFA8V5F4LrSY5EclyGYw1OZN4HS1jTyjB9ZDc= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be/go.mod h1:FeSdT5fk+lkxatqJP38MsUicGqHax5cLtmy/6TAuxO4= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20240521202816-d264139d666e h1:axIBUGXSVho2zB+3tJj8l9Qvm/El5vVYPYqhGA5PmJM= +google.golang.org/genproto v0.0.0-20240521202816-d264139d666e/go.mod h1:gOvX/2dWTqh+u3+IHjFeCxinlz5AZ5qhOufbQPub/dE= +google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e h1:SkdGTrROJl2jRGT/Fxv5QUf9jtdKCQh4KQJXbXVLAi0= +google.golang.org/genproto/googleapis/api v0.0.0-20240521202816-d264139d666e/go.mod h1:LweJcLbyVij6rCex8YunD8DYR5VDonap/jYl3ZRxcIU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= 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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= 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= @@ -494,8 +498,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=