isLocal() hielt jede Adresse aus 192.168.147.* fuer lokal. Das ist das
Docker-Netz auf dem NAS: Anfragen ueber den Docker- oder einen Reverse
Proxy tragen dessen Adresse und waeren damit als lokal durchgegangen
(Passwort-Login und Passkey-Freigabe von aussen). Der IPv6-Vergleich per
explode(":") scheiterte ausserdem an komprimierten Adressen.
- lokale Netze stehen als CIDR-Liste $lokale_netze in der externen Config
- ipImNetz() vergleicht IPv4/IPv6 korrekt per inet_pton, inkl. ::ffff:-Form
- Anfragen mit Proxy-Headern gelten nie als lokal
- ohne Konfiguration nur noch dasselbe IPv6-/64 wie der Server, kein IPv4
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bestehende Codebasis als Ausgangsstand aufgenommen.
- .gitignore: Kundendaten (uploads_*), Smarty-Compile-Cache
(templates_c), Laufzeit-Temp und Datenbank-Dumps ausgeschlossen;
Verzeichnisstruktur ueber .gitkeep erhalten
- .gitattributes: Zeilenenden normalisiert (LF im Repo),
Binaerformate markiert
- db-backup.php: MySQL-Zugangsdaten kommen jetzt wie im Rest der
Anwendung aus der externen Konfiguration statt hartkodiert aus der
Datei; Passwort wird ueber eine temporaere Optionsdatei statt per
Kommandozeile uebergeben, Fehler von mysqldump/gzip werden gemeldet,
Aufraeumen aelterer Backups berechnet Jahr und Monat konsistent
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>