refactor(auth): Migrate session storage to flutter_secure_storage

This commit is contained in:
gasaichandesu
2026-06-19 22:58:27 +04:00
parent 8f6ed5504b
commit 07b9e44350
10 changed files with 181 additions and 103 deletions
@@ -2,9 +2,11 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:injectable/injectable.dart';
import 'package:moonwell_launcher/config.dart';
import 'package:path/path.dart' as p;
@lazySingleton
class LauncherLogService {
static Future<void> _pendingWrite = Future<void>.value();
@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:injectable/injectable.dart';
import 'package:moonwell_launcher/features/launcher/domain/entities/launcher_session.dart';
import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart';
@@ -9,12 +10,15 @@ const _outputDirKey = 'output_dir';
const _launcherSessionKey = 'launcher_session';
@LazySingleton(as: PreferencesRepository, env: ['flutter'])
class SharedPrefsPreferencesRepository implements PreferencesRepository {
class LocalPreferencesRepository implements PreferencesRepository {
final SharedPreferences _preferences;
final FlutterSecureStorage _secureStorage;
const SharedPrefsPreferencesRepository({
const LocalPreferencesRepository({
required SharedPreferences preferences,
}) : _preferences = preferences;
required FlutterSecureStorage secureStorage,
}) : _preferences = preferences,
_secureStorage = secureStorage;
@override
Future<Uri?> getOutputDir() {
@@ -33,35 +37,45 @@ class SharedPrefsPreferencesRepository implements PreferencesRepository {
}
@override
Future<LauncherSession?> getLauncherSession() {
final rawSession = _preferences.getString(_launcherSessionKey);
Future<LauncherSession?> getLauncherSession() async {
await _maybeClearLegacyLauncherSession();
final rawSession = await _secureStorage.read(key: _launcherSessionKey);
if (rawSession == null || rawSession.isEmpty) {
return Future.value(null);
return null;
}
try {
final decoded = jsonDecode(rawSession);
if (decoded is! Map) {
return Future.value(null);
return null;
}
final json = decoded.map((key, value) => MapEntry(key.toString(), value));
return Future.value(LauncherSession.fromJson(json));
return LauncherSession.fromJson(json);
} catch (_) {
return Future.value(null);
return null;
}
}
@override
Future<void> setLauncherSession(LauncherSession session) {
return _preferences.setString(
_launcherSessionKey,
jsonEncode(session.toJson()),
Future<void> setLauncherSession(LauncherSession session) async {
await _secureStorage.write(
key: _launcherSessionKey,
value: jsonEncode(session.toJson()),
);
await _maybeClearLegacyLauncherSession();
}
@override
Future<void> clearLauncherSession() {
return _preferences.remove(_launcherSessionKey);
Future<void> clearLauncherSession() async {
await _secureStorage.delete(key: _launcherSessionKey);
await _maybeClearLegacyLauncherSession();
}
Future<void> _maybeClearLegacyLauncherSession() async {
if (_preferences.containsKey(_launcherSessionKey)) {
await _preferences.remove(_launcherSessionKey);
}
}
}
+26 -10
View File
@@ -1,5 +1,5 @@
// dart format width=80
// GENERATED CODE - DO NOT MODIFY BY HAND
// dart format width=80
// **************************************************************************
// InjectableConfigGenerator
@@ -9,6 +9,7 @@
// coverage:ignore-file
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:flutter_secure_storage/flutter_secure_storage.dart' as _i558;
import 'package:get_it/get_it.dart' as _i174;
import 'package:injectable/injectable.dart' as _i526;
import 'package:shared_preferences/shared_preferences.dart' as _i460;
@@ -16,10 +17,12 @@ import 'package:shared_preferences/shared_preferences.dart' as _i460;
import 'features/launcher/application/client_sync_use_case.dart' as _i757;
import 'features/launcher/data/game_installation_service.dart' as _i315;
import 'features/launcher/data/launcher_api_client.dart' as _i703;
import 'features/preferences/data/repositories/shared_prefs_preferences_repository.dart'
as _i662;
import 'features/launcher/data/launcher_log_service.dart' as _i43;
import 'features/preferences/data/repositories/local_preferences_repository.dart'
as _i658;
import 'features/preferences/domain/repositories/preferences_repository.dart'
as _i44;
import 'third_party/flutter_secure_storage.dart' as _i782;
import 'third_party/shared_preferences.dart' as _i1006;
const String _flutter = 'flutter';
@@ -32,6 +35,7 @@ extension GetItInjectableX on _i174.GetIt {
}) async {
final gh = _i526.GetItHelper(this, environment, environmentFilter);
final sharedPreferencesModule = _$SharedPreferencesModule();
final flutterSecureStorageModule = _$FlutterSecureStorageModule();
await gh.factoryAsync<_i460.SharedPreferences>(
() => sharedPreferencesModule.prefs,
preResolve: true,
@@ -39,21 +43,33 @@ extension GetItInjectableX on _i174.GetIt {
gh.lazySingleton<_i315.GameInstallationService>(
() => _i315.GameInstallationService(),
);
gh.lazySingleton<_i703.LauncherApiClient>(() => _i703.LauncherApiClient());
gh.lazySingleton<_i43.LauncherLogService>(() => _i43.LauncherLogService());
gh.lazySingleton<_i558.FlutterSecureStorage>(
() => flutterSecureStorageModule.storage,
);
gh.lazySingleton<_i703.LauncherApiClient>(
() => _i703.LauncherApiClient(
launcherLogService: gh<_i43.LauncherLogService>(),
),
);
gh.lazySingleton<_i44.PreferencesRepository>(
() => _i658.LocalPreferencesRepository(
preferences: gh<_i460.SharedPreferences>(),
secureStorage: gh<_i558.FlutterSecureStorage>(),
),
registerFor: {_flutter},
);
gh.lazySingleton<_i757.ClientSyncUseCase>(
() => _i757.ClientSyncUseCase(
launcherApiClient: gh<_i703.LauncherApiClient>(),
installationService: gh<_i315.GameInstallationService>(),
launcherLogService: gh<_i43.LauncherLogService>(),
),
);
gh.lazySingleton<_i44.PreferencesRepository>(
() => _i662.SharedPrefsPreferencesRepository(
preferences: gh<_i460.SharedPreferences>(),
),
registerFor: {_flutter},
);
return this;
}
}
class _$SharedPreferencesModule extends _i1006.SharedPreferencesModule {}
class _$FlutterSecureStorageModule extends _i782.FlutterSecureStorageModule {}
+8
View File
@@ -0,0 +1,8 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:injectable/injectable.dart';
@module
abstract class FlutterSecureStorageModule {
@lazySingleton
FlutterSecureStorage get storage => const FlutterSecureStorage();
}