domain = $domain; // aktiven Selector aus DB; sonst Default aus Config $this->selector = $selector ?: optional( $domain->dkimKeys()->where('is_active', true)->latest()->first() )->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'); } /** * Prüft NUR lokal: * - Keyfile: /etc/opendkim/keys//.private * - KeyTable & SigningTable enthalten passende Zeilen */ protected function isDkimReady(string $domain, string $selector): bool { $d = preg_quote($domain, '/'); $s = preg_quote($selector, '/'); // 1) Key-Datei vorhanden & lesbar $keyFile = "/etc/opendkim/keys/{$domain}/{$selector}.private"; $hasFile = is_readable($keyFile) && (filesize($keyFile) > 0); // 2) Tabellen-Inhalte lesen (leer wenn Datei fehlt) $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') : ''; // Beispiel-Zeilen: // 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 // Robust gegen Mehrfach-Spaces/Tabs: $inKey = (bool) preg_match( "/^{$s}\._domainkey\.{$d}\s+{$d}:{$s}:/m", $keyTab ); $inSign = (bool) preg_match( "/^\*\@{$d}\s+{$s}\._domainkey\.{$d}\s*$/m", $signTab ); return $hasFile && $inKey && $inSign; } /** Button: (Re)generieren via Service (der ruft sudo-Helper auf) */ public function regenerate(?string $selector = null): void { $selector = $selector ?: ($this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1')); try { /** @var DkimService $svc */ $svc = app(DkimService::class); // erzeugt/aktualisiert Keys in storage, pflegt DB, // ruft /usr/local/sbin/mailwolt-install-dkim via sudo -n auf, // lädt opendkim neu (im Service) $svc->generateForDomain($this->domain, 2048, $selector); // 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 prüfen.' ); } catch (\Throwable $e) { $this->dispatch('toast', type: 'error', message: 'DKIM Fehler: '.$e->getMessage()); } // aktuellen Selector merken (falls der Fallback zuvor anders war) $this->selector = $selector; } public function render(): View { $sel = $this->selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'); $dkimOk = $this->isDkimReady($this->domain->domain, $sel); return view('livewire.ui.domain.dkim-status', compact('dkimOk')); } }