app/totp.php implementiert RFC 6238 selbst statt per Bibliothek: der Algorithmus ist ein HMAC plus eine Truncation, und ein zweiter Faktor ist die letzte Stelle fuer ungepruefte Abhaengigkeiten. Der QR-Code entsteht aus dem ohnehin vorhandenen TCPDF, damit kein externer Dienst das Geheimnis sieht. Beim Login wird die Anmeldung bei aktivem zweitem Faktor nicht abgeschlossen; der Zwischenzustand gewaehrt keinerlei Zugriff und ist byte-identisch zu einem unangemeldeten Aufruf. users.totp_last_step verhindert die Wiederverwendung eines abgefangenen Codes innerhalb seines Gueltigkeitsfensters. Abschalten verlangt Passwort und Code. APP_REQUIRE_2FA_FOR_ADMINS macht den Faktor fuer Platform-Admins verbindlich, per Weiterleitung auf die Einrichtung statt als harte Sperre - sonst koennte der Schalter den einzigen Admin aussperren. Standard aus. check-konto-und-mandantenwechsel erwartete beim Login noch das entfernte Kundenkuerzel-Feld und damit einen direkten Sprung aufs Dashboard; der Check bildet jetzt den tatsaechlichen Weg ueber die Mandantenauswahl ab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
96 lines
4.0 KiB
PHP
96 lines
4.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Vorlage fuer die Produktionskonfiguration auf echtem Webhosting.
|
|
*
|
|
* Kopieren nach `env.local.php` (ohne ".example") direkt auf dem Webspace
|
|
* per SFTP - NICHT einchecken, die Datei enthaelt echte Zugangsdaten.
|
|
* `env.local.php` steht in .gitignore.
|
|
*
|
|
* Wird automatisch von app/bootstrap.php geladen, sobald die Datei
|
|
* existiert (lokal beim Dev-Server ueblicherweise nicht vorhanden -
|
|
* dort kommen die Werte weiterhin aus `source .env.local`).
|
|
*/
|
|
|
|
putenv('APP_ENV=prod');
|
|
|
|
// Zeitzone der Anwendung. Wird sowohl fuer PHP als auch fuer die DB-Session
|
|
// verwendet, damit in PHP berechnete Zeitstempel und MySQL NOW() dieselbe Uhr
|
|
// sehen (Token-Ablaeufe, Hinweis-Gueltigkeiten usw.). Standard: Europe/Berlin.
|
|
putenv('APP_TIMEZONE=Europe/Berlin');
|
|
|
|
// Eigene App-Domain. Nur Traffic mit genau diesem Host-Header bekommt das
|
|
// Dashboard/Login/etc.; jeder andere Host (z. B. kaffeeliste.de) zeigt
|
|
// stattdessen die Landingpage. Siehe index.php.
|
|
putenv('APP_HOST=app.kaffeeliste.de');
|
|
putenv('APP_BASE_URL=https://app.kaffeeliste.de');
|
|
|
|
// Ziel des Wasserzeichens im kostenlosen Tarif (unten rechts in der App).
|
|
// Ohne Angabe wird die Marketing-Domain aus APP_HOST abgeleitet, indem die
|
|
// App-Subdomain wegfaellt - hier also https://kaffeeliste.de.
|
|
putenv('APP_MARKETING_URL=https://kaffeeliste.de');
|
|
|
|
putenv('APP_DB_DRIVER=mysql');
|
|
putenv('DB_HOST=');
|
|
putenv('DB_PORT=3306');
|
|
putenv('DB_NAME=');
|
|
putenv('DB_USER=');
|
|
putenv('DB_PASS=');
|
|
// Bei gemeinsamer physischer Datenbank zwingend pro Umgebung verschieden:
|
|
// Produktion `prod_`, Test/Staging `test_`. Der Prefix endet immer auf `_`.
|
|
putenv('DB_TABLE_PREFIX=prod_');
|
|
|
|
// Muss ausserhalb des oeffentlichen Webroots oder zumindest per .htaccess
|
|
// gesperrt sein - siehe Deployment-Hinweise.
|
|
putenv('APP_SESSION_PATH=' . __DIR__ . '/var/sessions');
|
|
|
|
putenv('APP_MAIL_TRANSPORT=mail');
|
|
putenv('APP_MAIL_FROM=noreply@kaffeeliste.de');
|
|
putenv('APP_MAIL_FROM_NAME=Kaffeeliste');
|
|
|
|
// Pflichtangaben und schneller Kontakt. Fuer B2C muss eine Telefonnummer
|
|
// angegeben werden; das Ticketsystem ergaenzt sie als dokumentierbarer Kanal.
|
|
putenv('LEGAL_EMAIL=info@ctb-it.de');
|
|
putenv('LEGAL_PHONE=');
|
|
putenv('LEGAL_TICKET_URL=https://ticketsystem.ctb-it.de');
|
|
|
|
putenv('STRIPE_SECRET_KEY=');
|
|
putenv('STRIPE_PUBLISHABLE_KEY=');
|
|
putenv('STRIPE_WEBHOOK_SECRET=');
|
|
|
|
putenv('DOLIBARR_URL=https://verwaltung.ctb-it.de');
|
|
putenv('DOLIBARR_API_KEY=');
|
|
|
|
// Automatische Verbuchung weitergeleiteter PayPal-Zahlungsmails.
|
|
// PAYPAL_INBOX_BASE ist die zentrale Sammeladresse; jeder Mandant bekommt
|
|
// daraus per Plus-Adressierung eine eigene Variante (zahlungen+<token>@...),
|
|
// die im Backend unter "PayPal-Zahlungen" angezeigt wird. Das Postfach muss
|
|
// Plus-Adressierung an dieselbe Mailbox zustellen (Catch-All).
|
|
// Die Zugangsdaten sind bewusst Server-/Betreiber-Einstellungen und NICHT
|
|
// pro Mandant konfigurierbar. Abruf per Cron:
|
|
// php scripts/fetch-paypal-payments.php
|
|
putenv('PAYPAL_INBOX_BASE=zahlungen@kaffeeliste.de');
|
|
putenv('PAYPAL_IMAP_HOST=');
|
|
putenv('PAYPAL_IMAP_PORT=993');
|
|
putenv('PAYPAL_IMAP_FLAGS=/imap/ssl');
|
|
putenv('PAYPAL_IMAP_USER=');
|
|
putenv('PAYPAL_IMAP_PASS=');
|
|
putenv('PAYPAL_IMAP_MAILBOX=INBOX');
|
|
|
|
// Hinweis: Den frueheren Login-Bypass ueber DEV_AUTH_EMAIL gibt es nicht mehr -
|
|
// die Anmeldung laeuft immer ueber login.php, auch lokal. Die Variable wird nur
|
|
// noch von scripts/init-mysql-dev.php gelesen, um beim Aufsetzen einer
|
|
// Entwicklungsdatenbank den ersten Benutzer anzulegen.
|
|
|
|
// Betreiber-Push bei neuer Kundenregistrierung (optional). Beide Werte
|
|
// stehen im Pushover-Dashboard: PUSHOVER_TOKEN ist das App-Token einer dort
|
|
// angelegten Anwendung, PUSHOVER_USER der eigene User- oder Group-Key.
|
|
// Fehlt einer der beiden, ist die Benachrichtigung still deaktiviert.
|
|
putenv('PUSHOVER_TOKEN=');
|
|
putenv('PUSHOVER_USER=');
|
|
|
|
// Zwei-Faktor-Anmeldung: fuer alle Konten freiwillig einrichtbar. Auf '1'
|
|
// gesetzt, muessen Platform-Admins (Back-Office) zwingend einen zweiten
|
|
// Faktor haben - erst umlegen, nachdem die eigene Einrichtung getestet ist.
|
|
putenv('APP_REQUIRE_2FA_FOR_ADMINS=0');
|