Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Anwendungskonfiguration
*
* Zentrale Konfigurationswerte für das IT-Dokumentationssystem.
* Alle sensiblen Werte werden aus Umgebungsvariablen geladen.
*/
return [
'name' => $_ENV['APP_NAME'] ?? 'OpenNIT',
'env' => $_ENV['APP_ENV'] ?? 'production',
'debug' => filter_var($_ENV['APP_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN),
'url' => $_ENV['APP_URL'] ?? 'https://localhost',
// SICHERHEITSKRITISCH: App-Key für Verschlüsselung
// Muss 32 Zeichen lang sein für AES-256
'key' => $_ENV['APP_KEY'] ?? '',
'timezone' => 'Europe/Berlin',
'locale' => 'de_DE',
// Logging
'log_level' => filter_var($_ENV['APP_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN) ? 'debug' : 'warning',
// Pfade
'paths' => [
'root' => dirname(__DIR__),
'public' => dirname(__DIR__) . '/public',
'storage' => $_ENV['STORAGE_PATH'] ?? dirname(__DIR__) . '/storage',
'templates' => dirname(__DIR__) . '/templates',
'cache' => dirname(__DIR__) . '/storage/cache',
'logs' => dirname(__DIR__) . '/storage/logs',
// Geschützte Uploads (außerhalb Webroot).
// Relative Pfade werden vom Projektverzeichnis aus aufgelöst.
'uploads' => (static function (): string {
$root = dirname(__DIR__);
$env = $_ENV['UPLOADS_PATH'] ?? '';
if ($env === '') return $root . '/storage/uploads';
return str_starts_with($env, DIRECTORY_SEPARATOR) ? $env : $root . '/' . ltrim($env, '/');
})(),
],
// Öffentliche Upload-URL-Präfixe (kein Login nötig).
// Alle anderen /uploads/*-Pfade erfordern eine aktive Session.
// Kommagetrennte Liste in PUBLIC_UPLOAD_PREFIXES überschreibt den Standard.
'public_upload_prefixes' => (static function (): array {
$env = $_ENV['PUBLIC_UPLOAD_PREFIXES'] ?? '';
if ($env === '') return ['/uploads/logo/', '/uploads/favicon/', '/uploads/login_bg/', '/uploads/loans/', '/uploads/asset-types/'];
return array_values(array_filter(array_map('trim', explode(',', $env))));
})(),
// Bild-Optimierung (verlustbehaftet, in-place beim Upload + per Backend-Knopf).
// Greift nur, wenn die GD-Bibliothek verfügbar ist – sonst No-op (Datei bleibt unangetastet).
// Sicherheitsnetz: vergrößert eine Datei nie und lässt sie bei jedem Fehler unverändert.
'images' => [
'optimize_on_upload' => filter_var($_ENV['IMAGE_OPTIMIZE_ON_UPLOAD'] ?? true, FILTER_VALIDATE_BOOLEAN),
'max_dim' => (int)($_ENV['IMAGE_MAX_DIM'] ?? 1920), // px – längere Kante; größere Bilder werden verkleinert
'quality' => (int)($_ENV['IMAGE_QUALITY'] ?? 82), // JPEG/WebP-Qualität (1–100)
],
// Review-Intervalle (Tage)
'review_intervals' => [
'default' => 365,
'options' => [30, 90, 180, 365, 730],
],
// Prüfstatus-Schwellenwerte (Tage vor Fälligkeit)
'review_status' => [
'warning_threshold' => 30,
],
];