259 lines
8.0 KiB
Dart
259 lines
8.0 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
export 'file_store_support.dart';
|
|
export 'secret_store.dart';
|
|
export 'settings_store.dart';
|
|
|
|
import 'file_store_support.dart';
|
|
import 'runtime_models.dart';
|
|
import 'secret_store.dart';
|
|
import 'settings_store.dart';
|
|
|
|
class SecureConfigStore {
|
|
SecureConfigStore({
|
|
Future<String?> Function()? fallbackDirectoryPathResolver,
|
|
Future<String?> Function()? databasePathResolver,
|
|
Future<String?> Function()? defaultSupportDirectoryPathResolver,
|
|
SecureConfigDatabaseOpener? databaseOpener,
|
|
SecureStorageClient? secureStorage,
|
|
bool enableSecureStorage = true,
|
|
}) {
|
|
final layoutResolver = StoreLayoutResolver(
|
|
localRootPathResolver: databasePathResolver,
|
|
secretRootPathResolver: fallbackDirectoryPathResolver,
|
|
supportRootPathResolver: defaultSupportDirectoryPathResolver,
|
|
);
|
|
_layoutResolver = layoutResolver;
|
|
_secretStore = SecretStore(
|
|
fallbackDirectoryPathResolver: fallbackDirectoryPathResolver,
|
|
databasePathResolver: databasePathResolver,
|
|
defaultSupportDirectoryPathResolver: defaultSupportDirectoryPathResolver,
|
|
secureStorage: secureStorage,
|
|
enableSecureStorage: enableSecureStorage,
|
|
layoutResolver: layoutResolver,
|
|
);
|
|
_settingsStore = SettingsStore(
|
|
fallbackDirectoryPathResolver: fallbackDirectoryPathResolver,
|
|
databasePathResolver: databasePathResolver,
|
|
defaultSupportDirectoryPathResolver: defaultSupportDirectoryPathResolver,
|
|
databaseOpener: databaseOpener,
|
|
layoutResolver: layoutResolver,
|
|
);
|
|
}
|
|
|
|
late final SecretStore _secretStore;
|
|
late final SettingsStore _settingsStore;
|
|
late final StoreLayoutResolver _layoutResolver;
|
|
|
|
Future<void> initialize() async {
|
|
await _secretStore.initialize();
|
|
await _settingsStore.initialize();
|
|
}
|
|
|
|
Future<SettingsSnapshot> loadSettingsSnapshot() {
|
|
return _settingsStore.loadSettingsSnapshot();
|
|
}
|
|
|
|
Future<SettingsSnapshot> reloadSettingsSnapshot() {
|
|
return _settingsStore.reloadSettingsSnapshot();
|
|
}
|
|
|
|
Future<SettingsSnapshotReloadResult> reloadSettingsSnapshotResult() {
|
|
return _settingsStore.reloadSettingsSnapshotResult();
|
|
}
|
|
|
|
Future<void> saveSettingsSnapshot(SettingsSnapshot snapshot) {
|
|
return _settingsStore.saveSettingsSnapshot(snapshot);
|
|
}
|
|
|
|
Future<List<File>> resolvedSettingsFiles() {
|
|
return _settingsStore.resolvedSettingsFiles();
|
|
}
|
|
|
|
Future<List<Directory>> resolvedSettingsWatchDirectories() {
|
|
return _settingsStore.resolvedSettingsWatchDirectories();
|
|
}
|
|
|
|
Future<List<TaskThread>> loadTaskThreads() {
|
|
return _settingsStore.loadTaskThreads();
|
|
}
|
|
|
|
Future<void> saveTaskThreads(List<TaskThread> records) {
|
|
return _settingsStore.saveTaskThreads(records);
|
|
}
|
|
|
|
Future<void> clearAssistantLocalState() {
|
|
return _settingsStore.clearAssistantLocalState();
|
|
}
|
|
|
|
Future<List<SecretAuditEntry>> loadAuditTrail() {
|
|
return _settingsStore.loadAuditTrail();
|
|
}
|
|
|
|
Future<void> appendAudit(SecretAuditEntry entry) {
|
|
return _settingsStore.appendAudit(entry);
|
|
}
|
|
|
|
Future<Map<String, dynamic>?> loadSupportJson(String relativePath) async {
|
|
final file = await supportFile(relativePath);
|
|
if (file == null || !await file.exists()) {
|
|
return null;
|
|
}
|
|
final raw = await file.readAsString();
|
|
final decoded = jsonDecode(raw);
|
|
return decoded is Map<String, dynamic> ? decoded : null;
|
|
}
|
|
|
|
Future<void> saveSupportJson(
|
|
String relativePath,
|
|
Map<String, dynamic> payload,
|
|
) async {
|
|
final file = await supportFile(relativePath);
|
|
if (file == null) {
|
|
return;
|
|
}
|
|
await atomicWriteString(file, jsonEncode(payload), ownerOnly: true);
|
|
}
|
|
|
|
Future<File?> supportFile(String relativePath) async {
|
|
final normalized = relativePath.trim();
|
|
if (normalized.isEmpty) {
|
|
return null;
|
|
}
|
|
final layout = await _layoutResolver.resolve();
|
|
return File('${layout.rootDirectory.path}/$normalized');
|
|
}
|
|
|
|
Future<Map<String, String>> loadSecureRefs() {
|
|
return _secretStore.loadSecureRefs();
|
|
}
|
|
|
|
Future<String?> loadGatewayToken({int? profileIndex}) =>
|
|
_secretStore.loadGatewayToken(profileIndex: profileIndex);
|
|
|
|
Future<void> saveGatewayToken(String value, {int? profileIndex}) =>
|
|
_secretStore.saveGatewayToken(value, profileIndex: profileIndex);
|
|
|
|
Future<void> clearGatewayToken({int? profileIndex}) =>
|
|
_secretStore.clearGatewayToken(profileIndex: profileIndex);
|
|
|
|
Future<String?> loadGatewayPassword({int? profileIndex}) =>
|
|
_secretStore.loadGatewayPassword(profileIndex: profileIndex);
|
|
|
|
Future<void> saveGatewayPassword(String value, {int? profileIndex}) =>
|
|
_secretStore.saveGatewayPassword(value, profileIndex: profileIndex);
|
|
|
|
Future<void> clearGatewayPassword({int? profileIndex}) =>
|
|
_secretStore.clearGatewayPassword(profileIndex: profileIndex);
|
|
|
|
Future<String?> loadOllamaCloudApiKey() =>
|
|
_secretStore.loadOllamaCloudApiKey();
|
|
|
|
Future<void> saveOllamaCloudApiKey(String value) =>
|
|
_secretStore.saveOllamaCloudApiKey(value);
|
|
|
|
Future<String?> loadVaultToken() => _secretStore.loadVaultToken();
|
|
|
|
Future<void> saveVaultToken(String value) =>
|
|
_secretStore.saveVaultToken(value);
|
|
|
|
Future<String?> loadAiGatewayApiKey() => _secretStore.loadAiGatewayApiKey();
|
|
|
|
Future<void> saveAiGatewayApiKey(String value) =>
|
|
_secretStore.saveAiGatewayApiKey(value);
|
|
|
|
Future<void> clearAiGatewayApiKey() => _secretStore.clearAiGatewayApiKey();
|
|
|
|
Future<String?> loadAccountSessionToken() =>
|
|
_secretStore.loadAccountSessionToken();
|
|
|
|
Future<void> saveAccountSessionToken(String value) =>
|
|
_secretStore.saveAccountSessionToken(value);
|
|
|
|
Future<void> clearAccountSessionToken() =>
|
|
_secretStore.clearAccountSessionToken();
|
|
|
|
Future<AccountSessionSummary?> loadAccountSessionSummary() =>
|
|
_secretStore.loadAccountSessionSummary();
|
|
|
|
Future<void> saveAccountSessionSummary(AccountSessionSummary value) =>
|
|
_secretStore.saveAccountSessionSummary(value);
|
|
|
|
Future<void> clearAccountSessionSummary() =>
|
|
_secretStore.clearAccountSessionSummary();
|
|
|
|
Future<AccountRemoteProfile?> loadAccountProfile() =>
|
|
_secretStore.loadAccountProfile();
|
|
|
|
Future<void> saveAccountProfile(AccountRemoteProfile value) =>
|
|
_secretStore.saveAccountProfile(value);
|
|
|
|
Future<void> clearAccountProfile() => _secretStore.clearAccountProfile();
|
|
|
|
Future<String?> loadAccountManagedSecret({required String target}) =>
|
|
_secretStore.loadAccountManagedSecret(target: target);
|
|
|
|
Future<void> saveAccountManagedSecret({
|
|
required String target,
|
|
required String value,
|
|
}) => _secretStore.saveAccountManagedSecret(target: target, value: value);
|
|
|
|
Future<void> clearAccountManagedSecret({required String target}) =>
|
|
_secretStore.clearAccountManagedSecret(target: target);
|
|
|
|
Future<void> clearAccountManagedSecrets() =>
|
|
_secretStore.clearAccountManagedSecrets();
|
|
|
|
Future<LocalDeviceIdentity?> loadDeviceIdentity() {
|
|
return _secretStore.loadDeviceIdentity();
|
|
}
|
|
|
|
Future<void> saveDeviceIdentity(LocalDeviceIdentity identity) {
|
|
return _secretStore.saveDeviceIdentity(identity);
|
|
}
|
|
|
|
Future<String?> loadDeviceToken({
|
|
required String deviceId,
|
|
required String role,
|
|
}) {
|
|
return _secretStore.loadDeviceToken(deviceId: deviceId, role: role);
|
|
}
|
|
|
|
Future<void> saveDeviceToken({
|
|
required String deviceId,
|
|
required String role,
|
|
required String token,
|
|
}) {
|
|
return _secretStore.saveDeviceToken(
|
|
deviceId: deviceId,
|
|
role: role,
|
|
token: token,
|
|
);
|
|
}
|
|
|
|
Future<void> clearDeviceToken({
|
|
required String deviceId,
|
|
required String role,
|
|
}) {
|
|
return _secretStore.clearDeviceToken(deviceId: deviceId, role: role);
|
|
}
|
|
|
|
PersistentWriteFailures get persistentWriteFailures =>
|
|
PersistentWriteFailures(
|
|
settings: _settingsStore.settingsWriteFailure,
|
|
tasks: _settingsStore.tasksWriteFailure,
|
|
secrets: _secretStore.secretsWriteFailure,
|
|
audit: _settingsStore.auditWriteFailure,
|
|
);
|
|
|
|
void dispose() {
|
|
_settingsStore.dispose();
|
|
_secretStore.dispose();
|
|
}
|
|
|
|
static String maskValue(String value) {
|
|
return SecretStore.maskValue(value);
|
|
}
|
|
}
|