110 lines
3.6 KiB
PHP
110 lines
3.6 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
|
|
{
|
|
if ($domain->is_server) {
|
|
return;
|
|
}
|
|
|
|
$selector = (string) config('mailpool.defaults.dkim_selector', 'mwl1');
|
|
$bits = (int) config('mailpool.defaults.dkim_bits', 2048);
|
|
|
|
$res = app(\App\Services\DkimService::class)
|
|
->generateForDomain($domain, $bits, $selector);
|
|
|
|
$dk = \App\Models\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 aufrufen (Pfad aus $res['priv_path']!)
|
|
dispatch(new \App\Jobs\InstallDkimKey(
|
|
domainId: $domain->id,
|
|
dkimKeyId: $dk->id,
|
|
privPath: $res['priv_path'],
|
|
dnsTxtContent: $res['dns_txt'],
|
|
));
|
|
|
|
// DNS-Records gleich anlegen/aktualisieren
|
|
app(\App\Services\DnsRecordService::class)->provision(
|
|
$domain,
|
|
$dk->selector,
|
|
"v=DKIM1; k=rsa; p={$dk->public_key_txt}",
|
|
[
|
|
'spf_tail' => \App\Models\Setting::get('mailpool.spf_tail', '~all'),
|
|
'spf_extra' => \App\Models\Setting::get('mailpool.spf_extra', []),
|
|
'dmarc_policy' => \App\Models\Setting::get('mailpool.dmarc_policy', 'none'),
|
|
'rua' => \App\Models\Setting::get('mailpool.rua', null),
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
// 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);
|
|
}
|
|
}
|