You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3abdfe5
Browse filesBrowse the repository at this point in the historyBrowse files
feat: FTP auto-start on boot + configurable session-cookie lifetime
FTP: add an "auto-start on boot" toggle to the FTP tab (NVS "ftpEnable"),
mirroring WebDAV - a one-shot start in Ftp_Cyclic fires the server up the
first time WiFi is available after boot, so FTP no longer has to be
enabled by hand each time.
Security: the cookie lifetime is no longer hard-coded to 90 days. The
Security tab now has a "stay logged in for N days" field plus an
"unlimited" switch (stored as wwwCookieDays, 0 = unlimited -> ~10 years,
since browsers cap cookies at ~400 days anyway). The /security handler
takes cookieDays independently of the password (so the cookie form never
touches the password), and GET /security reports it. Login and
password-change responses build the Set-Cookie Max-Age from the setting.
Locales (de/en/fr), Swagger (/security) and README updated. Built +
clang-format clean; on-device verification still pending.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -110,6 +110,8 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
110
110
|**Password protection**: single password (no username), 90-day session cookie, brute-force lockout, logout entry; off in hotspot mode. Scripts/API clients authenticate with the password as an **API key** (`X-API-Key` header / `apikey` query param) |[`e74e712`](../../commit/e74e712)|
111
111
|**One shared device password (Security tab)**: the password fields were pulled out of the WiFi/FTP/WebDAV tabs into a single **Security** sub-tab — one password now protects the web interface, FTP *and* WebDAV (set once, applies everywhere; applied live without a reboot). An **empty password is accepted** and disables protection for all three. The **hostname** moved to the top of the **General** tab (saved on its own; `/wificonfig` now does partial updates) and the navbar brand reads just **Leo Industries**|[`c6dfc67`](../../commit/c6dfc67)|
112
112
|**FTP/WebDAV accept any username**: with one shared password the username is pointless, so both servers now authenticate by **password only — any username is accepted** (wrong password still rejected; empty device password = open). The username fields are gone from both tabs. FTP uses a **vendored, patched copy** of ESP-FTP-Server-Lib in [`lib/`](lib/ESP-FTP-Server-Lib) (password-only auth); WebDAV's self-contained server decodes the HTTP-Basic header and compares only the password |[`be96850`](../../commit/be96850)|
113
+
|**FTP auto-start on boot**: a toggle in the FTP tab starts the FTP server automatically once WiFi is up after boot (same one-shot pattern as WebDAV), so it no longer has to be enabled by hand each time |[`PENDINGHASH4`](../../commit/PENDINGHASH4)|
114
+
|**Configurable session-cookie lifetime**: the Security tab lets you set how long the web-interface login is remembered (in days) or choose **unlimited** (≈10 years; browsers cap cookies at ~400 days). Replaces the hard-coded 90-day cookie |[`PENDINGHASH4`](../../commit/PENDINGHASH4)|
113
115
|**One-click OTA + version badge**: a Tools-tab button (also bindable command **186** / MQTT `firmware_update`) pulls the rolling `latest` GitHub release and flashes it over OTA; a navbar badge shows the running build and turns amber when an update is available (passive `/version` check) — click it to install |[`8527f5e`](../../commit/8527f5e) · [`b736abc`](../../commit/b736abc)|
114
116
|**HTTP file sync**: pull audio files from a web server onto the SD card from a JSON manifest — additive, streamed in chunks straight to SD, background task with live progress + stop, abort-on-button, stall watchdog, auto-pauses playback and keeps the device awake mid-transfer. The manifest is streamed into the parser to halve peak RAM |[`ac24bbc`](../../commit/ac24bbc) · [`42d2c46`](../../commit/42d2c46)|
115
117
|**WebDAV server**: mount the SD card as a network drive (`http://<ip>:81/`) to copy audio on/off it straight from Finder/Explorer — no FTP client needed. Self-contained server (OPTIONS/PROPFIND/GET/HEAD+ranges/PUT/DELETE/MKCOL/MOVE/COPY/LOCK) running in its own task pinned to core 0 so transfers never disturb the audio pipeline; optional HTTP-Basic credentials. Configure + auto-start on boot in its own **WebDAV** settings sub-tab; start/stop live from the Control tab, command **188** or MQTT `webdav` (Home Assistant switch included). With auto-start on, the share is announced over **Bonjour/mDNS** (`_webdav._tcp`, `path=/`) so it pops up by itself in the Finder/Explorer network sidebar — no manual "Connect to Server" needed (currently disabled — see `WEBDAV_ENABLE`) |[`9b2bee0`](../../commit/9b2bee0)|
Copy file name to clipboardExpand all lines: html/locales/de.json
+7Lines changed: 7 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -138,6 +138,12 @@
138
138
"title": "Passwort",
139
139
"placeholder": "Leer lassen, um den Schutz zu deaktivieren",
140
140
"desc": "Ein gemeinsames Passwort für alles: Webinterface, FTP und WebDAV. Bei FTP und WebDAV ist der Benutzername egal – jeder Benutzername funktioniert, es zählt nur dieses Passwort. Nach dem Anmelden im Webinterface bleibt man 90 Tage eingeloggt; im Hotspot-Modus ist der Schutz inaktiv. Leer lassen, um den Schutz überall (Webinterface, FTP, WebDAV) zu deaktivieren."
141
+
},
142
+
"cookie": {
143
+
"title": "Anmeldung merken",
144
+
"unlimited": "Unbegrenzt eingeloggt bleiben",
145
+
"days": "Eingeloggt bleiben für (Tage)",
146
+
"desc": "Wie lange du nach dem Anmelden im Webinterface eingeloggt bleibst. Browser begrenzen Cookies meist auf max. ~400 Tage."
141
147
}
142
148
},
143
149
"wifi": {
@@ -444,6 +450,7 @@
444
450
"ftp": {
445
451
"title": "FTP-Einstellungen",
446
452
"authHint": "FTP akzeptiert jeden Benutzernamen – nur das Passwort zählt. Das Passwort ist das gemeinsame Geräte-Passwort (Tab \"Sicherheit\"). Leeres Passwort = Zugriff ohne Anmeldung.",
453
+
"enable": "FTP beim Start automatisch aktivieren",
Copy file name to clipboardExpand all lines: html/locales/en.json
+7Lines changed: 7 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -138,6 +138,12 @@
138
138
"title": "Password",
139
139
"placeholder": "Leave empty to disable protection",
140
140
"desc": "One shared password for everything: web interface, FTP and WebDAV. For FTP and WebDAV the username does not matter - any username works, only this password is checked. Once logged in to the web interface you stay logged in for 90 days; protection is inactive in hotspot mode. Leave empty to disable protection everywhere (web interface, FTP, WebDAV)."
141
+
},
142
+
"cookie": {
143
+
"title": "Stay logged in",
144
+
"unlimited": "Stay logged in indefinitely",
145
+
"days": "Stay logged in for (days)",
146
+
"desc": "How long you stay logged in to the web interface after signing in. Browsers usually cap cookies at ~400 days."
141
147
}
142
148
},
143
149
"wifi": {
@@ -444,6 +450,7 @@
444
450
"ftp": {
445
451
"title": "FTP-settings",
446
452
"authHint": "FTP accepts any username - only the password matters. The password is the shared device password (\"Security\" tab). An empty password means access without a login.",
Copy file name to clipboardExpand all lines: html/locales/fr.json
+7Lines changed: 7 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -131,6 +131,12 @@
131
131
"title": "Mot de passe",
132
132
"placeholder": "Laisser vide pour désactiver la protection",
133
133
"desc": "Un seul mot de passe partagé pour tout : interface web, FTP et WebDAV. Pour le FTP et le WebDAV, le nom d'utilisateur n'a pas d'importance - n'importe quel nom fonctionne, seul ce mot de passe est vérifié. Une fois connecté à l'interface web, vous restez connecté pendant 90 jours ; la protection est inactive en mode hotspot. Laisser vide pour désactiver la protection partout (interface web, FTP, WebDAV)."
134
+
},
135
+
"cookie": {
136
+
"title": "Rester connecté",
137
+
"unlimited": "Rester connecté indéfiniment",
138
+
"days": "Rester connecté pendant (jours)",
139
+
"desc": "Durée pendant laquelle vous restez connecté à l'interface web après la connexion. Les navigateurs limitent généralement les cookies à ~400 jours."
134
140
}
135
141
},
136
142
"wifi": {
@@ -437,6 +443,7 @@
437
443
"ftp": {
438
444
"title": "Paramètres FTP",
439
445
"authHint": "Le FTP accepte n'importe quel nom d'utilisateur - seul le mot de passe compte. C'est le mot de passe partagé de l'appareil (onglet « Sécurité »). Un mot de passe vide permet l'accès sans connexion.",
446
+
"enable": "Démarrer le FTP automatiquement au démarrage",
0 commit comments