From 1e4147e31c46f61198772d5f11d5879655b7d1a0 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sat, 4 Nov 2023 19:08:11 +0100 Subject: [PATCH] fix: SSO with no identity providers --- .../homeserver_picker/homeserver_picker.dart | 21 ++++++++++++------- .../homeserver_picker_view.dart | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart index e29cabcc..18b6e5ca 100644 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -113,19 +113,23 @@ class HomeserverPickerController extends State { Map? _rawLoginTypes; - void ssoLoginAction(String id) async { + void ssoLoginAction(String? id) async { final redirectUrl = kIsWeb ? '${html.window.origin!}/web/auth.html' : isDefaultPlatform ? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login' : 'http://localhost:3001//login'; - final url = - '${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}'; + + final url = Matrix.of(context).getLoginClient().homeserver!.replace( + path: '/_matrix/client/r0/login/sso/redirect${id == null ? '' : '/$id'}', + queryParameters: {'redirectUrl': redirectUrl}, + ); + final urlScheme = isDefaultPlatform ? Uri.parse(redirectUrl).scheme : "http://localhost:3001"; final result = await FlutterWebAuth2.authenticate( - url: url, + url: url.toString(), callbackUrlScheme: urlScheme, ); final token = Uri.parse(result).queryParameters['loginToken']; @@ -144,9 +148,12 @@ class HomeserverPickerController extends State { List? get identityProviders { final loginTypes = _rawLoginTypes; if (loginTypes == null) return null; - final rawProviders = loginTypes.tryGetList('flows')!.singleWhere( - (flow) => flow['type'] == AuthenticationTypes.sso, - )['identity_providers']; + final List? rawProviders = loginTypes.tryGetList('flows')!.singleWhere( + (flow) => flow['type'] == AuthenticationTypes.sso, + )['identity_providers'] ?? + [ + {'id': null}, + ]; final list = (rawProviders as List) .map((json) => IdentityProvider.fromJson(json)) .toList(); diff --git a/lib/pages/homeserver_picker/homeserver_picker_view.dart b/lib/pages/homeserver_picker/homeserver_picker_view.dart index 6d25e9ea..70156999 100644 --- a/lib/pages/homeserver_picker/homeserver_picker_view.dart +++ b/lib/pages/homeserver_picker/homeserver_picker_view.dart @@ -124,7 +124,7 @@ class HomeserverPickerView extends StatelessWidget { L10n.of(context)!.singlesignon, ), onPressed: () => - controller.ssoLoginAction(provider.id!), + controller.ssoLoginAction(provider.id), ), ), ],