diff --git a/app/Observers/DomainObserver.php b/app/Observers/DomainObserver.php index 021ce3f..ca9a3cb 100644 --- a/app/Observers/DomainObserver.php +++ b/app/Observers/DomainObserver.php @@ -66,32 +66,53 @@ class DomainObserver /** * Beim Löschen alle DKIM-Selector dieser Domain aus OpenDKIM entfernen. */ + public function deleted(Domain $domain): void { try { - /** @var \App\Services\DkimService $svc */ $svc = app(\App\Services\DkimService::class); - // Entferne DKIM aus OpenDKIM Config - $svc->removeForDomain($domain); + foreach ($domain->dkimKeys as $key) { + $svc->removeForDomain($domain, $key->selector); + } - // Optionale lokale Dateien löschen + // Local storage wegräumen (kein Root nötig) $path = storage_path("app/private/dkim/{$domain->domain}"); if (is_dir($path)) { \Illuminate\Support\Facades\File::deleteDirectory($path); } - // Reload OpenDKIM - \Illuminate\Support\Facades\Process::run(['sudo','-n','/usr/bin/systemctl','reload','opendkim']); - Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]); } catch (\Throwable $e) { - Log::error("Domain delete cleanup failed", [ - 'domain' => $domain->domain, - 'error' => $e->getMessage(), - ]); + Log::error("Domain delete cleanup failed", ['domain'=>$domain->domain,'error'=>$e->getMessage()]); } } +// public function deleted(Domain $domain): void +// { +// try { +// /** @var \App\Services\DkimService $svc */ +// $svc = app(\App\Services\DkimService::class); +// +// // Entferne DKIM aus OpenDKIM Config +// $svc->removeForDomain($domain); +// +// // Optionale lokale Dateien löschen +// $path = storage_path("app/private/dkim/{$domain->domain}"); +// if (is_dir($path)) { +// \Illuminate\Support\Facades\File::deleteDirectory($path); +// } +// +// // Reload OpenDKIM +// \Illuminate\Support\Facades\Process::run(['sudo','-n','/usr/bin/systemctl','reload','opendkim']); +// +// Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]); +// } catch (\Throwable $e) { +// Log::error("Domain delete cleanup failed", [ +// 'domain' => $domain->domain, +// 'error' => $e->getMessage(), +// ]); +// } +// } public function forceDeleted(Domain $domain): void { diff --git a/app/Services/DkimService.php b/app/Services/DkimService.php index 1b81b14..7734083 100644 --- a/app/Services/DkimService.php +++ b/app/Services/DkimService.php @@ -159,28 +159,46 @@ class DkimService return $san; } - public function removeForDomain(Domain|string $domain): void + public function removeForDomain(Domain|string $domain, ?string $selector = null): void { - $domainName = $domain instanceof Domain ? $domain->domain : $domain; - $keyTable = '/etc/opendkim/KeyTable'; - $signTable = '/etc/opendkim/SigningTable'; - $keyDir = "/etc/opendkim/keys/{$domainName}"; + $name = $domain instanceof \App\Models\Domain ? $domain->domain : $domain; + $selector = $selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1'); - // Tabellen bereinigen - foreach ([$keyTable, $signTable] as $file) { - if (is_file($file)) { - $lines = file($file, FILE_IGNORE_NEW_LINES); - $filtered = array_filter($lines, fn($l) => !str_contains($l, $domainName)); - file_put_contents($file, implode(PHP_EOL, $filtered) . PHP_EOL); - } + // Root-Helper ausführen + $p = Process::run([ + 'sudo','-n','/usr/local/sbin/mailwolt-remove-dkim', + $name, $selector + ]); + if (!$p->successful()) { + throw new \RuntimeException('mailwolt-remove-dkim failed: '.$p->errorOutput()); } - // Key-Verzeichnis löschen - if (is_dir($keyDir)) { - \Illuminate\Support\Facades\File::deleteDirectory($keyDir); - } + // OpenDKIM neu laden + Process::run(['sudo','-n','/usr/bin/systemctl','reload','opendkim']); } +// public function removeForDomain(Domain|string $domain): void +// { +// $domainName = $domain instanceof Domain ? $domain->domain : $domain; +// $keyTable = '/etc/opendkim/KeyTable'; +// $signTable = '/etc/opendkim/SigningTable'; +// $keyDir = "/etc/opendkim/keys/{$domainName}"; +// +// // Tabellen bereinigen +// foreach ([$keyTable, $signTable] as $file) { +// if (is_file($file)) { +// $lines = file($file, FILE_IGNORE_NEW_LINES); +// $filtered = array_filter($lines, fn($l) => !str_contains($l, $domainName)); +// file_put_contents($file, implode(PHP_EOL, $filtered) . PHP_EOL); +// } +// } +// +// // Key-Verzeichnis löschen +// if (is_dir($keyDir)) { +// \Illuminate\Support\Facades\File::deleteDirectory($keyDir); +// } +// } + // protected function safeKey($value, int $max = 64): string // { // if (is_object($value)) {