import 'dart:developer'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mnemo_cards_common/mnemo_cards_common.dart'; import 'package:package_info_plus/package_info_plus.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 init() async { PackageInfo appPackageInfo = await PackageInfo.fromPlatform(); String appVersion = appPackageInfo.version; _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); }), 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, }; handler.next(request); }) ]); if (!kIsWeb) { final securityContext = SecurityContext(withTrustedRoots: true); // securityContext.setTrustedCertificatesBytes(Certificates.crt); // securityContext.usePrivateKeyBytes(Certificates.key); _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; }, ); } 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(); }