Security: Cloud-Auth auf Bearer-JWT umgestellt (IDOR-Luecke geschlossen)

- cloud_service: echter Login gegen baka-auth, Token statt X-API-Key/X-User
- app_config: hartcodierten API-Key-Default entfernt
- download_service + melo_logger: Bearer-Token statt X-API-Key
- navidrome: Passwort in flutter_secure_storage (Keychain/Keystore)
- song: token-haltige stream_url wird nicht mehr in SQLite persistiert
- cloud_screen: Pfad-Traversal beim Download-Dateinamen gefixt (p.basename)
- home_screen: Login-Dialog mit Passwort-Feld, Auto-Sync nutzt restoreLogin
This commit is contained in:
Hermes (Server)
2026-07-31 14:31:12 +02:00
parent 3e9389ab59
commit 9a880b0f21
17 changed files with 1552 additions and 181 deletions
+10 -2
View File
@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import '../config/app_config.dart';
/// Umfassendes Log-System für die Melo App.
/// Zeichnet ALLES auf: Aktionen, Fehler, Netzwerk, Performance.
@@ -12,6 +13,9 @@ class MeloLogger {
factory MeloLogger() => _instanz;
MeloLogger._();
/// Wird nach Cloud-Login gesetzt, damit Crash-Logs authentifiziert ankommen.
static String? cloudToken;
bool _initialisiert = false;
String _sessionId = '';
String _version = '2.7';
@@ -19,7 +23,7 @@ class MeloLogger {
int _logId = 0;
Timer? _flushTimer;
static const String _serverUrl = 'http://159.195.51.99:8991/api/log';
String get _serverUrl => '${AppConfig.logUrl}/api/log';
void init(String version) {
if (_initialisiert) return;
@@ -94,6 +98,7 @@ class MeloLogger {
Future<void> _senden() async {
if (_eintraege.isEmpty) return;
if (!AppConfig.sendeDiagnosedaten) return;
final batch = _eintraege.toList();
_eintraege.clear();
@@ -101,7 +106,10 @@ class MeloLogger {
try {
await http.post(
Uri.parse(_serverUrl),
headers: {'Content-Type': 'application/json'},
headers: {
'Content-Type': 'application/json',
if (cloudToken != null) 'Authorization': 'Bearer $cloudToken',
},
body: jsonEncode({
'typ': 'log_batch',
'session': _sessionId,