2024-06-21 19:12:29 +00:00
|
|
|
import 'dart:convert';
|
2024-05-22 20:48:44 +00:00
|
|
|
import 'dart:developer';
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
import 'package:auto_route/auto_route.dart';
|
|
|
|
|
import 'package:dio/dio.dart';
|
|
|
|
|
import 'package:dio/io.dart';
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
|
import 'package:mnemo_cards/domain/router/app_router.gr.dart';
|
2024-06-21 19:12:29 +00:00
|
|
|
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
|
2024-05-22 20:48:44 +00:00
|
|
|
import 'package:package_info_plus/package_info_plus.dart';
|
|
|
|
|
import 'package:http_certificate_pinning/http_certificate_pinning.dart';
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
import 'package:collection/collection.dart';
|
|
|
|
|
|
|
|
|
|
import '../../di/locator.dart';
|
|
|
|
|
import '../../main.dart';
|
|
|
|
|
|
|
|
|
|
class DioProvider {
|
|
|
|
|
late final Dio _dio;
|
|
|
|
|
|
|
|
|
|
DioProvider();
|
|
|
|
|
|
|
|
|
|
Dio get dio => _dio;
|
|
|
|
|
|
|
|
|
|
Future<DioProvider> init() async {
|
2024-06-21 19:12:29 +00:00
|
|
|
PackageInfo appPackageInfo = await PackageInfo.fromPlatform();
|
|
|
|
|
String appVersion = appPackageInfo.version;
|
2024-05-22 20:48:44 +00:00
|
|
|
|
|
|
|
|
_dio = Dio()
|
|
|
|
|
..interceptors.addAll([
|
|
|
|
|
// CertificatePinningInterceptor(allowedSHAFingerprints: [
|
|
|
|
|
// '28:21:5C:FB:54:4F:4A:DC:F8:5E:4C:FE:44:C8:E0:7B:0B:09:9D:D0:A9:FA:60:1D:3B:03:FF:EC:25:1A:C5:CC',
|
|
|
|
|
// ]),
|
|
|
|
|
InterceptorsWrapper(onError: (exception, handler) {
|
|
|
|
|
if (kDebugMode) {
|
|
|
|
|
log(exception.requestOptions.path ?? '');
|
|
|
|
|
log(exception.toString());
|
|
|
|
|
final snackBar = SnackBar(
|
|
|
|
|
content: Text(
|
|
|
|
|
'${exception.requestOptions.path}\n${exception.requestOptions.data}\n${exception.toString()}'),
|
|
|
|
|
);
|
|
|
|
|
ScaffoldMessenger.of(scaffoldKey.currentContext!)
|
|
|
|
|
.showSnackBar(snackBar);
|
|
|
|
|
}
|
|
|
|
|
// if (exception.response?.statusCode == 401 &&
|
|
|
|
|
// !locator.userManager.hasUser) {
|
|
|
|
|
// try {
|
|
|
|
|
// if (!AutoRouter.of(scaffoldKey.currentContext!)
|
|
|
|
|
// .isRouteActive(ProfilePage.name)) {
|
|
|
|
|
// AutoRouter.of(scaffoldKey.currentContext!).push(
|
|
|
|
|
// PageRouteInfo(ProfilePage.name),
|
|
|
|
|
// );
|
|
|
|
|
// }
|
|
|
|
|
// } catch (e) {}
|
|
|
|
|
// }
|
|
|
|
|
handler.next(exception);
|
|
|
|
|
}),
|
2024-06-21 19:12:29 +00:00
|
|
|
InterceptorsWrapper(onRequest: (request, handler) async {
|
|
|
|
|
final String? requestToken;
|
|
|
|
|
try {
|
|
|
|
|
requestToken = TokenGenerator.generateRequestToken(
|
|
|
|
|
requestBody: (request.data as Object?)?.encode() ?? '',
|
|
|
|
|
appVersion: appVersion,
|
|
|
|
|
requestPath: request.uri.path,
|
|
|
|
|
userToken: await locator.userManager.getAuthToken(),
|
|
|
|
|
);
|
|
|
|
|
} catch (e, s) {
|
|
|
|
|
log(
|
|
|
|
|
'Exception while generating request token',
|
|
|
|
|
error: e,
|
|
|
|
|
stackTrace: s,
|
|
|
|
|
);
|
|
|
|
|
throw Exception(
|
|
|
|
|
'Exception while generating request token ${e} ${s}',
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
request.headers = {
|
|
|
|
|
...request.headers,
|
|
|
|
|
AppHeaders.appVersion: appVersion,
|
|
|
|
|
AppHeaders.requestToken: requestToken,
|
|
|
|
|
};
|
2024-05-22 20:48:44 +00:00
|
|
|
handler.next(request);
|
|
|
|
|
})
|
|
|
|
|
]);
|
|
|
|
|
|
2024-06-21 19:12:29 +00:00
|
|
|
if (!kIsWeb) {
|
|
|
|
|
final securityContext = SecurityContext(withTrustedRoots: true);
|
|
|
|
|
|
|
|
|
|
// securityContext.setTrustedCertificatesBytes(Certificates.crt);
|
|
|
|
|
// securityContext.usePrivateKeyBytes(Certificates.key);
|
2024-05-22 20:48:44 +00:00
|
|
|
|
2024-06-21 19:12:29 +00:00
|
|
|
_dio.httpClientAdapter = IOHttpClientAdapter(
|
|
|
|
|
createHttpClient: () {
|
|
|
|
|
HttpClient httpClient = HttpClient(context: securityContext)
|
|
|
|
|
..badCertificateCallback =
|
|
|
|
|
(X509Certificate cert, String host, int port) {
|
|
|
|
|
print(cert.issuer);
|
|
|
|
|
print('$host $port');
|
|
|
|
|
final now = DateTime.now();
|
|
|
|
|
final valid = cert.startValidity.isBefore(now) &&
|
|
|
|
|
cert.endValidity.isAfter(now);
|
|
|
|
|
return valid &&
|
|
|
|
|
const DeepCollectionEquality().equals(
|
|
|
|
|
cert.sha1,
|
|
|
|
|
_cert,
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
return httpClient;
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-05-22 20:48:44 +00:00
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static final _cert =
|
|
|
|
|
'0A:82:77:1E:97:98:05:76:FC:ED:76:89:87:12:E8:9E:92:14:94:D3'
|
|
|
|
|
.split(':')
|
|
|
|
|
.map((v) => int.parse(v, radix: 16))
|
|
|
|
|
.toList();
|
|
|
|
|
}
|