diff --git a/auth/flutter b/auth/flutter index 367f9ea16b..41456452f2 160000 --- a/auth/flutter +++ b/auth/flutter @@ -1 +1 @@ -Subproject commit 367f9ea16bfae1ca451b9cc27c1366870b187ae2 +Subproject commit 41456452f29d64e8deb623a3c927524bcf9f111b diff --git a/auth/ios/Podfile.lock b/auth/ios/Podfile.lock index dc7d8d0436..f19b34f5f7 100644 --- a/auth/ios/Podfile.lock +++ b/auth/ios/Podfile.lock @@ -214,7 +214,7 @@ SPEC CHECKSUMS: file_picker: ce3938a0df3cc1ef404671531facef740d03f920 file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808 fk_user_agent: 1f47ec39291e8372b1d692b50084b0d54103c545 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b flutter_inappwebview: acd4fc0f012cefd09015000c241137d82f01ba62 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 diff --git a/auth/lib/ui/passkey_page.dart b/auth/lib/ui/passkey_page.dart index 6efc234741..e02a7fd82c 100644 --- a/auth/lib/ui/passkey_page.dart +++ b/auth/lib/ui/passkey_page.dart @@ -4,6 +4,7 @@ import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/ente_theme_data.dart'; import 'package:ente_auth/l10n/l10n.dart'; import 'package:ente_auth/services/user_service.dart'; +import 'package:ente_auth/utils/dialog_util.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:uni_links/uni_links.dart'; @@ -49,14 +50,27 @@ class _PasskeyPageState extends State { if (!context.mounted || Configuration.instance.hasConfiguredAccount() || link == null) { + _logger.warning( + 'ignored deeplink: contextMounted ${context.mounted} hasConfiguredAccount ${Configuration.instance.hasConfiguredAccount()}', + ); return; } - if (mounted && link.toLowerCase().startsWith("enteauth://passkey")) { - final uri = Uri.parse(link).queryParameters['response']; - // response to json - final res = utf8.decode(base64.decode(uri!)); - final json = jsonDecode(res) as Map; - await UserService.instance.onPassKeyVerified(context, json); + try { + if (mounted && link.toLowerCase().startsWith("enteauth://passkey")) { + final String? uri = Uri.parse(link).queryParameters['response']; + String base64String = uri!.toString(); + while (base64String.length % 4 != 0) { + base64String += '='; + } + final res = utf8.decode(base64.decode(base64String)); + final json = jsonDecode(res) as Map; + await UserService.instance.onPassKeyVerified(context, json); + } else { + _logger.info('ignored deeplink: $link mounted $mounted'); + } + } catch (e, s) { + _logger.severe('passKey: failed to handle deeplink', e, s); + showGenericErrorDialog(context: context).ignore(); } } diff --git a/auth/pubspec.lock b/auth/pubspec.lock index 87635f80ed..809aacb1b0 100644 --- a/auth/pubspec.lock +++ b/auth/pubspec.lock @@ -262,10 +262,10 @@ packages: dependency: transitive description: name: coverage - sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.6.4" cross_file: dependency: transitive description: @@ -751,30 +751,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.6.2" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" - url: "https://pub.dev" - source: hosted - version: "10.0.0" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 - url: "https://pub.dev" - source: hosted - version: "2.0.1" lints: dependency: "direct dev" description: @@ -835,26 +811,26 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.10.0" mime: dependency: transitive description: @@ -955,10 +931,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.8.3" path_drawing: dependency: transitive description: @@ -1584,10 +1560,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "11.10.0" watcher: dependency: transitive description: @@ -1596,6 +1572,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -1653,5 +1637,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.10.0" diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index c86f1b0b35..2b6bdf795c 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 2.0.34+234 +version: 2.0.35+235 publish_to: none environment: diff --git a/mobile/lib/ui/account/passkey_page.dart b/mobile/lib/ui/account/passkey_page.dart index 25c2c76056..ad838c868f 100644 --- a/mobile/lib/ui/account/passkey_page.dart +++ b/mobile/lib/ui/account/passkey_page.dart @@ -6,6 +6,7 @@ import 'package:photos/core/configuration.dart'; import 'package:photos/ente_theme_data.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/services/user_service.dart'; +import "package:photos/utils/dialog_util.dart"; import 'package:uni_links/uni_links.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -49,20 +50,27 @@ class _PasskeyPageState extends State { if (!context.mounted || Configuration.instance.hasConfiguredAccount() || link == null) { + _logger.warning( + 'ignored deeplink: contextMounted ${context.mounted} hasConfiguredAccount ${Configuration.instance.hasConfiguredAccount()}', + ); return; } - if (mounted && link.toLowerCase().startsWith("ente://passkey")) { - final uri = Uri.parse(link).queryParameters['response']; - - // response to json - final res = utf8.decode(base64.decode(uri!)); - final json = jsonDecode(res) as Map; - - try { + try { + if (mounted && link.toLowerCase().startsWith("ente://passkey")) { + final String? uri = Uri.parse(link).queryParameters['response']; + String base64String = uri!.toString(); + while (base64String.length % 4 != 0) { + base64String += '='; + } + final res = utf8.decode(base64.decode(base64String)); + final json = jsonDecode(res) as Map; await UserService.instance.onPassKeyVerified(context, json); - } catch (e) { - _logger.severe(e); + } else { + _logger.info('ignored deeplink: $link mounted $mounted'); } + } catch (e, s) { + _logger.severe('passKey: failed to handle deeplink', e, s); + showGenericErrorDialog(context: context, error: e).ignore(); } }