diff --git a/admin/settings.php b/admin/settings.php index 42a4b98..1a50778 100644 --- a/admin/settings.php +++ b/admin/settings.php @@ -9,6 +9,7 @@ require_once __DIR__ . '/../includes/Auth.php'; require_once __DIR__ . '/../includes/Mailer.php'; require_once __DIR__ . '/../includes/I18n.php'; require_once __DIR__ . '/../includes/Ui.php'; +require_once __DIR__ . '/../includes/Upload.php'; $auth = new Auth(); $auth->requireAdmin(); @@ -41,6 +42,33 @@ if (isset($_POST['ajax_smtp_test'])) { $error = ''; $success = ''; +/** + * Liefert den neuen Wert eines Bildfeldes: Upload schlaegt URL, und ein + * gesetzter Entfernen-Schalter loescht die bisherige Datei. + */ +function resolveImageField(string $name, Database $db, string $kind): string +{ + $current = (string)$db->getSetting($name, ''); + + $uploaded = Upload::store($_FILES[$name . '_file'] ?? [], $kind); + if ($uploaded !== '') { + Upload::delete($current); + return $uploaded; + } + + if (!empty($_POST[$name . '_remove'])) { + Upload::delete($current); + return ''; + } + + $value = trim($_POST[$name] ?? ''); + if ($value !== $current && Upload::isLocal($current) && !Upload::isLocal($value)) { + Upload::delete($current); + } + + return $value; +} + // Einstellungen speichern if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_settings'])) { if (!$auth->validateCsrfToken($_POST['csrf_token'] ?? '')) { @@ -52,22 +80,31 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_settings'])) { if ($formType === 'general') { $settings['app_title'] = trim($_POST['app_title'] ?? ''); - $settings['logo_url'] = trim($_POST['logo_url'] ?? ''); - $settings['favicon_url'] = trim($_POST['favicon_url'] ?? ''); + $settings['logo_url'] = resolveImageField('logo_url', $db, 'image'); + $settings['favicon_url'] = resolveImageField('favicon_url', $db, 'favicon'); $settings['instruction_header'] = trim($_POST['instruction_header'] ?? ''); $settings['instruction_text'] = $_POST['instruction_text'] ?? ''; $settings['public_access'] = isset($_POST['public_access']) ? '1' : '0'; } + if ($formType === 'branding') { + foreach (['brand_accent', 'brand_accent_dark', 'brand_gradient_from', 'brand_gradient_to'] as $key) { + $value = strtolower(trim($_POST[$key] ?? '')); + $settings[$key] = preg_match('/^#[0-9a-f]{6}$/', $value) ? $value : ''; + } + $radius = (int)($_POST['brand_radius'] ?? Ui::DEFAULT_RADIUS); + $settings['brand_radius'] = (string)max(0, min(28, $radius)); + } + if ($formType === 'login') { $settings['login_panel_enabled'] = isset($_POST['login_panel_enabled']) ? '1' : '0'; $settings['login_brand_name'] = trim($_POST['login_brand_name'] ?? ''); - $settings['login_logo_url'] = trim($_POST['login_logo_url'] ?? ''); + $settings['login_logo_url'] = resolveImageField('login_logo_url', $db, 'image'); $settings['login_claim_title'] = trim($_POST['login_claim_title'] ?? ''); $settings['login_claim_text'] = trim($_POST['login_claim_text'] ?? ''); $settings['login_features'] = trim($_POST['login_features'] ?? ''); $settings['login_footer'] = trim($_POST['login_footer'] ?? ''); - $settings['login_bg_image'] = trim($_POST['login_bg_image'] ?? ''); + $settings['login_bg_image'] = resolveImageField('login_bg_image', $db, 'image'); $settings['login_bg_from'] = trim($_POST['login_bg_from'] ?? ''); $settings['login_bg_to'] = trim($_POST['login_bg_to'] ?? ''); $overlay = (int)($_POST['login_bg_overlay'] ?? 40); @@ -122,6 +159,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_settings'])) { } $success = __('settings_saved'); + } catch (RuntimeException $e) { + $error = $e->getMessage(); } catch (Exception $e) { $error = 'Fehler: ' . $e->getMessage(); } @@ -204,6 +243,11 @@ $cs = [ 'email_user_notification_subject' => $db->getSetting('email_user_notification_subject', '{APP_TITLE} - Berechtigungen geändert'), 'email_user_notification_body' => $db->getSetting('email_user_notification_body', "Hallo {USER_NAME},\n\n{CHANGES}"), 'print_template' => $db->getSetting('print_template', '
Gültig bis: {EXPIRY_DATE} {EXPIRY_TIME}
Site: {SITE_NAME}
Geräte: {MAX_USES}