Domain Create Modal anpassen Fehler auf Null

main
boban 2025-10-18 18:32:55 +02:00
parent 609bf48a46
commit 3f9ebd8300
1 changed files with 98 additions and 20 deletions

View File

@ -11,6 +11,85 @@ use RuntimeException;
class DkimService
{
/** Erzeugt Keypair & gibt den TXT-Record (ohne Host) zurück. */
// public function generateForDomain(Domain $domain, int $bits = 2048, string $selector = null): array
// {
// // 1) Selector zentral aus der Config (Fallback 'mwl1')
// $selector = $selector ?: (string) config('mailpool.defaults.dkim_selector', 'mwl1');
//
// $dirKey = $this->safeKey($domain);
// $selKey = $this->safeKey($selector, 32);
//
// $disk = Storage::disk('local');
// $baseRel = "dkim/{$dirKey}";
// $privRel = "{$baseRel}/{$selKey}.pem";
// $pubRel = "{$baseRel}/{$selKey}.pub";
//
// // 2) Idempotent: existiert das Paar schon? -> nur lesen & zurückgeben
// if ($disk->exists($privRel) && $disk->exists($pubRel)) {
// $privateKey = $disk->get($privRel);
// $publicKeyPem = $disk->get($pubRel);
// $publicKeyBase = self::extractPublicKeyBase64($publicKeyPem);
// if (strlen($publicKeyBase) < 300) {
// throw new \RuntimeException('DKIM: Public Key zu kurz vermutlich Parsing-Fehler.');
// }
// return [
// 'selector' => $selKey,
// 'priv_path' => storage_path("app/{$privRel}"),
// 'pub_path' => storage_path("app/{$pubRel}"),
// 'public_pem' => $publicKeyPem,
// 'private_pem' => $privateKey,
// 'dns_name' => "{$selKey}._domainkey",
// 'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
// 'bits' => $bits,
// ];
// }
//
// // 3) Sonst neu generieren
// $disk->makeDirectory($baseRel);
//
// $res = openssl_pkey_new([
// 'private_key_type' => OPENSSL_KEYTYPE_RSA,
// 'private_key_bits' => $bits,
// ]);
// if ($res === false) {
// throw new \RuntimeException('DKIM: openssl_pkey_new() fehlgeschlagen: ' . (openssl_error_string() ?: 'unbekannt'));
// }
//
// $privateKey = '';
// if (!openssl_pkey_export($res, $privateKey)) {
// throw new \RuntimeException('DKIM: openssl_pkey_export() fehlgeschlagen: ' . (openssl_error_string() ?: 'unbekannt'));
// }
//
// $details = openssl_pkey_get_details($res);
// if ($details === false || empty($details['key'])) {
// throw new \RuntimeException('DKIM: Public Key konnte nicht gelesen werden.');
// }
// $publicKeyPem = $details['key'];
// $publicKeyBase = self::extractPublicKeyBase64($publicKeyPem);
// if (strlen($publicKeyBase) < 300) {
// throw new \RuntimeException('DKIM: Public Key zu kurz vermutlich Parsing-Fehler.');
// }
//
// if (!$disk->put($privRel, $privateKey)) {
// throw new \RuntimeException("DKIM: Private-Key schreiben fehlgeschlagen: {$privRel}");
// }
// if (!$disk->put($pubRel, $publicKeyPem)) {
// throw new \RuntimeException("DKIM: Public-Key schreiben fehlgeschlagen: {$pubRel}");
// }
//
// // 4) Rückgabe
// return [
// 'selector' => $selKey,
// 'priv_path' => storage_path("app/{$privRel}"),
// 'pub_path' => storage_path("app/{$pubRel}"),
// 'public_pem' => $publicKeyPem,
// 'private_pem' => $privateKey,
// 'dns_name' => "{$selKey}._domainkey",
// 'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
// 'bits' => $bits,
// ];
// }
public function generateForDomain(Domain $domain, int $bits = 2048, string $selector = null): array
{
// 1) Selector zentral aus der Config (Fallback 'mwl1')
@ -20,11 +99,11 @@ class DkimService
$selKey = $this->safeKey($selector, 32);
$disk = Storage::disk('local');
$baseRel = "private/dkim/{$dirKey}";
$baseRel = "dkim/{$dirKey}";
$privRel = "{$baseRel}/{$selKey}.pem";
$pubRel = "{$baseRel}/{$selKey}.pub";
// 2) Idempotent: existiert das Paar schon? -> nur lesen & zurückgeben
// 2) Idempotent: existiert das Paar schon?
if ($disk->exists($privRel) && $disk->exists($pubRel)) {
$privateKey = $disk->get($privRel);
$publicKeyPem = $disk->get($pubRel);
@ -33,18 +112,18 @@ class DkimService
throw new \RuntimeException('DKIM: Public Key zu kurz vermutlich Parsing-Fehler.');
}
return [
'selector' => $selKey,
'priv_path' => storage_path("app/{$privRel}"),
'pub_path' => storage_path("app/{$pubRel}"),
'public_pem' => $publicKeyPem,
'private_pem' => $privateKey,
'dns_name' => "{$selKey}._domainkey",
'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
'bits' => $bits,
'selector' => $selKey,
'priv_path' => method_exists($disk,'path') ? $disk->path($privRel) : storage_path('app/'.$privRel),
'pub_path' => method_exists($disk,'path') ? $disk->path($pubRel) : storage_path('app/'.$pubRel),
'public_pem' => $publicKeyPem,
'private_pem' => $privateKey,
'dns_name' => "{$selKey}._domainkey",
'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
'bits' => $bits,
];
}
// 3) Sonst neu generieren
// 3) Neu generieren
$disk->makeDirectory($baseRel);
$res = openssl_pkey_new([
@ -77,16 +156,15 @@ class DkimService
throw new \RuntimeException("DKIM: Public-Key schreiben fehlgeschlagen: {$pubRel}");
}
// 4) Rückgabe
return [
'selector' => $selKey,
'priv_path' => storage_path("app/{$privRel}"),
'pub_path' => storage_path("app/{$pubRel}"),
'public_pem' => $publicKeyPem,
'private_pem' => $privateKey,
'dns_name' => "{$selKey}._domainkey",
'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
'bits' => $bits,
'selector' => $selKey,
'priv_path' => method_exists($disk,'path') ? $disk->path($privRel) : storage_path('app/'.$privRel),
'pub_path' => method_exists($disk,'path') ? $disk->path($pubRel) : storage_path('app/'.$pubRel),
'public_pem' => $publicKeyPem,
'private_pem' => $privateKey,
'dns_name' => "{$selKey}._domainkey",
'dns_txt' => "v=DKIM1; k=rsa; p={$publicKeyBase}",
'bits' => $bits,
];
}
protected function safeKey($value, int $max = 64): string