OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

app.php

3 KB
<?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,
    ],
];