<!-- Thanks for contributing! Provide a description of your changes below and a general summary in the title Please look at the following checklist to ensure that your PR can be accepted quickly: --> ## Description This is a PR that makes the auth build runnable on the Desktop platform. Below is a screenshot for the same:  Some things to note: - LocalAuth will be bypassed on unsupported platforms (desktop) - Switched to sodium and sodium-libs from flutter_sodium. - QR code library is incompatible with desktop, So I removed access to those pages. - Bumped some dependencies and done some lint fixes - Also add save key option as send file may not help on desktop (related #380) https://github.com/ente-io/auth/assets/41370460/3f3471e8-45f6-4146-88ac-b763d4f38b32 - Update Recovery Key Card UI  So this is a step towards more updated code and better multiplatform support. ## Type of Change <!--- Put an `x` in all the boxes that apply: --> - [ ] 🖼️ New icon - [x] ✨ New feature (non-breaking change which adds functionality) - [ ] 🛠️ Bug fix (non-breaking change which fixes an issue) - [ ] ❌ Breaking change (fix or feature that would cause existing functionality to change) - [x] 🧹 Code refactor - [ ] ✅ Build configuration change - [ ] 📝 Documentation - [ ] 🗑️ Chore --------- Co-authored-by: Neeraj Gupta <254676+ua741@users.noreply.github.com>
102 lines
3.2 KiB
Dart
102 lines
3.2 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:dio/dio.dart';
|
|
import 'package:ente_auth/core/configuration.dart';
|
|
import 'package:ente_auth/core/constants.dart';
|
|
import 'package:ente_auth/utils/package_info_util.dart';
|
|
import 'package:ente_auth/utils/platform_util.dart';
|
|
import 'package:fk_user_agent/fk_user_agent.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
int kConnectTimeout = 15000;
|
|
|
|
class Network {
|
|
// apiEndpoint points to the Ente server's API endpoint
|
|
static const apiEndpoint = String.fromEnvironment(
|
|
"endpoint",
|
|
defaultValue: kDefaultProductionEndpoint,
|
|
);
|
|
late Dio _dio;
|
|
late Dio _enteDio;
|
|
|
|
Future<void> init() async {
|
|
if (PlatformUtil.isMobile()) await FkUserAgent.init();
|
|
final packageInfo = await PackageInfoUtil().getPackageInfo();
|
|
final version = PackageInfoUtil().getVersion(packageInfo);
|
|
final packageName = PackageInfoUtil().getPackageName(packageInfo);
|
|
|
|
final preferences = await SharedPreferences.getInstance();
|
|
|
|
_dio = Dio(
|
|
BaseOptions(
|
|
connectTimeout: Duration(milliseconds: kConnectTimeout),
|
|
headers: {
|
|
HttpHeaders.userAgentHeader: PlatformUtil.isMobile()
|
|
? FkUserAgent.userAgent
|
|
: Platform.operatingSystem,
|
|
'X-Client-Version': version,
|
|
'X-Client-Package': packageName,
|
|
},
|
|
),
|
|
);
|
|
_dio.interceptors.add(RequestIdInterceptor());
|
|
_enteDio = Dio(
|
|
BaseOptions(
|
|
baseUrl: apiEndpoint,
|
|
connectTimeout: Duration(milliseconds: kConnectTimeout),
|
|
headers: {
|
|
if (PlatformUtil.isMobile())
|
|
HttpHeaders.userAgentHeader: FkUserAgent.userAgent
|
|
else
|
|
HttpHeaders.userAgentHeader: Platform.operatingSystem,
|
|
'X-Client-Version': version,
|
|
'X-Client-Package': packageName,
|
|
},
|
|
),
|
|
);
|
|
_enteDio.interceptors.add(EnteRequestInterceptor(preferences, apiEndpoint));
|
|
}
|
|
|
|
Network._privateConstructor();
|
|
|
|
static Network instance = Network._privateConstructor();
|
|
|
|
Dio getDio() => _dio;
|
|
Dio get enteDio => _enteDio;
|
|
}
|
|
|
|
class RequestIdInterceptor extends Interceptor {
|
|
@override
|
|
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
|
// ignore: prefer_const_constructors
|
|
options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
|
|
return super.onRequest(options, handler);
|
|
}
|
|
}
|
|
|
|
class EnteRequestInterceptor extends Interceptor {
|
|
final SharedPreferences _preferences;
|
|
final String enteEndpoint;
|
|
|
|
EnteRequestInterceptor(this._preferences, this.enteEndpoint);
|
|
|
|
@override
|
|
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
|
if (kDebugMode) {
|
|
assert(
|
|
options.baseUrl == enteEndpoint,
|
|
"interceptor should only be used for API endpoint",
|
|
);
|
|
}
|
|
// ignore: prefer_const_constructors
|
|
options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
|
|
final String? tokenValue = _preferences.getString(Configuration.tokenKey);
|
|
if (tokenValue != null) {
|
|
options.headers.putIfAbsent("X-Auth-Token", () => tokenValue);
|
|
}
|
|
return super.onRequest(options, handler);
|
|
}
|
|
}
|