Merge: Navidrome-Login-Fix (Passwort sichtbar + Trim + Default-User Baka)

This commit is contained in:
Hermes (Server)
2026-08-20 10:04:29 +02:00
2 changed files with 40 additions and 9 deletions
+18
View File
@@ -5,6 +5,24 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
## [Unreleased] ## [Unreleased]
### 🔎 Login-Diagnose: Passwort-Sichtbarkeit + Trim (2026-08-20)
- 🐛 **„Login fehlgeschlagen" trotz korrekter Zugangsdaten:** Systematische
Analyse (App-Code, App-Logs, Caddy/Navidrome-Logs, 1:1-Nachbau des
App-Requests inkl. Salt/Token) hat bewiesen: **App-Code, Server, User „Baka"
und Passwort sind korrekt** — der Fehler lag im auf dem Gerät verwendeten
Credential-Wert (der ältere Build mit dem Ping-Fehlalarm persistierte
ungültige Zugangsdaten; verdeckte Tippfehler im Passwortfeld blieben
unsichtbar).
- 🔧 **Passwort-Anzeigen-Umschalter** (Auge-Icon) im Navidrome-Login — Tippfehler
werden sichtbar.
- 🔧 **URL + Passwort werden getrimmt** (randständige Leerzeichen aus Autofill /
Tastatur entfernt).
- 🔧 **Default-User im Login ist jetzt „Baka"** (vorher „Dustin") — verhindert
versehentlichen Login mit falschem User.
- ️ Ein erfolgreicher Login überschreibt die alten (ungültigen) gespeicherten
Zugangsdaten — der Ping-Fix aus dieser Version stellt sicher, dass künftig
nur noch gültige Credentials gespeichert werden.
### 🔒 Datenschutz: Log-Bereinigung vor Server-Upload (2026-08-20) ### 🔒 Datenschutz: Log-Bereinigung vor Server-Upload (2026-08-20)
-**Was:** Diagnose-Logs werden jetzt zentral bereinigt, bevor sie an -**Was:** Diagnose-Logs werden jetzt zentral bereinigt, bevor sie an
`logs.baka-net.de` gehen. Der lokale `debugPrint` bleibt vollständig. `logs.baka-net.de` gehen. Der lokale `debugPrint` bleibt vollständig.
+22 -9
View File
@@ -158,8 +158,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
void _zeigeNavidromeDialog() { void _zeigeNavidromeDialog() {
final urlCtrl = TextEditingController(text: 'https://musik.baka-net.de'); final urlCtrl = TextEditingController(text: 'https://musik.baka-net.de');
final passCtrl = TextEditingController(); final passCtrl = TextEditingController();
String selectedUser = 'Dustin'; String selectedUser = 'Baka';
bool verbindet = false; bool verbindet = false;
bool obscure = true;
String? fehler; String? fehler;
showDialog( showDialog(
@@ -228,11 +229,20 @@ class _SettingsScreenState extends State<SettingsScreen> {
TextField( TextField(
controller: passCtrl, controller: passCtrl,
style: const TextStyle(color: Colors.white), style: const TextStyle(color: Colors.white),
obscureText: true, obscureText: obscure,
decoration: const InputDecoration( decoration: InputDecoration(
labelText: 'Passwort', labelText: 'Passwort',
labelStyle: TextStyle(color: Colors.grey), labelStyle: const TextStyle(color: Colors.grey),
border: OutlineInputBorder(), border: const OutlineInputBorder(),
// Anzeigen-Umschalter: verdeckte Tippfehler im Passwort
// sichtbar machen (häufigste Login-Fehlerquelle).
suffixIcon: IconButton(
icon: Icon(
obscure ? Icons.visibility_off : Icons.visibility,
color: Colors.grey,
),
onPressed: () => setDialogState(() => obscure = !obscure),
),
), ),
), ),
if (fehler != null) ...[ if (fehler != null) ...[
@@ -262,16 +272,19 @@ class _SettingsScreenState extends State<SettingsScreen> {
? null ? null
: () async { : () async {
setDialogState(() => verbindet = true); setDialogState(() => verbindet = true);
// Randständige Leerzeichen entfernen (verdeckte
// Fehlerquelle im obscureText-Feld / bei Autofill).
final url = urlCtrl.text.trim();
final pass = passCtrl.text.trim();
logger.info( logger.info(
'Navidrome Login-Versuch (pwLeer=${passCtrl.text.isEmpty})'); 'Navidrome Login-Versuch (pwLeer=${pass.isEmpty})');
_navidrome.setCredentials( _navidrome.setCredentials(url, selectedUser, pass);
urlCtrl.text, selectedUser, passCtrl.text);
final ok = await _navidrome.ping(); final ok = await _navidrome.ping();
setDialogState(() => verbindet = false); setDialogState(() => verbindet = false);
if (ok && ctx.mounted) { if (ok && ctx.mounted) {
logger.info('Navidrome Login erfolgreich'); logger.info('Navidrome Login erfolgreich');
await _navidrome.speichereZugangsdaten( await _navidrome.speichereZugangsdaten(
urlCtrl.text, selectedUser, passCtrl.text); url, selectedUser, pass);
if (ctx.mounted) Navigator.pop(ctx); if (ctx.mounted) Navigator.pop(ctx);
if (mounted) setState(() {}); if (mounted) setState(() {});
} else if (ctx.mounted) { } else if (ctx.mounted) {