Skip to content

Commit 94e632d

Browse files
committed
chore: Updated the app to use a custom backend.
1 parent c479456 commit 94e632d

115 files changed

Lines changed: 3442 additions & 5838 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/i18n/de/authentication.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"title": "Konto löschen",
2222
"message": "Möchten Sie Ihr Konto wirklich löschen? Bitte beachten Sie, dass wir eine erneute Authentifizierung verlangen, da es sich um eine sensible Aktion handelt."
2323
},
24-
"firebaseAuthenticationProvider": {
24+
"firebaseAuthenticationProvider(map)": {
2525
"email": {
2626
"name": "E-Mail",
2727
"description": "Verwenden Sie Ihre E-Mail zur Anmeldung. Es ist kein Passwort erforderlich, ein Bestätigungslink wird Ihnen per E-Mail zugesandt."

lib/i18n/en/authentication.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"title": "Delete account",
2222
"message": "Do you really want to delete your account ? Note that, because it is a sensitive action, we require you to reauthenticate before proceeding."
2323
},
24-
"firebaseAuthenticationProvider": {
24+
"firebaseAuthenticationProvider(map)": {
2525
"email": {
2626
"name": "Email",
2727
"description": "Use your email to login. No password required, a confirmation link will be sent."

lib/i18n/fr/authentication.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"title": "Supprimer votre compte",
2222
"message": "Voulez-vous vraiment supprimer votre compte ? Veuillez noter que, parce qu'il s'agit d'une action sensible, vous devez vous réautentifier avant de continuer."
2323
},
24-
"firebaseAuthenticationProvider": {
24+
"firebaseAuthenticationProvider(map)": {
2525
"email": {
2626
"name": "Email",
2727
"description": "Utilisez votre adresse mail pour vous connecter. Pas besoin de mot de passe, nous vous enverrons un lien de confirmation."

lib/i18n/it/authentication.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"title": "Elimina account",
2222
"message": "Vuoi davvero eliminare il tuo account? Nota che, trattandosi di un'azione sensibile, ti chiediamo di autenticarti nuovamente prima di procedere."
2323
},
24-
"firebaseAuthenticationProvider": {
24+
"firebaseAuthenticationProvider(map)": {
2525
"email": {
2626
"name": "Email",
2727
"description": "Usa la tua email per accedere. Non è richiesta password, verrà inviato un link di conferma."

lib/i18n/pt/authentication.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"title": "Excluir conta",
2222
"message": "Deseja realmente excluir sua conta? Como esta é uma ação sensível, exigimos que você se reautentique antes de continuar."
2323
},
24-
"firebaseAuthenticationProvider": {
24+
"firebaseAuthenticationProvider(map)": {
2525
"email": {
2626
"name": "E-mail",
2727
"description": "Use seu e-mail para fazer login. Não é necessária senha, um link de confirmação será enviado."

lib/main.dart

Lines changed: 26 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,33 @@
11
import 'dart:async';
22

3-
import 'package:firebase_core/firebase_core.dart';
4-
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
53
import 'package:flutter/foundation.dart';
64
import 'package:flutter/material.dart';
75
import 'package:flutter/services.dart';
86
import 'package:flutter_localizations/flutter_localizations.dart';
97
import 'package:flutter_riverpod/flutter_riverpod.dart';
10-
import 'package:open_authenticator/app.dart';
11-
import 'package:open_authenticator/firebase_options.dart';
8+
import 'package:open_authenticator/app.dart'; // TODO
129
import 'package:open_authenticator/i18n/translations.g.dart';
1310
import 'package:open_authenticator/model/app_links.dart';
14-
import 'package:open_authenticator/model/authentication/providers/email_link.dart';
15-
import 'package:open_authenticator/model/authentication/providers/provider.dart';
11+
import 'package:open_authenticator/model/backend/authentication/providers/provider.dart';
1612
import 'package:open_authenticator/model/crypto.dart';
1713
import 'package:open_authenticator/model/settings/show_intro.dart';
1814
import 'package:open_authenticator/model/settings/theme.dart';
19-
import 'package:open_authenticator/model/storage/online.dart';
20-
import 'package:open_authenticator/model/totp/repository.dart';
15+
import 'package:open_authenticator/model/totp/limit.dart';
2116
import 'package:open_authenticator/pages/contributor_plan_paywall/page.dart';
2217
import 'package:open_authenticator/pages/home/page.dart';
2318
import 'package:open_authenticator/pages/intro/page.dart';
2419
import 'package:open_authenticator/pages/scan.dart';
2520
import 'package:open_authenticator/pages/settings/page.dart';
2621
import 'package:open_authenticator/pages/totp.dart';
27-
import 'package:open_authenticator/utils/account.dart';
28-
import 'package:open_authenticator/utils/firebase.dart';
29-
import 'package:open_authenticator/utils/firebase_app_check/firebase_app_check.dart';
3022
import 'package:open_authenticator/utils/platform.dart';
3123
import 'package:open_authenticator/utils/rate_my_app.dart';
32-
import 'package:open_authenticator/utils/result.dart';
24+
import 'package:open_authenticator/utils/utils.dart';
3325
import 'package:open_authenticator/widgets/centered_circular_progress_indicator.dart';
3426
import 'package:open_authenticator/widgets/dialog/totp_limit.dart';
3527
import 'package:open_authenticator/widgets/unlock_challenge.dart';
3628
import 'package:open_authenticator/widgets/waiting_overlay.dart';
3729
import 'package:rate_my_app/rate_my_app.dart';
30+
import 'package:sentry_flutter/sentry_flutter.dart';
3831
import 'package:simple_secure_storage/simple_secure_storage.dart';
3932
import 'package:window_manager/window_manager.dart';
4033

@@ -57,32 +50,20 @@ Future<void> main() async {
5750
},
5851
);
5952
}
60-
if (isFirebaseSupported) {
61-
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
62-
await FirebaseAppCheck.instance.activate();
63-
if (isCrashlyticsEnabled) {
64-
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;
65-
PlatformDispatcher.instance.onError = (error, stack) {
66-
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
67-
return true;
68-
};
69-
}
70-
}
7153
await LocaleSettings.useDeviceLocale();
72-
runApp(
54+
void appRunner() => runApp(
7355
ProviderScope(
74-
retry: (retryCount, error) {
75-
if (error is NotLoggedInException) {
76-
return null;
77-
}
78-
79-
return ProviderContainer.defaultRetry(retryCount, error);
80-
},
8156
child: TranslationProvider(
8257
child: const OpenAuthenticatorApp(),
8358
),
8459
),
8560
);
61+
return kSentryEnabled
62+
? SentryFlutter.init(
63+
(options) => options..dsn = App.sentryDsn,
64+
appRunner: appRunner,
65+
)
66+
: appRunner();
8667
}
8768

8869
/// Allows to initialize [SimpleSecureStorage] with parameters that depend on the current mode.
@@ -285,8 +266,8 @@ class _RouteWidgetState extends ConsumerState<_RouteWidget> {
285266
return;
286267
}
287268
Uri uri = next.value!;
288-
if (uri.host == Uri.parse(App.firebaseLoginUrl).host) {
289-
WidgetsBinding.instance.addPostFrameCallback((_) => handleLoginLink(uri));
269+
if (uri.scheme == 'openauthenticator') {
270+
WidgetsBinding.instance.addPostFrameCallback((_) => handleAppLink(uri));
290271
return;
291272
}
292273
if (uri.scheme == 'otpauth') {
@@ -330,27 +311,18 @@ class _RouteWidgetState extends ConsumerState<_RouteWidget> {
330311
child: widget.child,
331312
);
332313

333-
/// Handles a login link.
334-
Future<void> handleLoginLink(Uri loginLink) async {
335-
if (!mounted) {
336-
return;
337-
}
338-
Uri? link = Uri.tryParse(loginLink.queryParameters['link'] ?? '');
339-
if (link == null) {
340-
return;
341-
}
342-
String? mode = link.queryParameters['mode'];
343-
switch (mode) {
344-
case 'signIn':
345-
String? emailToConfirm = await ref.read(emailLinkConfirmationStateProvider.future);
346-
if (emailToConfirm == null || !mounted) {
347-
return;
348-
}
349-
Result<AuthenticationObject> result = await ref.read(emailLinkConfirmationStateProvider.notifier).confirm(context, link.toString());
350-
if (mounted) {
351-
AccountUtils.handleAuthenticationResult(context, ref, result);
352-
}
353-
break;
314+
/// Handles an in-app link.
315+
Future<void> handleAppLink(Uri appLink) async {
316+
if (appLink.host == 'auth' && appLink.path.startsWith('/provider/') && appLink.pathSegments.length >= 2) {
317+
String? providerId = appLink.pathSegments[1];
318+
AuthenticationProvider? provider = ref.read(authenticationProvider(providerId));
319+
if (provider == null) {
320+
return;
321+
}
322+
await showWaitingOverlay(
323+
context,
324+
future: provider.onRedirectReceived(appLink),
325+
);
354326
}
355327
}
356328

lib/model/app_links.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,9 @@ class AppLinksListener extends AsyncNotifier<Uri?> {
1515
ref.onDispose(subscription.cancel);
1616
return appLinks.getInitialLink();
1717
}
18+
19+
/// Manually provides the [uri].
20+
void provideLink(Uri uri) {
21+
state = AsyncData(uri);
22+
}
1823
}

lib/model/app_unlock/method.dart

Lines changed: 0 additions & 183 deletions
This file was deleted.

0 commit comments

Comments
 (0)