mailwolt/app/Observers/DomainObserver.php

67 lines
1.9 KiB
PHP

<?php
namespace App\Observers;
use App\Jobs\InstallDkimKey;
use App\Jobs\RemoveDkimKey;
use App\Models\DkimKey;
use App\Models\Domain;
use App\Services\DkimService;
class DomainObserver
{
/**
* DKIM bei neuen Domains erzeugen + in OpenDKIM installieren.
* Läuft NUR, wenn die Domain aktiv ist (anpassbar).
*/
public function created(Domain $domain): void
{
// Standardwerte aus Config oder .env
$selector = config('mailwolt.dkim.selector', 'mwl1');
$bits = (int) config('mailwolt.dkim.bits', 2048);
// Keypair erzeugen
$res = app(DkimService::class)->generateForDomain(
domainId: $domain,
bits: $bits,
selector: $selector
);
// In dkim_keys speichern
$dk = DkimKey::create([
'domain_id' => $domain->id,
'selector' => $res['selector'],
'private_key_pem' => $res['private_pem'],
'public_key_txt' => preg_replace('/^v=DKIM1; k=rsa; p=/', '', $res['dns_txt']),
'is_active' => true,
]);
// Helper-Job zum Installieren starten
InstallDkimKey::dispatch(
domainId: $domain->id,
dkimKeyId: $dk->id,
privPath: $res['priv_path'],
dnsTxtContent: $res['dns_txt']
)->afterCommit();
}
/**
* Beim Löschen alle DKIM-Selector dieser Domain aus OpenDKIM entfernen.
*/
public function deleted(Domain $domain): void
{
// Falls SoftDeletes im Spiel, willst du evtl. forceDeleted spiegeln (s.u.)
foreach ($domain->dkimKeys()->get() as $dk) {
RemoveDkimKey::dispatch(
domainId: $domain->id,
selector: $dk->selector
)->afterCommit();
}
}
public function forceDeleted(Domain $domain): void
{
$this->deleted($domain);
}
}