refactor(auth): Migrate session storage to flutter_secure_storage
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
+29
-15
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user