Skip to content

Commit c6dfc67

Browse files
fhirschmannclaude
andcommitted
feat: one shared device password in a dedicated Security tab
Consolidate the scattered credentials in the web interface: - The password fields are pulled out of the WiFi, FTP and WebDAV tabs into a new "Security" sub-tab. One password now protects the web interface, FTP and WebDAV at once: the /security handler fans the value out to wwwPassword, ftppassword and webdavPwd and reloads the FTP/WebDAV servers live (no reboot). The FTP/WebDAV tabs keep only their username and point to the Security tab for the password. - An empty password is accepted and disables protection for all three. - The hostname moves out of the WiFi tab to the top of the General tab. /wificonfig now does partial updates so saving the hostname no longer clobbers the "scan WiFi on start" flag and vice versa. - The navbar brand now reads just "Leo Industries" (no "AT-1"). Locales (de/en/fr), the Swagger spec (/security, /wificonfig) and the README are updated. Verified on device: password fan-out to FTP, empty password disables everywhere, and hostname partial-update keeps scanOnStart. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent d9ad588 commit c6dfc67

7 files changed

Lines changed: 133 additions & 100 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ neon logo that doubles as the SVG favicon ([`7be5254`](../../commit/7be5254)):
108108
| **Consolidated, auto-saving Settings tab**: WiFi/MQTT/FTP/Bluetooth merged with the general settings into one tab; the sub-tabs are a **vertical UniFi-style sidebar** (icon-only on mobile; stays pinned while scrolling) with flat, consistent sections, split into General / **Buttons** / **LEDs** / **Power** / **RFID** / … . General/Buttons/LEDs/Power/RFID auto-save (debounced); the credential tabs keep an explicit submit on purpose | [`8b01876`](../../commit/8b01876) · [`1944cf4`](../../commit/1944cf4) · [`c284d0e`](../../commit/c284d0e) · [`32aabfd`](../../commit/32aabfd) |
109109
| **Configurable branding**: re-brand the navbar header + footer (General → Branding) with a live preview as you type — empty keeps the "Leo Industries" default, so the fork is easy to re-brand | [`fd57fcb`](../../commit/fd57fcb) |
110110
| **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+
| **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** | [`PENDINGHASH2`](../../commit/PENDINGHASH2) |
111112
| **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) |
112113
| **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) |
113114
| **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) |

REST-API.yaml

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,13 @@ paths:
250250
ScanWiFiOnStart:
251251
type: boolean
252252
post:
253-
summary: Save current common Wi-Fi configuration.
254-
description: Save the current common Wi-Fi configuration settings.
253+
summary: Save common Wi-Fi configuration (partial updates allowed).
254+
description: >
255+
Save the common Wi-Fi configuration. Partial updates are supported: send only
256+
"hostname" (saved from the General tab) or only "scanOnStart" (from the WiFi tab);
257+
omitted fields are left unchanged.
255258
requestBody:
256-
description: Common Wi-Fi configuration to save.
259+
description: Common Wi-Fi configuration to save (any subset of the fields).
257260
required: true
258261
content:
259262
application/json:
@@ -262,11 +265,8 @@ paths:
262265
properties:
263266
hostname:
264267
type: string
265-
ScanWiFiOnStart:
268+
scanOnStart:
266269
type: boolean
267-
required:
268-
- hostname
269-
- ScanWiFiOnStart
270270
responses:
271271
"200":
272272
description: Successful Wi-Fi configuration save.
@@ -758,8 +758,11 @@ paths:
758758
type: boolean
759759
post:
760760
tags: [Fork]
761-
summary: Set or clear the web-interface password.
762-
description: Sets a new web password (enables protection) or clears it when empty.
761+
summary: Set or clear the shared device password (web interface, FTP and WebDAV).
762+
description: >
763+
Sets one shared password that protects the web interface, FTP and WebDAV at once
764+
(applied live, no reboot). An empty password is accepted and disables protection
765+
for all three.
763766
requestBody:
764767
required: true
765768
content:

