From 3f9ebd83005bf656b50db9e08a811802dcf89d14 Mon Sep 17 00:00:00 2001 From: boban Date: Sat, 18 Oct 2025 18:32:55 +0200 Subject: [PATCH] Domain Create Modal anpassen Fehler auf Null --- app/Services/DkimService.php | 118 +++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 20 deletions(-) diff --git a/app/Services/DkimService.php b/app/Services/DkimService.php index 4695809..444ce96 100644 --- a/app/Services/DkimService.php +++ b/app/Services/DkimService.php @@ -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