TF-571 Check OIDC is available
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
|
||||
import 'package:model/model.dart';
|
||||
|
||||
abstract class AuthenticationOIDCDataSource {
|
||||
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart';
|
||||
|
||||
class AuthenticationOIDCDataSourceImpl extends AuthenticationOIDCDataSource {
|
||||
|
||||
final OIDCHttpClient _oidcHttpClient;
|
||||
|
||||
AuthenticationOIDCDataSourceImpl(this._oidcHttpClient);
|
||||
|
||||
@override
|
||||
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
|
||||
return Future.sync(() async {
|
||||
final oidcResponse = await _oidcHttpClient.checkOIDCIsAvailable(oidcRequest);
|
||||
return oidcResponse != null;
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/network/endpoint.dart';
|
||||
|
||||
extension ServicePathExtension on ServicePath {
|
||||
String generateEndpointPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
ServicePath generateOIDCPath(Uri baseUrl) {
|
||||
return ServicePath(baseUrl.origin + Endpoint.oidc + path);
|
||||
}
|
||||
|
||||
ServicePath withQueryParameters(List<QueryParameter> queryParameters) {
|
||||
if (queryParameters.isEmpty) {
|
||||
return this;
|
||||
}
|
||||
return ServicePath('$path?${queryParameters
|
||||
.map((query) => '${query.queryName}=${query.queryValue}').join('&')}');
|
||||
}
|
||||
|
||||
ServicePath withPathParameter([String? pathParameter]) {
|
||||
if (pathParameter == null || pathParameter.isEmpty) {
|
||||
return this;
|
||||
}
|
||||
|
||||
return ServicePath('$path/$pathParameter');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import 'package:core/data/network/config/service_path.dart';
|
||||
|
||||
class Endpoint {
|
||||
static const String oidc = '/oidc';
|
||||
|
||||
static final ServicePath webFinger = ServicePath('/.well-known/webfinger');
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/network/endpoint.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/extensions/service_path_extension.dart';
|
||||
|
||||
class OIDCHttpClient {
|
||||
|
||||
final DioClient _dioClient;
|
||||
|
||||
OIDCHttpClient(this._dioClient);
|
||||
|
||||
Future<OIDCResponse?> checkOIDCIsAvailable(OIDCRequest oidcRequest) async {
|
||||
final result = await _dioClient.get(
|
||||
Endpoint.webFinger
|
||||
.generateOIDCPath(Uri.parse(oidcRequest.baseUrl))
|
||||
.withQueryParameters([
|
||||
StringQueryParameter('resource', oidcRequest.resourceUrl),
|
||||
StringQueryParameter('rel', oidcRequest.relUrl),
|
||||
])
|
||||
.generateEndpointPath()
|
||||
);
|
||||
log('OIDCHttpClient::checkOIDCIsAvailable(): RESULT: $result');
|
||||
if (result is Map<String, dynamic>) {
|
||||
return OIDCResponse.fromJson(result);
|
||||
} else {
|
||||
return OIDCResponse.fromJson(jsonDecode(result));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import 'package:model/oidc/request/oidc_request.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
|
||||
|
||||
class AuthenticationOIDCRepositoryImpl extends AuthenticationOIDCRepository {
|
||||
final AuthenticationOIDCDataSource _oidcDataSource;
|
||||
|
||||
AuthenticationOIDCRepositoryImpl(this._oidcDataSource);
|
||||
|
||||
@override
|
||||
Future<bool> checkOIDCIsAvailable(OIDCRequest oidcRequest) {
|
||||
return _oidcDataSource.checkOIDCIsAvailable(oidcRequest);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user