diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 85f7a3712..ed3e61c92 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -52,7 +52,7 @@ Future connectToHomeserverFlow( if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { await oidcLoginFlow(client, context, signUp); } else if (supportsSso) { - await ssoLoginFlow(client, context, signUp); + await ssoLoginFlow(client, context, signUp, loginFlows); } else { if (signUp && regLink != null) { await launchUrlString(regLink); diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart index 1721a2ead..7f7a924d4 100644 --- a/lib/utils/sign_in_flows/sso_login.dart +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -3,20 +3,52 @@ import 'package:flutter/material.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; Future ssoLoginFlow( Client client, BuildContext context, bool signUp, + List loginFlows, ) async { final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true); Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl); + final ssoProviders = + (loginFlows + .firstWhere((flow) => flow.type == 'm.login.sso') + .additionalProperties['identity_providers'] + as List?) + ?.map( + (json) => ( + name: json['name'] as String, + id: json['id'] as String, + brand: json['brand'] as String?, + icon: json['icon'] as String?, + ), + ) + .toList(); + + final provider = ssoProviders == null + ? null + : await showModalActionPopup( + context: context, + title: L10n.of(context).logInTo(client.homeserver!.host), + actions: ssoProviders + .map( + (provider) => + AdaptiveModalAction(label: provider.name, value: provider), + ) + .toList(), + ); + final url = client.homeserver!.replace( - path: '/_matrix/client/v3/login/sso/redirect', + path: + '/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}', queryParameters: { 'redirectUrl': redirectUrl.toString(), 'action': signUp ? 'register' : 'login', diff --git a/recommended_homeservers.json b/recommended_homeservers.json index fe785234f..fef601847 100644 --- a/recommended_homeservers.json +++ b/recommended_homeservers.json @@ -19,6 +19,17 @@ "All", "English" ] + }, + { + "name": "tchncs.de", + "website": "https://tchncs.de", + "description": "A general homeserver. Owner also hosts other FOSS services.", + "reg_method": "oidc", + "languages": [ + "All", + "English", + "Deutsch" + ] } ] } \ No newline at end of file