app.sample.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. declare(strict_types=1);
  3. $root = dirname(__DIR__);
  4. return [
  5. 'project_name' => 'Feuerwehr Mitgliedsantrag',
  6. 'base_url' => '/',
  7. 'contact_email' => 'kontakt@example.org',
  8. 'api_messages' => [
  9. 'common' => [
  10. 'method_not_allowed' => 'Method not allowed',
  11. 'invalid_csrf' => 'Invalid CSRF-Token.',
  12. 'request_blocked' => 'Anfrage blockiert.',
  13. 'invalid_email' => 'Bitte eine gültige E-Mail-Adresse eingeben.',
  14. ],
  15. 'load_draft' => [
  16. 'rate_limited' => 'Ratelimited. Zu viele Anfragen. Bitte später erneut versuchen.',
  17. 'already_submitted' => 'Für diese E-Mail liegt bereits ein abgeschlossener Antrag vor.',
  18. ],
  19. 'save_draft' => [
  20. 'rate_limited' => 'Ratelimited. Zu viele Speicheranfragen.',
  21. 'already_submitted' => 'Für diese E-Mail wurde bereits ein Antrag abgeschlossen.',
  22. 'lock_error' => 'Speichern derzeit nicht möglich.',
  23. 'blocked_fallback' => 'Bereits abgeschlossen.',
  24. 'success' => 'Entwurf gespeichert.',
  25. ],
  26. 'submit' => [
  27. 'rate_limited' => 'Ratelimited. Zu viele Anfragen. Bitte später erneut versuchen.',
  28. 'already_submitted' => 'Für diese E-Mail liegt bereits ein abgeschlossener Antrag vor.',
  29. 'upload_error' => 'Fehler bei Uploads.',
  30. 'validation_error' => 'Bitte Pflichtfelder prüfen. Nicht alle Pflichtfeler sind ausgefüllt oder ungültige Werte vorhanden.',
  31. 'lock_error' => 'Abschluss derzeit nicht möglich. Debug-Info: Lock konnte nicht gesetzt werden.',
  32. 'failure' => 'Abschluss fehlgeschlagen.',
  33. 'success' => 'Ihr Antrag wurde erfolgreich empfangen. Bei Fragen kontaktieren Sie %contact_email%.',
  34. ],
  35. 'reset' => [
  36. 'rate_limited' => 'Ratelimited. Zu viele Löschanfragen. Bitte später erneut versuchen.',
  37. 'already_submitted' => 'Für diese E-Mail liegt bereits ein abgeschlossener Antrag vor. Ein Zurücksetzen ist nicht möglich.',
  38. 'delete_error' => 'Daten konnten nicht gelöscht werden.',
  39. 'success' => 'Gespeicherte Daten wurden gelöscht.',
  40. ],
  41. 'delete_upload' => [
  42. 'invalid_upload_entry' => 'Ungültiger Upload-Eintrag.',
  43. 'rate_limited' => 'Ratelimited. Zu viele Löschanfragen. Bitte später erneut versuchen.',
  44. 'already_submitted' => 'Für diese E-Mail liegt bereits ein abgeschlossener Antrag vor.',
  45. 'draft_not_found' => 'Kein Entwurf gefunden.',
  46. 'upload_not_found' => 'Upload nicht gefunden.',
  47. 'delete_error' => 'Upload konnte nicht gelöscht werden.',
  48. 'success' => 'Upload gelöscht.',
  49. ],
  50. 'upload_preview' => [
  51. 'invalid_upload_entry' => 'Ungültiger Upload-Eintrag.',
  52. 'rate_limited' => 'Ratelimited. Zu viele Anfragen. Bitte später erneut versuchen.',
  53. 'draft_not_found' => 'Entwurf nicht gefunden.',
  54. 'upload_not_found' => 'Upload nicht gefunden.',
  55. 'file_not_found' => 'Datei nicht gefunden.',
  56. ],
  57. ],
  58. 'start' => [
  59. 'intro_text' => 'Bitte E-Mail eingeben. Bestehende Entwürfe werden automatisch geladen.',
  60. ],
  61. 'disclaimer' => [
  62. 'title' => 'Wichtiger Hinweis',
  63. 'text' => "Bitte lesen Sie diesen Hinweis vor Beginn sorgfaeltig.\n\nMit dem Fortfahren bestaetigen Sie, dass Ihre Angaben vollstaendig und wahrheitsgemaess sind.\nIhre Daten werden ausschliesslich zur Bearbeitung des Mitgliedsantrags verwendet.",
  64. 'accept_label' => 'Hinweis gelesen, weiter zum Antrag',
  65. ],
  66. 'address_disclaimer' => [
  67. 'text' => 'Bitte geben Sie Ihre vollstaendige Meldeadresse inklusive Hausnummer an.',
  68. ],
  69. 'retention' => [
  70. 'draft_days' => 14,
  71. 'submission_days' => 90,
  72. ],
  73. 'uploads' => [
  74. 'max_size' => 10 * 1024 * 1024,
  75. 'allowed_extensions' => ['pdf', 'jpg', 'jpeg', 'png', 'webp'],
  76. 'allowed_mimes' => [
  77. 'application/pdf',
  78. 'image/jpeg',
  79. 'image/png',
  80. 'image/webp',
  81. ],
  82. ],
  83. 'rate_limit' => [
  84. 'enabled' => true,
  85. 'requests' => 30,
  86. 'window_seconds' => 300,
  87. ],
  88. 'verification' => [
  89. 'required' => true,
  90. 'inactivity_seconds' => 3600,
  91. 'otp_ttl_seconds' => 600,
  92. 'otp_attempt_limit' => 5,
  93. 'resend_cooldown_seconds' => 60,
  94. ],
  95. 'admin' => [
  96. // Feste Zugangsdaten als Tabelle (hardcoded).
  97. // Hash mit: php -r "echo password_hash('DEIN-PASSWORT', PASSWORD_DEFAULT), PHP_EOL;"
  98. // Alternativ: Online Tool: https://bcrypt-generator.com/
  99. 'credentials' => [
  100. [
  101. 'username' => 'admin',
  102. 'password_hash' => '',
  103. ],
  104. ],
  105. 'session_timeout_seconds' => 3600,
  106. ],
  107. 'storage' => [
  108. 'drafts' => $root . '/storage/drafts',
  109. 'submissions' => $root . '/storage/submissions',
  110. 'uploads' => $root . '/storage/uploads',
  111. 'rate_limit' => $root . '/storage/rate_limit',
  112. 'logs' => $root . '/storage/logs',
  113. 'locks' => $root . '/storage/locks',
  114. ],
  115. ];