From 890184d9852dc45b1549c26e099dd98f593f23cf Mon Sep 17 00:00:00 2001 From: boban Date: Sun, 19 Oct 2025 11:34:17 +0200 Subject: [PATCH] Domain Create Modal anpassen Fehler auf Null --- app/Livewire/Ui/Domain/DkimStatus.php | 70 +++++++++---------- .../livewire/ui/domain/dkim-status.blade.php | 29 ++++---- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/app/Livewire/Ui/Domain/DkimStatus.php b/app/Livewire/Ui/Domain/DkimStatus.php index 5051afb..7a60de2 100644 --- a/app/Livewire/Ui/Domain/DkimStatus.php +++ b/app/Livewire/Ui/Domain/DkimStatus.php @@ -4,9 +4,8 @@ namespace App\Livewire\Ui\Domain; use App\Models\Domain; use App\Services\DkimService; -use Illuminate\Contracts\View\View; -use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Process; +use Illuminate\View\View; use Livewire\Component; class DkimStatus extends Component @@ -16,44 +15,46 @@ class DkimStatus extends Component public function mount(Domain $domain, ?string $selector = null): void { - $this->domain = $domain; + $this->domain = $domain; + + // aktiven Selector aus DB, sonst Default aus Config $this->selector = $selector - ?: optional($domain->dkimKeys()->where('is_active', true)->latest()->first())->selector + ?: optional( + $domain->dkimKeys()->where('is_active', true)->latest()->first() + )->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'); } - /** interne Normalisierung nur fürs Dateisystem */ - protected function safeKey(string|Domain $value, int $len = 64): string - { - $val = $value instanceof Domain ? $value->domain : (string) $value; - return preg_replace('/[^a-zA-Z0-9_.-]+/', '_', substr($val, 0, $len)); - } - - /** Minimalcheck: existiert .private + steht’s in KeyTable & SigningTable? */ + /** Prüft nur lokale Voraussetzungen (Keyfile + KeyTable + SigningTable) */ protected function isDkimReady(string $domain, string $selector): bool { - $hasFile = is_readable("/etc/opendkim/keys/{$domain}/{$selector}.private"); + $d = preg_quote($domain, '/'); + $s = preg_quote($selector, '/'); - $keyTab = is_readable('/etc/opendkim/KeyTable') - ? (@file_get_contents('/etc/opendkim/KeyTable') ?: '') - : ''; - $signTab = is_readable('/etc/opendkim/SigningTable') - ? (@file_get_contents('/etc/opendkim/SigningTable') ?: '') - : ''; + // 1) Key-Datei unter /etc/opendkim/keys//.private + $keyFile = "/etc/opendkim/keys/{$domain}/{$selector}.private"; + $hasFile = is_readable($keyFile) && filesize($keyFile) > 0; - $inKey = (bool) preg_match( - "/^{$selector}\._domainkey\.{$domain}\s+{$domain}:{$selector}:/m", + // 2) Einträge in KeyTable + SigningTable + $keyTab = is_readable('/etc/opendkim/KeyTable') ? (string) @file_get_contents('/etc/opendkim/KeyTable') : ''; + $signTab = is_readable('/etc/opendkim/SigningTable') ? (string) @file_get_contents('/etc/opendkim/SigningTable') : ''; + + // Beispiele: + // KeyTable: mwl1._domainkey.sysmail.toastra.com sysmail.toastra.com:mwl1:/etc/opendkim/keys/sysmail.toastra.com/mwl1.private + // SigningTable:*@sysmail.toastra.com mwl1._domainkey.sysmail.toastra.com + $inKey = (bool) preg_match( + "/^{$s}\._domainkey\.{$d}\s+{$d}:{$s}:/m", $keyTab ); - $inSign = (bool) preg_match( - "/^\*\@{$domain}\s+{$selector}\._domainkey\.{$domain}\s*$/m", + $inSign = (bool) preg_match( + "/^\*\@{$d}\s+{$s}\._domainkey\.{$d}\s*$/m", $signTab ); return $hasFile && $inKey && $inSign; } - /** Button: (re)generieren + Helper einhängen + OpenDKIM reload */ + /** Reparieren/Neu erzeugen */ public function regenerate(?string $selector = null): void { $selector = $selector ?: ($this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1')); @@ -62,27 +63,22 @@ class DkimStatus extends Component /** @var DkimService $svc */ $svc = app(DkimService::class); - // 1) Key erzeugen/auffrischen – deine Funktion macht bereits alles Nötige: - // - schreibt .pem/.pub/.private/.txt in storage - // - pflegt DB (DkimKey) - // - ruft /usr/local/sbin/mailwolt-install-dkim auf - // - reloadet opendkim - $res = $svc->generateForDomain($this->domain, 2048, $selector); + // erzeugt/aktualisiert Keys in storage, pflegt DB, ruft Helper auf (falls vorhanden) + $svc->generateForDomain($this->domain, 2048, $selector); - // 2) Sicherstellen, dass der Helper wirklich geladen hat (idempotent): + // OpenDKIM neu laden (idempotent) Process::run(['systemctl', 'reload', 'opendkim']); - // 3) Status checken & Feedback + // Status neu prüfen $ok = $this->isDkimReady($this->domain->domain, $selector); - $this->dispatch('toast', - type: $ok ? 'success' : 'warning', - message: $ok ? 'DKIM ist aktiv.' : 'DKIM generiert – OpenDKIM/Tabellen prüfen.'); + $this->dispatch('toast', type: $ok ? 'success' : 'warning', + message: $ok ? 'DKIM ist aktiv.' : 'DKIM generiert – OpenDKIM prüfen.'); + } catch (\Throwable $e) { $this->dispatch('toast', type: 'error', message: 'DKIM Fehler: '.$e->getMessage()); } - // ggf. Selector für UI festhalten - $this->selector = $selector; + $this->selector = $selector; // für Folge-Checks } public function render(): View diff --git a/resources/views/livewire/ui/domain/dkim-status.blade.php b/resources/views/livewire/ui/domain/dkim-status.blade.php index 0d4f056..ca69361 100644 --- a/resources/views/livewire/ui/domain/dkim-status.blade.php +++ b/resources/views/livewire/ui/domain/dkim-status.blade.php @@ -1,19 +1,20 @@ -
-
- - - {{ $dkimOk ? 'DKIM aktiv' : 'DKIM fehlt' }} - +
+
+ + {{ $dkimOk ? 'DKIM aktiv' : 'DKIM fehlt' }}
- + + DKIM reparieren + Repariere… + + @endif