Skip to content

Commit f880851

Browse files
committed
TF-4049 Pre-fill OIDC login form
1 parent 05b11fb commit f880851

File tree

14 files changed

+138
-51
lines changed

14 files changed

+138
-51
lines changed

lib/features/email/presentation/utils/email_utils.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:core/presentation/state/failure.dart';
22
import 'package:core/presentation/state/success.dart';
33
import 'package:core/utils/app_logger.dart';
4+
import 'package:core/utils/mail/domain.dart';
45
import 'package:core/utils/mail/mail_address.dart';
56
import 'package:get/get_utils/src/get_utils/get_utils.dart';
67
import 'package:dartz/dartz.dart';
@@ -274,4 +275,24 @@ class EmailUtils {
274275
return '';
275276
}
276277
}
278+
279+
static MailAddress? getMailAddress({required String ownerEmail}) {
280+
try {
281+
return MailAddress.validateAddress(ownerEmail);
282+
} catch (e) {
283+
if (GetUtils.isEmail(ownerEmail)) {
284+
final listPart = ownerEmail.split('@');
285+
if (listPart.length == 2) {
286+
return MailAddress(
287+
localPart: listPart.first,
288+
domain: Domain.of((listPart.last)),
289+
);
290+
}
291+
}
292+
return null;
293+
}
294+
}
295+
296+
static String? getLocalPartEmail(String emailAddress) =>
297+
getMailAddress(ownerEmail: emailAddress)?.localPart;
277298
}

lib/features/login/data/datasource/authentication_oidc_datasource.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ abstract class AuthenticationOIDCDataSource {
88

99
Future<OIDCDiscoveryResponse> discoverOIDC(OIDCConfiguration oidcConfiguration);
1010

11-
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List<String> scopes);
11+
Future<TokenOIDC> getTokenOIDC(
12+
String clientId,
13+
String redirectUrl,
14+
String discoveryUrl,
15+
List<String> scopes, {
16+
String? loginHint,
17+
});
1218

1319
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
1420

lib/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,21 @@ class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
5656
}
5757

5858
@override
59-
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List<String> scopes) {
59+
Future<TokenOIDC> getTokenOIDC(
60+
String clientId,
61+
String redirectUrl,
62+
String discoveryUrl,
63+
List<String> scopes, {
64+
String? loginHint,
65+
}) {
6066
return Future.sync(() async {
61-
return await _authenticationClient.getTokenOIDC(clientId, redirectUrl, discoveryUrl, scopes);
67+
return await _authenticationClient.getTokenOIDC(
68+
clientId,
69+
redirectUrl,
70+
discoveryUrl,
71+
scopes,
72+
loginHint: loginHint,
73+
);
6274
}).catchError(_exceptionThrower.throwException);
6375
}
6476

lib/features/login/data/network/authentication_client/authentication_client_base.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ abstract class AuthenticationClientBase {
1313
List<String> scopes);
1414

1515
Future<TokenOIDC> getTokenOIDC(
16-
String clientId,
17-
String redirectUrl,
18-
String discoveryUrl,
19-
List<String> scopes);
16+
String clientId,
17+
String redirectUrl,
18+
String discoveryUrl,
19+
List<String> scopes, {
20+
String? loginHint,
21+
});
2022

