Files
Bernd Steckmeister dba4b64df8 feat: PYRAMID_PROFILE_DIR-Override fuer Desktop-Testprofile (app_dirs.dart)
DB, auth_log und Media-Cache laufen jetzt ueber appSupportDir(); nur auf
Desktop und nur wenn PYRAMID_PROFILE_DIR gesetzt ist, landet alles in einem
eigenen Profilverzeichnis - fuer Autopilot-Testlogins parallel zur echten
Session. Ohne Variable exakt das bisherige Verhalten. secure_storage/
shared_preferences bewusst nicht umgeleitet (Begruendung im Dateikopf).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 18:55:30 +02:00

52 lines
1.5 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:path/path.dart' as p;
import 'package:pyramid/core/app_dirs.dart';
/// Schreibt Login-/Logout-relevante Ereignisse in eine Datei, die einen
/// App-Neustart übersteht. Zweck: den Uta-Random-Logout-Bug nachvollziehen
/// können, auch wenn die App zwischen dem Logout und dem nächsten Blick ins
/// Log neu gestartet wurde (siehe ROADMAP M1).
class AuthLog {
static const _maxLines = 500;
static File? _file;
static Future<File> _ensureFile() async {
final existing = _file;
if (existing != null) return existing;
final dir = await appSupportDir();
final file = File(p.join(dir.path, 'auth_log.txt'));
return _file = file;
}
static Future<void> write(String message) async {
try {
final file = await _ensureFile();
await file.writeAsString(
'${DateTime.now().toIso8601String()} $message\n',
mode: FileMode.append,
flush: true,
);
final lines = await file.readAsLines();
if (lines.length > _maxLines) {
await file.writeAsString(
'${lines.sublist(lines.length - _maxLines).join('\n')}\n',
);
}
} catch (_) {
// Logging darf selbst nie einen Fehlerpfad (oder gar einen Logout) auslösen.
}
}
static Future<String> read() async {
try {
final file = await _ensureFile();
if (!await file.exists()) return '(noch keine Einträge)';
return await file.readAsString();
} catch (e) {
return 'Log konnte nicht gelesen werden: $e';
}
}
}