Alle nur mit Admin-Login erreichbar. Schulbuch-Upload zusätzlich per PIN (0815). Heli-Audio-Werkzeuge liegen nur lokal (.LocalDeveloperTools) und sind nicht auf dem Server.
Lebende ToDo-/Review-Liste. Häkchen = erledigt/gesichtet, Notizfeld je Punkt für deine Review-Gedanken. Alles wird lokal in diesem Browser gespeichert (kein Server) — ideal für unterwegs. Mit 📝 Notizen holst du dir alle Notizen als Text zum Kopieren.
+
+
+
+
+
+
+
Stand: 2026-08-20 · gepflegt von Atlas · nur Admin
+
+
+
+
+
+
+
diff --git a/App/php/api/admin.php b/App/php/api/admin.php
index 02666e9..79148f5 100644
--- a/App/php/api/admin.php
+++ b/App/php/api/admin.php
@@ -46,11 +46,13 @@ if ($action === 'login') {
unset($_SESSION['admin_id']); // Sicherstellen dass nicht schon eingeloggt
$resp = ['message' => 'PIN wurde an Ihre E-Mail gesendet.', 'email' => maskEmail($admin['email_2fa'])];
- // Dev-Umgebung (localhost): es geht keine Mail raus → PIN direkt zurückgeben,
- // damit man sich lokal anmelden kann. Auf Prod (IS_PRODUCTION) NIEMALS.
- if (!IS_PRODUCTION) {
+ // Dev-Umgebung (localhost) ODER Staging (v3, STAGING=1 in .env.production, Mail
+ // bewusst tot): PIN direkt zurückgeben, damit man sich ohne Mailversand anmelden
+ // kann. Auf Prod (IS_PRODUCTION ohne STAGING) NIEMALS — dort greift 2FA per Mail.
+ $isStaging = defined('STAGING') && (STAGING === '1' || STAGING === 1 || STAGING === true);
+ if (!IS_PRODUCTION || $isStaging) {
$resp['devPin'] = $pin;
- $resp['message'] = 'Dev-Umgebung – kein Mailversand. PIN steht unten.';
+ $resp['message'] = ($isStaging ? 'Staging' : 'Dev-Umgebung') . ' – kein Mailversand. PIN steht unten.';
}
Response::ok($resp);
}