2123
Future<TokenOIDC> refreshingTokensOIDC(
2224
String clientId,

lib/features/login/data/network/authentication_client/authentication_client_interaction_mixin.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,16 @@ mixin AuthenticationClientInteractionMixin {
5959
String clientId,
6060
String redirectUrl,
6161
String discoveryUrl,
62-
List<String> scopes,
63-
) {
62+
List<String> scopes, {
63+
String? loginHint,
64+
}) {
6465
return AuthorizationTokenRequest(
6566
clientId,
6667
redirectUrl,
6768
discoveryUrl: discoveryUrl,
6869
scopes: scopes,
6970
externalUserAgent: getExternalUserAgent(),
71+
loginHint: loginHint,
7072
);
7173
}
7274

lib/features/login/data/network/authentication_client/authentication_client_mobile.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ class AuthenticationClientMobile with AuthenticationClientInteractionMixin
2727
String clientId,
2828
String redirectUrl,
2929
String discoveryUrl,
30-
List<String> scopes,
31-
) async {
30+
List<String> scopes, {
31+
String? loginHint,
32+
}) async {
3233
final authorizationTokenRequest = getAuthorizationTokenRequest(
3334
clientId,
3435
redirectUrl,
3536
discoveryUrl,
3637
scopes,
38+
loginHint: loginHint,
3739
);
3840
final authorizationTokenResponse = await _appAuth.authorizeAndExchangeCode(
3941
authorizationTokenRequest,

lib/features/login/data/network/authentication_client/authentication_client_web.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ class AuthenticationClientWeb with AuthenticationClientInteractionMixin
2525
String clientId,
2626
String redirectUrl,
2727
String discoveryUrl,
28-
List<String> scopes,
29-
) async {
28+
List<String> scopes, {
29+
String? loginHint,
30+
}) async {
3031
final authorizationTokenRequest = getAuthorizationTokenRequest(
3132
clientId,
3233
redirectUrl,
3334
discoveryUrl,
3435
scopes,
36+
loginHint: loginHint,
3537
);
3638
final authorizationTokenResponse = await _appAuthWeb.authorizeAndExchangeCode(
3739
authorizationTokenRequest,

lib/features/login/data/repository/authentication_oidc_repository_impl.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,20 @@ class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
2828
}
2929

3030
@override
31-
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List<String> scopes) {
32-
return _oidcDataSource.getTokenOIDC(clientId, redirectUrl, discoveryUrl, scopes);
31+
Future<TokenOIDC> getTokenOIDC(
32+
String clientId,
33+
String redirectUrl,
34+
String discoveryUrl,
35+
List<String> scopes, {
36+
String? loginHint,
37+
}) {
38+
return _oidcDataSource.getTokenOIDC(
39+
clientId,
40+
redirectUrl,
41+
discoveryUrl,
42+
scopes,
43+
loginHint: loginHint,
44+
);
3345
}
3446

3547
@override

lib/features/login/domain/repository/authentication_oidc_repository.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ abstract class AuthenticationOIDCRepository {
88

99
Future<OIDCDiscoveryResponse> discoverOIDC(OIDCConfiguration oidcConfiguration);
1010

11-
Future<TokenOIDC> getTokenOIDC(String clientId, String redirectUrl, String discoveryUrl, List<String> scopes);
11+
Future<TokenOIDC> getTokenOIDC(
12+
String clientId,
13+
String redirectUrl,
14+
String discoveryUrl,
15+
List<String> scopes, {
16+
String? loginHint,
17+
});
1218

1319
Future<void> persistTokenOIDC(TokenOIDC tokenOidc);
1420

lib/features/login/domain/usecases/get_oidc_configuration_interactor.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:core/presentation/state/failure.dart';
22
import 'package:core/presentation/state/success.dart';
33
import 'package:core/utils/app_logger.dart';
44
import 'package:dartz/dartz.dart';
5+
import 'package:model/oidc/oidc_configuration.dart';
56
import 'package:model/oidc/response/oidc_response.dart';
67
import 'package:tmail_ui_user/features/login/domain/model/base_url_oidc_response.dart';
78
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
@@ -12,12 +13,20 @@ class GetOIDCConfigurationInteractor {
1213

1314
GetOIDCConfigurationInteractor(this._oidcRepository);
1415

15-
Stream<Either<Failure, Success>> execute(OIDCResponse oidcResponse) async* {
16+
Stream<Either<Failure, Success>> execute(
17+
OIDCResponse oidcResponse, {
18+
String? loginHint,
19+
}) async* {
1620
try {
1721
yield Right<Failure, Success>(GetOIDCConfigurationLoading());
1822
final oidcConfiguration = await _oidcRepository.getOIDCConfiguration(oidcResponse);
19-
await _oidcRepository.persistOidcConfiguration(oidcConfiguration);
20-
yield Right<Failure, Success>(GetOIDCConfigurationSuccess(oidcConfiguration));
23+
final configWithLoginHint = oidcConfiguration.copyWidth(
24+
loginHint: loginHint,
25+
);
26+
await _oidcRepository.persistOidcConfiguration(configWithLoginHint);
27+
yield Right<Failure, Success>(
28+
GetOIDCConfigurationSuccess(configWithLoginHint),
29+
);
2130
} catch (e) {
2231
logError('$runtimeType::execute():oidcResponse = ${oidcResponse.runtimeType} | Exception = $e');
2332
if (oidcResponse is BaseUrlOidcResponse) {

0 commit comments

Comments
 (0)