settings.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. require_once __DIR__ . "/../config.php";
  3. require_once __DIR__ . "/../includes/functions.php";
  4. require_once __DIR__ . "/../includes/version.php";
  5. if (!defined("UPDATE_MANIFEST_URL")) {
  6. define("UPDATE_MANIFEST_URL", "");
  7. }
  8. function settingsUpdaterVersionCompareValue(string $version): string
  9. {
  10. return ltrim(trim($version), "vV");
  11. }
  12. function settingsGetUpdaterStatus(): array
  13. {
  14. $manifestUrl = trim((string) UPDATE_MANIFEST_URL);
  15. if ($manifestUrl === "") {
  16. return [
  17. "label" => "Update-Ziel ist nicht konfiguriert.",
  18. "available" => false,
  19. "version" => "",
  20. ];
  21. }
  22. $context = stream_context_create([
  23. "http" => [
  24. "method" => "GET",
  25. "timeout" => 3,
  26. "ignore_errors" => true,
  27. "header" => "User-Agent: PSA-Orderform-Settings/" . APP_VERSION . "\r\n",
  28. ],
  29. ]);
  30. $body = @file_get_contents($manifestUrl, false, $context);
  31. if ($body === false) {
  32. return [
  33. "label" => "Update-Status konnte nicht geladen werden.",
  34. "available" => false,
  35. "version" => "",
  36. ];
  37. }
  38. $manifest = json_decode($body, true);
  39. if (!is_array($manifest)) {
  40. return [
  41. "label" => "Update-Status ist ungültig.",
  42. "available" => false,
  43. "version" => "",
  44. ];
  45. }
  46. $version = trim((string) ($manifest["version"] ?? $manifest["latest"] ?? ""));
  47. if (!preg_match('/^v\d+\.\d+\.\d+$/', $version)) {
  48. return [
  49. "label" => "Update-Version ist ungültig.",
  50. "available" => false,
  51. "version" => "",
  52. ];
  53. }
  54. $available =
  55. version_compare(
  56. settingsUpdaterVersionCompareValue($version),
  57. settingsUpdaterVersionCompareValue(APP_VERSION),
  58. ">",
  59. );
  60. return [
  61. "label" => $available
  62. ? "Update verfügbar: " . $version
  63. : "Kein Update verfügbar.",
  64. "available" => $available,
  65. "version" => $version,
  66. ];
  67. }
  68. if (empty($_SESSION['admin_logged_in'])) {
  69. header("Location: login.php");
  70. exit();
  71. }
  72. $pageTitle = "Einstellungen";
  73. $message = "";
  74. $messageType = "";
  75. if ($_SERVER['REQUEST_METHOD'] === "POST" && isset($_POST['save_settings'])) {
  76. // Validate CSRF token
  77. if (!validateCsrfToken($_POST['csrf_token'] ?? "")) {
  78. $message = "Ungültiges Token. Bitte versuchen Sie es erneut.";
  79. $messageType = "error";
  80. } else {
  81. $settings = array_merge(getSystemSettings(), [
  82. "order_recipient_email" => $_POST['order_recipient_email'] ?? "",
  83. "attach_order_pdf_to_admin_email" => isset(
  84. $_POST['attach_order_pdf_to_admin_email'],
  85. ),
  86. ]);
  87. if (saveSystemSettings($settings)) {
  88. logAccess("Admin updated system settings");
  89. $message = "Einstellungen wurden gespeichert.";
  90. $messageType = "success";
  91. } else {
  92. $message = "Einstellungen konnten nicht gespeichert werden.";
  93. $messageType = "error";
  94. }
  95. }
  96. }
  97. $settings = getSystemSettings();
  98. $updaterStatus = settingsGetUpdaterStatus();
  99. $bodyClass = "admin-page";
  100. include __DIR__ . "/../includes/header.php";
  101. ?>
  102. <div class="admin-header">
  103. <h2>Einstellungen</h2>
  104. <div>
  105. <a href="index.php" class="btn btn-secondary">Zurück zum Dashboard</a>
  106. </div>
  107. </div>
  108. <?php if ($message !== ""): ?>
  109. <div class="alert alert-<?php echo escape($messageType); ?>">
  110. <?php echo escape($message); ?>
  111. </div>
  112. <?php endif; ?>
  113. <div class="panel panel-lg">
  114. <form method="POST">
  115. <?php echo csrfField(); ?>
  116. <div class="form-group">
  117. <label for="order_recipient_email">Empfängeradresse für interne Bestellungen *</label>
  118. <input type="email" id="order_recipient_email" name="order_recipient_email" required value="<?php echo escape(
  119. $settings["order_recipient_email"],
  120. ); ?>">
  121. </div>
  122. <div class="form-group">
  123. <label class="checkbox-label">
  124. <input type="checkbox" name="attach_order_pdf_to_admin_email" value="1" <?php echo !empty(
  125. $settings["attach_order_pdf_to_admin_email"]
  126. )
  127. ? "checked"
  128. : ""; ?>>
  129. PDF an interne Bestell-E-Mails anhängen
  130. </label>
  131. </div>
  132. <button type="submit" name="save_settings" class="btn">Speichern</button>
  133. </form>
  134. </div>
  135. <div class="panel panel-lg mt-4">
  136. <h3>Updater</h3>
  137. <p>Installierte Version: <?php echo escape(APP_VERSION); ?></p>
  138. <p>Update-Status: <?php echo escape($updaterStatus["label"]); ?></p>
  139. <p><a href="updater.php" class="btn btn-secondary">Updater öffnen</a></p>
  140. </div>
  141. <?php include __DIR__ . "/../includes/footer.php"; ?>