Give mail delivery its own admin page and move the origin probe off /.well-known

The mail page under System tries SMTP, PHP mail() and both sendmail
modes one by one or all at once, and saves the chosen way to .env
without ever showing the password. IONOS answers everything under
/.well-known/ itself with 403, so the address and HTTPS checks never
reached the installation; the probe now lives at /kantsites-origin
(ADR 122).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
kantarciandClaude Opus 5.5 committed 2026-10-12 21:07:27 +02:00
1 parent 2497b8cb69
commit b982cb8944
17 files changed
+597 -148

No files matched your search

+4 -4
View File
@@ -78,10 +78,10 @@ RewriteRule ^ index.php [L]
# Nichts ausliefern, was nur intern gebraucht wird - falls jemand das Paket versehentlich
# vollstaendig in den oeffentlichen Ordner legt statt nur public/.
# .well-known ausgenommen: Unter /.well-known/kantsites-origin prueft die Verwaltung, ob die
# Website unter einer Adresse hier ankommt (Adresse speichern, HTTPS erzwingen), und Apache
# prueft den ersten nicht vorhandenen Pfadteil gegen diese Regel - vorher antwortete die
# Probe mit 403. Zertifikatsanbieter (acme-challenge) brauchen den Ordner ebenso.
# .well-known ausgenommen: Zertifikatsanbieter (acme-challenge) brauchen den Ordner, und Apache
# prueft den ersten nicht vorhandenen Pfadteil gegen diese Regel. Die Probe der Verwaltung
# (Adresse speichern, HTTPS erzwingen) liegt nicht mehr dort, sondern unter /kantsites-origin:
# IONOS beantwortet /.well-known/ selbst mit 403 (ADR 122).
<FilesMatch "^\.(?!well-known$)|\.(env|db|sqlite|lock|md|yaml|yml|dist|log)$">
Require all denied
</FilesMatch>
+15 -1
View File
@@ -719,10 +719,24 @@ details.card > summary:hover { background: #fafbf8 }
.log-list { list-style: none; margin: 14px 0 0; padding: 0; display: grid; gap: 6px }
.log-list code { font-size: 11px; overflow-wrap: anywhere }
.mail-result { margin-top: 14px }
#mail .facts { margin-top: 0 }
.mail-result p { margin: 0 0 6px }
.mail-result p:last-child { margin-bottom: 0 }
.mail-result pre { white-space: pre-wrap; overflow-wrap: anywhere; font-size: 11px; margin: 6px 0 0 }
.mail-log-head { font-size: 14px; margin: 22px 0 0 }
/* Unterpunkte im Menü: eingerückt auf die Höhe des Textes, ohne Symbol. */
.nav-sub { list-style: none; margin: 2px 0 4px; padding: 0 }
.nav-sub .nav-item { padding-left: 42px; font-size: 13px }
.mail-form { margin-top: 18px; max-width: 640px }
.mail-form fieldset { border: 0; margin: 0 0 16px; padding: 0; min-width: 0 }
.mail-form legend { font-weight: 600; font-size: 13px; margin-bottom: 6px; padding: 0 }
.mail-form .check-label { display: flex; gap: 8px; align-items: baseline; margin: 4px 0 }
.mail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 8px 12px }
.mail-grid label { margin-top: 0 }
.mail-grid input { width: 100%; box-sizing: border-box }
.mail-actions { display: flex; flex-wrap: wrap; gap: 8px }
.mail-actions button { margin: 0 }
/* Ohne SMTP brauchen die Felder niemand; wo :has() fehlt, bleiben sie einfach sichtbar. */
.mail-form:has(input[name=weg]:checked:not([value=smtp])) .smtp-fields { display: none }
/* ---- the installer: six screens on an otherwise empty server ---------------------------- */