espid2sensor: Passwort ändern + Admin-Passwort-Reset

- POST /api/changePassword: jeder eingeloggte User kann sein eigenes
  Passwort ändern (erfordert aktuelles Passwort), neuer Profil-Tab
- POST /api/resetPassword: Admin kann das Passwort eines Users per
  Email zuruecksetzen, neue Karte im bestehenden User-Tab
- Login-Seite: Hinweis fuer "Passwort vergessen" (Kontakt zum Admin,
  da keine Mail-Infrastruktur im Projekt existiert)
- Bugfix beim Umsetzen: express-session's MemoryStore serialisiert
  Sessions per JSON, wodurch die ObjectId aus req.session.userId zu
  einem String wird - vor der Mongo-Query per ObjectId(...) casten

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 10:07:52 +00:00
parent 47d27148ca
commit cd4d7ba25d
5 changed files with 130 additions and 2 deletions
+28 -1
View File
@@ -11,6 +11,7 @@ html(lang="de")
div.tabs
button.tab-btn#tabInput.active(type="button" onclick="showTab('input')") Eingabe
button.tab-btn#tabList(type="button" onclick="showTab('list')") Liste
button.tab-btn#tabProfile(type="button" onclick="showTab('profile')") Profil
if isAdmin
button.tab-btn#tabUser(type="button" onclick="showTab('user')") User
@@ -67,6 +68,22 @@ html(lang="de")
th Aktionen
tbody
// Profil-Tab (für alle eingeloggten User)
div#tabProfileContent.tab-content(style="display:none")
div.card
h2 Passwort ändern
form#profileForm
label(for="currentPassword") Aktuelles Passwort:
input#currentPassword(type="password" required)
label(for="newPassword") Neues Passwort:
input#newPassword(type="password" required)
label(for="newPasswordRepeat") Neues Passwort (Wiederholung):
input#newPasswordRepeat(type="password" required)
.twobuttons
button#profileSaveBtn(type="button") Ändern
div#profileResult
#version Version: #{version} vom #{vdate}
// User-Tab (nur für Admins)
if isAdmin
div#tabUserContent.tab-content(style="display:none")
@@ -81,10 +98,20 @@ html(lang="de")
select#role
option(value="user") User
option(value="admin") Admin
.twobuttons
.twobuttons
button#userSaveBtn(type="button") Anlegen
button#userCancelBtn(type="button") Abbrechen
div#userResult
div.card
h2 Passwort eines Users zurücksetzen
form#resetPasswordForm
label(for="resetEmail") Email:
input#resetEmail(type="email" required)
label(for="resetNewPassword") Neues Passwort:
input#resetNewPassword(type="password" required)
.twobuttons
button#resetPasswordBtn(type="button") Zurücksetzen
div#resetPasswordResult
#version Version: #{version} vom #{vdate}
script(type="module" src="/global.js")
+1
View File
@@ -16,6 +16,7 @@ html(lang="de")
label(for="password") Passwort:
input#password(type="password" name="password" required)
button(type="submit") Login
p.hint Passwort vergessen? Bitte an einen Admin wenden.
#version Version: #{version} vom #{vdate}
if error