html/locales/de.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
"help": "Hilfe",
4848
"rfidcards": "RFID",
4949
"leds": "LEDs",
50-
"power": "Power"
50+
"power": "Power",
51+
"security": "Sicherheit"
5152
},
5253
"settingsex": {
5354
"title": "Erweiterte Einstellungen",
@@ -132,11 +133,11 @@
132133
}
133134
},
134135
"security": {
135-
"title": "Webinterface-Passwort",
136+
"title": "Geräte-Passwort",
136137
"password": {
137138
"title": "Passwort",
138139
"placeholder": "Leer lassen, um den Schutz zu deaktivieren",
139-
"desc": "Schützt das Webinterface mit einem Passwort. Nach dem Anmelden bleibt man 90 Tage eingeloggt. Im Hotspot-Modus ist der Schutz inaktiv."
140+
"desc": "Ein gemeinsames Passwort für alles: Webinterface, FTP und WebDAV. 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."
140141
}
141142
},
142143
"wifi": {
@@ -449,7 +450,8 @@
449450
"pwd": {
450451
"title": "FTP-Passwort",
451452
"placeholder": "Passwort",
452-
"show": "Passwort anzeigen/verbergen"
453+
"show": "Passwort anzeigen/verbergen",
454+
"securityHint": "Das FTP-Passwort wird im Tab \"Sicherheit\" gesetzt (gemeinsames Geräte-Passwort)."
453455
},
454456
"start": {
455457
"title": "FTP-Server starten",
@@ -472,7 +474,7 @@
472474
"show": "Passwort anzeigen/verbergen"
473475
},
474476
"auth": {
475-
"hint": "Benutzername und Passwort leer lassen, um ohne Anmeldung zuzugreifen."
477+
"hint": "Das WebDAV-Passwort wird im Tab \"Sicherheit\" gesetzt (gemeinsames Geräte-Passwort). Benutzername und Passwort leer lassen, um ohne Anmeldung zuzugreifen."
476478
},
477479
"start": {
478480
"title": "WebDAV-Server starten",

html/locales/en.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
"help": "Help",
4848
"rfidcards": "RFID",
4949
"leds": "LEDs",
50-
"power": "Power"
50+
"power": "Power",
51+
"security": "Security"
5152
},
5253
"settingsex": {
5354
"title": "Advanced settings",
@@ -132,11 +133,11 @@
132133
}
133134
},
134135
"security": {
135-
"title": "Web interface password",
136+
"title": "Device password",
136137
"password": {
137138
"title": "Password",
138139
"placeholder": "Leave empty to disable protection",
139-
"desc": "Protects the web interface with a password. Once logged in you stay logged in for 90 days. Protection is inactive in hotspot mode."
140+
"desc": "One shared password for everything: web interface, FTP and WebDAV. 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)."
140141
}
141142
},
142143
"wifi": {
@@ -449,7 +450,8 @@
449450
"pwd": {
450451
"title": "FTP-password",
451452
"placeholder": "password",
452-
"show": "Show/hide password"
453+
"show": "Show/hide password",
454+
"securityHint": "The FTP password is set on the \"Security\" tab (shared device password)."
453455
},
454456
"start": {
455457
"title": "Start FTP-server",
@@ -472,7 +474,7 @@
472474
"show": "Show/hide password"
473475
},
474476
"auth": {
475-
"hint": "Leave username and password empty to allow access without a login."
477+
"hint": "The WebDAV password is set on the \"Security\" tab (shared device password). Leave username and password empty to allow access without a login."
476478
},
477479
"start": {
478480
"title": "Start WebDAV server",

html/locales/fr.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@
4747
"help": "Aide",
4848
"rfidcards": "RFID",
4949
"leds": "LEDs",
50-
"power": "Alim."
50+
"power": "Alim.",
51+
"security": "Sécurité"
5152
},
5253
"settingsex": {
5354
"title": "Paramètres avancés",
@@ -125,11 +126,11 @@
125126
}
126127
},
127128
"security": {
128-
"title": "Mot de passe de l'interface web",
129+
"title": "Mot de passe de l'appareil",
129130
"password": {
130131
"title": "Mot de passe",
131132
"placeholder": "Laisser vide pour désactiver la protection",
132-
"desc": "Protège l'interface web par un mot de passe. Une fois connecté, vous restez connecté pendant 90 jours. La protection est inactive en mode hotspot."
133+
"desc": "Un seul mot de passe partagé pour tout : interface web, FTP et WebDAV. 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)."
133134
}
134135
},
135136
"wifi": {
@@ -442,7 +443,8 @@
442443
"pwd": {
443444
"title": "Mot de passe FTP",
444445
"placeholder": "mot de passe",
445-
"show": "Afficher/masquer le mot de passe"
446+
"show": "Afficher/masquer le mot de passe",
447+
"securityHint": "Le mot de passe FTP se règle dans l'onglet « Sécurité » (mot de passe partagé de l'appareil)."
446448
},
447449
"start": {
448450
"title": "Démarrer serveur FTP",
@@ -465,7 +467,7 @@
465467
"show": "Afficher/masquer le mot de passe"
466468
},
467469
"auth": {
468-
"hint": "Laissez le nom d'utilisateur et le mot de passe vides pour un accès sans connexion."
470+
"hint": "Le mot de passe WebDAV se règle dans l'onglet « Sécurité » (mot de passe partagé de l'appareil). Laissez le nom d'utilisateur et le mot de passe vides pour un accès sans connexion."
469471
},
470472
"start": {
471473
"title": "Démarrer serveur WebDAV",

0 commit comments

Comments
 (0)