Skip to content

Commit 5b11363

Browse files
committed
fix: Fixed some user related errors being incorrectly sent to Sentry.
1 parent ba57d4b commit 5b11363

12 files changed

Lines changed: 99 additions & 19 deletions

File tree

lib/i18n/de/error.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
},
4040
"backend": {
4141
"invalidJsonResponse": "Ungültige Antwort vom $route (HTTP $statusCode) : $body.",
42+
"expiredCode": "Der Bestätigungscode ist abgelaufen. Bitte versuchen Sie sich erneut einzuloggen.",
4243
"noEmailToConfirm": "Keine E-Mail zum Bestätigen.",
4344
"invalidSession": "Ihre Sitzung ist ungültig. Bitte versuchen Sie sich erneut einzuloggen.",
4445
"noSession": "Sie müssen sich einloggen, um fortzufahren.",

lib/i18n/en/error.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
},
4040
"backend": {
4141
"invalidJsonResponse": "Invalid response from $route (HTTP $statusCode) : $body.",
42+
"expiredCode": "The verification code has expired. Please try to log-in again.",
4243
"noEmailToConfirm": "No email to confirm.",
4344
"invalidSession": "Your session is invalid. Please try to log-in again.",
4445
"noSession": "You must be logged-in to proceed.",

lib/i18n/fr/error.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"backend": {
4141
"invalidJsonResponse": "Réponse invalide du $route (HTTP $statusCode) : $body.",
4242
"noEmailToConfirm": "Aucun email à confirmer.",
43+
"expiredCode": "Le code de vérification a expiré. Veuillez réessayer de vous connecter.",
4344
"invalidSession": "Votre session est invalide. Veuillez réessayer de vous connecter.",
4445
"noSession": "Vous devez être connecté pour continuer.",
4546
"emailAlreadySent": "Un email a déjà été envoyé à cette adresse. Veuillez vérifier votre boîte mail ou réessayer dans quelques minutes.",

lib/i18n/it/error.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"backend": {
4141
"invalidJsonResponse": "Risposta non valida dal $route (HTTP $statusCode) : $body.",
4242
"noEmailToConfirm": "Nessun email da confermare.",
43+
"expiredCode": "Il codice di verifica è scaduto. Riprova a effettuare il login.",
4344
"invalidSession": "La tua sessione non è valida. Riprova a effettuare il login.",
4445
"noSession": "Devi effettuare il login per continuare.",
4546
"emailAlreadySent": "Un email è già stata inviata a questa indirizzo. Controlla la tua posta elettronica o riprova tra qualche minuto.",

lib/i18n/pt/error.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"backend": {
4141
"invalidJsonResponse": "Resposta inválida do $route (HTTP $statusCode) : $body.",
4242
"noEmailToConfirm": "Nenhum e-mail para confirmar.",
43+
"expiredCode": "O código de verificação expirou. Tente novamente para fazer login.",
4344
"invalidSession": "Sua sessão é inválida. Tente novamente para fazer login.",
4445
"noSession": "Você deve estar logado para prosseguir.",
4546
"emailAlreadySent": "Um e-mail já foi enviado para este endereço. Verifique sua caixa de entrada ou tente novamente em alguns minutos.",

lib/main.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,16 @@ class _RouteWidgetState extends ConsumerState<_RouteWidget> {
245245
}
246246
Uri uri = next.value!;
247247
if (uri.scheme == 'openauthenticator') {
248+
if (!ref.read(appLinksListenerProvider.notifier).consumeLink(uri)) {
249+
return;
250+
}
248251
WidgetsBinding.instance.addPostFrameCallback((_) => handleAppLink(uri));
249252
return;
250253
}
251254
if (uri.scheme == 'otpauth') {
255+
if (!ref.read(appLinksListenerProvider.notifier).consumeLink(uri)) {
256+
return;
257+
}
252258
WidgetsBinding.instance.addPostFrameCallback((_) => handleTotpLink(uri));
253259
return;
254260
}
@@ -319,7 +325,7 @@ class _RouteWidgetState extends ConsumerState<_RouteWidget> {
319325
if (mounted) {
320326
context.handleResult(
321327
result,
322-
successMessage: result.valueOrNull?.localizedMessage,
328+
successMessage: (value) => value.localizedMessage,
323329
);
324330
}
325331
}

lib/model/backend/authentication/providers/email.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ class EmailAuthenticationProvider extends AuthenticationProvider {
7676
),
7777
);
7878
if (response is! ResultSuccess<EmailConfirmResponse>) {
79+
if (response is ResultError<EmailConfirmResponse> && response.exception is ExpiredCodeError) {
80+
await _ref.read(emailConfirmationStateProvider.notifier)._cancelConfirmation();
81+
}
7982
return response.to((_) => null);
8083
}
8184
Uri uri = response.value.url;

lib/model/backend/authentication/providers/provider.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:open_authenticator/i18n/localizable_exception.dart';
66
import 'package:open_authenticator/i18n/translations.g.dart';
77
import 'package:open_authenticator/model/backend/authentication/session.dart';
88
import 'package:open_authenticator/model/backend/backend.dart';
9+
import 'package:open_authenticator/model/backend/request/error.dart';
910
import 'package:open_authenticator/model/backend/request/request.dart';
1011
import 'package:open_authenticator/model/backend/request/response.dart';
1112
import 'package:open_authenticator/model/backend/user.dart';

lib/model/backend/backend.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ class BackendClient extends AsyncNotifier<Map<String, String>> {
117117
return ResultError(
118118
exception: ex,
119119
stackTrace: stackTrace,
120+
sendToSentry: switch (ex) {
121+
SocketException(:final osError) => osError?.errorCode != 7,
122+
TimeoutException() => false,
123+
ProviderUserAlreadyExists() => false,
124+
ExpiredCodeError() => false,
125+
InvalidVerificationCodeError() => false,
126+
InvalidAuthorizationCodeError() => false,
127+
_ => true,
128+
},
120129
);
121130
}
122131
}

lib/model/backend/request/error.dart

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,32 @@ class BackendRequestError extends LocalizableException {
5959
statusCode: statusCode,
6060
message: message,
6161
);
62+
case ExpiredCodeError.kErrorCode:
63+
return ExpiredCodeError._(
64+
route: route,
65+
statusCode: statusCode,
66+
message: message,
67+
);
6268
case InvalidVerificationCodeError.kErrorCode:
6369
return InvalidVerificationCodeError._(
6470
route: route,
6571
statusCode: statusCode,
6672
message: message,
6773
);
74+
case InvalidAuthorizationCodeError.kErrorCode:
75+
return InvalidAuthorizationCodeError._(
76+
route: route,
77+
statusCode: statusCode,
78+
message: message,
79+
);
6880
case InvalidAppVersionError.kErrorCode:
6981
return InvalidAppVersionError._(
7082
route: route,
7183
statusCode: statusCode,
7284
message: message,
7385
);
74-
case _ProviderUserAlreadyExists.kErrorCode:
75-
return _ProviderUserAlreadyExists._(
86+
case ProviderUserAlreadyExists.kErrorCode:
87+
return ProviderUserAlreadyExists._(
7688
route: route,
7789
statusCode: statusCode,
7890
message: message,
@@ -158,6 +170,22 @@ class InvalidSessionError extends BackendRequestError {
158170
);
159171
}
160172

173+
/// Thrown when the verification code is expired.
174+
class ExpiredCodeError extends BackendRequestError {
175+
/// The expired code error code.
176+
static const String kErrorCode = 'expiredCode';
177+
178+
/// Creates a new expired code error instance.
179+
ExpiredCodeError._({
180+
required super.route,
181+
required super.statusCode,
182+
super.message,
183+
}) : super._(
184+
localizedErrorMessage: translations.error.backend.expiredCode,
185+
code: kErrorCode,
186+
);
187+
}
188+
161189
/// Thrown when the verification code is invalid.
162190
class InvalidVerificationCodeError extends BackendRequestError {
163191
/// The invalid verification code error code.
@@ -174,6 +202,22 @@ class InvalidVerificationCodeError extends BackendRequestError {
174202
);
175203
}
176204

205+
/// Thrown when the provider authorization code is invalid.
206+
class InvalidAuthorizationCodeError extends BackendRequestError {
207+
/// The invalid authorization code error code.
208+
static const String kErrorCode = 'invalidAuthorizationCode';
209+
210+
/// Creates a new invalid authorization code error instance.
211+
InvalidAuthorizationCodeError._({
212+
required super.route,
213+
required super.statusCode,
214+
super.message,
215+
}) : super._(
216+
localizedErrorMessage: translations.error.backend.invalidVerificationCode,
217+
code: kErrorCode,
218+
);
219+
}
220+
177221
/// Thrown when the app version is invalid.
178222
class InvalidAppVersionError extends BackendRequestError {
179223
/// The invalid app version error code.
@@ -191,12 +235,12 @@ class InvalidAppVersionError extends BackendRequestError {
191235
}
192236

193237
/// Thrown when the provider user already exists.
194-
class _ProviderUserAlreadyExists extends BackendRequestError {
238+
class ProviderUserAlreadyExists extends BackendRequestError {
195239
/// The provider user already exists error code.
196240
static const String kErrorCode = 'providerUserAlreadyExists';
197241

198242
/// Creates a new expired session error instance.
199-
_ProviderUserAlreadyExists._({
243+
ProviderUserAlreadyExists._({
200244
required super.route,
201245
required super.statusCode,
202246
super.message,

0 commit comments

Comments
 (0)