From df592b3f385c57017dde82b664741113d350cb9a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Thu, 15 Oct 2026 18:30:12 -0400 Subject: [PATCH] add better OAuth error Fixes #88 --- lib/controllers/client.dart | 3 ++- lib/models/gomuks_exception.dart | 11 +++++++++++ lib/widgets/pages/select_server.dart | 25 ++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 lib/models/gomuks_exception.dart diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index cd9fb92..3a3e33b 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -15,6 +15,7 @@ import "package:nexus/models/event.dart"; import "package:nexus/models/event_context.dart"; import "package:nexus/models/mentions_response.dart"; import "package:nexus/models/gomuks_config.dart"; +import "package:nexus/models/gomuks_exception.dart"; import "package:nexus/models/oauth_auth_code_response.dart"; import "package:nexus/models/open_graph_data.dart"; import "package:nexus/models/paginate.dart"; @@ -112,7 +113,7 @@ class ClientController extends AsyncNotifier { final json = response.buf.toJsonAndFree(); if (response.command.cast().toDartString() == "error") { - throw json; + throw GomuksException(json.toString()); } return json; diff --git a/lib/models/gomuks_exception.dart b/lib/models/gomuks_exception.dart new file mode 100644 index 0000000..dbd3f61 --- /dev/null +++ b/lib/models/gomuks_exception.dart @@ -0,0 +1,11 @@ +class GomuksException implements Exception { + final String message; + const GomuksException(this.message); + + /// The Matrix error code, if gomuks returned an error in the form `M_CODE (HTTP 404): message` + String? get errorCode => + RegExp(r"^(M_[A-Z_]+)").firstMatch(message)?.group(1); + + @override + String toString() => message; +} diff --git a/lib/widgets/pages/select_server.dart b/lib/widgets/pages/select_server.dart index 431b7d4..f9f6498 100644 --- a/lib/widgets/pages/select_server.dart +++ b/lib/widgets/pages/select_server.dart @@ -8,7 +8,9 @@ import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_id.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/main.dart"; +import "package:nexus/models/gomuks_exception.dart"; import "package:nexus/models/homeserver.dart"; +import "package:nexus/models/oauth_auth_code_response.dart"; import "package:nexus/widgets/pages/settings.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/divider_text.dart"; @@ -48,9 +50,26 @@ class const SelectServerPage({super.key}) extends HookConsumerWidget { if (context.mounted) { Future tryLogin(Uri url) async { - final codeResponse = await ref.watch( - AuthUrlController.provider(url).future, - ); + final OAuthAuthCodeResponse codeResponse; + try { + codeResponse = await ref.watch( + AuthUrlController.provider(url).future, + ); + } on GomuksException catch (error) { + if (error.errorCode != "M_UNRECOGNIZED") rethrow; + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "${url.host} doesn't support OAuth login, which Nexus requires. Try a different homeserver, or ask your homeserver's admin to enable OAuth.", + style: .new(color: theme.colorScheme.onErrorContainer), + ), + backgroundColor: theme.colorScheme.errorContainer, + ), + ); + } + return; + } await ref.read(LaunchHelper.provider).launchUrl(codeResponse.url);