connector: send BAD_CREDENTIALS if error is an auth error

Previously, we were going into UNKNOWN_ERROR too aggressively

Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
Sumner Evans
2024-12-04 23:49:49 -07:00
parent 6c68351e1f
commit 80f17d5fbd
+33 -25
View File
@@ -376,26 +376,38 @@ func connectTelegramClient(ctx context.Context, client *telegram.Client) (contex
} }
func (t *TelegramClient) onDead() { func (t *TelegramClient) onDead() {
prevState := t.userLogin.BridgeState.GetPrev().StateEvent
if slices.Contains([]status.BridgeStateEvent{
status.StateTransientDisconnect,
status.StateBadCredentials,
status.StateLoggedOut,
status.StateUnknownError,
}, prevState) {
t.userLogin.Log.Warn().
Str("prev_state", string(prevState)).
Msg("client is dead, not sending transient disconnect, because already in an error state")
return
}
t.userLogin.BridgeState.Send(status.BridgeState{ t.userLogin.BridgeState.Send(status.BridgeState{
StateEvent: status.StateTransientDisconnect, StateEvent: status.StateTransientDisconnect,
Message: "Telegram client disconnected", Message: "Telegram client disconnected",
}) })
} }
func (t *TelegramClient) sendBadCredentials(message string) { func (t *TelegramClient) sendBadCredentialsOrUnknownError(err error) {
t.userLogin.BridgeState.Send(status.BridgeState{ if auth.IsUnauthorized(err) {
StateEvent: status.StateBadCredentials, t.userLogin.BridgeState.Send(status.BridgeState{
Error: "tg-no-auth", StateEvent: status.StateBadCredentials,
Message: message, Error: "tg-no-auth",
}) Message: humanise.Error(err),
} })
} else {
func (t *TelegramClient) sendUnknownError(err error) { t.userLogin.BridgeState.Send(status.BridgeState{
t.userLogin.BridgeState.Send(status.BridgeState{ StateEvent: status.StateUnknownError,
StateEvent: status.StateUnknownError, Error: "tg-unknown-error",
Error: "tg-unknown-error", Message: humanise.Error(err),
Message: humanise.Error(err), })
}) }
} }
func (t *TelegramClient) onConnectionStateChange(reason string) func() { func (t *TelegramClient) onConnectionStateChange(reason string) func() {
@@ -419,7 +431,7 @@ func (t *TelegramClient) onConnectionStateChange(reason string) func() {
t.Disconnect() t.Disconnect()
t.Connect(ctx) t.Connect(ctx)
} else { } else {
t.sendUnknownError(err) t.sendBadCredentialsOrUnknownError(err)
} }
} else if authStatus.Authorized { } else if authStatus.Authorized {
t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected})
@@ -430,7 +442,7 @@ func (t *TelegramClient) onConnectionStateChange(reason string) func() {
} }
func (t *TelegramClient) onAuthError(ctx context.Context, err error) { func (t *TelegramClient) onAuthError(ctx context.Context, err error) {
t.sendBadCredentials(humanise.Error(err)) t.sendBadCredentialsOrUnknownError(err)
t.userLogin.Metadata.(*UserLoginMetadata).ResetOnLogout() t.userLogin.Metadata.(*UserLoginMetadata).ResetOnLogout()
t.client = nil t.client = nil
t.updatesManager.Reset() t.updatesManager.Reset()
@@ -441,25 +453,21 @@ func (t *TelegramClient) onAuthError(ctx context.Context, err error) {
func (t *TelegramClient) Connect(ctx context.Context) { func (t *TelegramClient) Connect(ctx context.Context) {
if !t.userLogin.Metadata.(*UserLoginMetadata).Session.HasAuthKey() { if !t.userLogin.Metadata.(*UserLoginMetadata).Session.HasAuthKey() {
t.sendBadCredentials("User does not have an auth key") t.sendBadCredentialsOrUnknownError(errors.New("user does not have an auth key"))
return return
} }
var err error var err error
ctx, t.clientCancel, err = connectTelegramClient(ctx, t.client) ctx, t.clientCancel, err = connectTelegramClient(ctx, t.client)
if err != nil { if err != nil {
t.sendUnknownError(err) t.sendBadCredentialsOrUnknownError(err)
return return
} }
go func() { go func() {
err = t.updatesManager.Run(ctx, t.client.API(), t.telegramUserID, updates.AuthOptions{}) err = t.updatesManager.Run(ctx, t.client.API(), t.telegramUserID, updates.AuthOptions{})
if err != nil { if err != nil {
zerolog.Ctx(ctx).Err(err).Msg("failed to run updates manager") zerolog.Ctx(ctx).Err(err).Msg("failed to run updates manager")
if auth.IsUnauthorized(err) { t.sendBadCredentialsOrUnknownError(err)
t.sendBadCredentials(err.Error())
} else {
t.sendUnknownError(err)
}
t.clientCancel() t.clientCancel()
} }
}() }()
@@ -467,9 +475,9 @@ func (t *TelegramClient) Connect(ctx context.Context) {
// Update the logged-in user's ghost info (this also updates the user // Update the logged-in user's ghost info (this also updates the user
// login's remote name and profile). // login's remote name and profile).
if me, err := t.client.Self(ctx); err != nil { if me, err := t.client.Self(ctx); err != nil {
t.sendUnknownError(err) t.sendBadCredentialsOrUnknownError(err)
} else if _, err := t.updateGhost(ctx, t.telegramUserID, me); err != nil { } else if _, err := t.updateGhost(ctx, t.telegramUserID, me); err != nil {
t.sendUnknownError(err) t.sendBadCredentialsOrUnknownError(err)
} else { } else {
t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) t.userLogin.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected})
} }