0dd915eeb2ea45fe88cf6007703c8868139d5c12
- Invalidate JWTs on password change/reset via token_version - Constant-time login compare against dummy hash to prevent user enum - Register validates subject against subjects table + user_subjects link - Last-admin guard on account delete and admin role/status PATCH - purgeUser unlinks teacher_materials storage files - 2FA setup/regenerate require password, setup blocks while enabled - Group sender keys: existing-distributor check + INSERT OR IGNORE - class_events: type whitelist, ISO date regex, end >= start check - Teacher absences DELETE: ownership check (teacher_id) - class_timetable POST: HHMM validation, overlap detection - class_timetable PUT: subject restricted to teacher list, HHMM + overlap - Register VALID_SUBJECTS removed; dynamic subjects from DB - /api/subjects made public (needed by register form)
INFO1
Dashboard für die Klasse INFO1 an der IFB-Berufsfachschule Rosenheim. Stundenplan, Hausaufgaben, Noten, Fehlzeiten, Klassenkalender, Chat und Ende zu Ende verschlüsselte Direktnachrichten an einem Ort.
Läuft unter info1.simon0x.xyz.
Stack
Node.js 20, Express 5, SQLite über better-sqlite3, Vanilla JS im Frontend. Kein Buildschritt. Auth per JWT im HttpOnly-Cookie, bcrypt, TOTP-2FA. Mail über Resend. E2EE mit ECDH P-256 und AES-GCM im Browser.
Lokal starten
npm install
cp .env.example .env # JWT_SECRET und RESEND_API_KEY setzen
node index.js
Bindet an 127.0.0.1:3010.
Registrierung
Beschränkt auf @ifb-schulen.com-Adressen (Regex IFB_EMAIL_RE in src/routes.js). Jeder neue Account muss per Mail bestätigt werden. Neue Lehrerkonten landen in einer Admin-Warteschlange.
Layout
index.js Express-Bootstrap
src/db.js SQLite, Schema, Migrationen
src/routes.js Auth, Admin, Chat, Kalender, Tickets
src/teacher.js Lehrerendpoints
src/files.js Dateiablage mit Quota
src/mailer.js Resend-Wrapper
public/ HTML-Seiten und E2EE-Primitiven
Lizenz
MIT. Siehe LICENSE.
Description
Languages
HTML
74.8%
JavaScript
25.2%