Initial Ladill Hosting app with Gitea deploy pipeline.
Deploy Ladill Hosting / deploy (push) Failing after 17s
Deploy Ladill Hosting / deploy (push) Failing after 17s
Shared web hosting extracted from the platform monolith, with CI deploy to /var/www/ladill-hosting matching Bird/Domains/Email. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Domain;
|
||||
|
||||
use App\Models\Domain;
|
||||
use App\Models\DomainDkimKey;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class DomainDkimService
|
||||
{
|
||||
public function ensureActive(Domain $domain): DomainDkimKey
|
||||
{
|
||||
$existing = DomainDkimKey::query()
|
||||
->where('domain_id', $domain->id)
|
||||
->where('status', 'active')
|
||||
->latest('id')
|
||||
->first();
|
||||
|
||||
if ($existing) {
|
||||
return $existing;
|
||||
}
|
||||
|
||||
$selectorPrefix = (string) config('mailinfra.dkim_selector_prefix', 'ladill');
|
||||
$selector = Str::lower(trim($selectorPrefix)) ?: 'ladill';
|
||||
$selector .= '1';
|
||||
|
||||
$publicKey = '';
|
||||
$privateKey = null;
|
||||
|
||||
if (function_exists('openssl_pkey_new')) {
|
||||
$resource = openssl_pkey_new([
|
||||
'private_key_bits' => 2048,
|
||||
'private_key_type' => OPENSSL_KEYTYPE_RSA,
|
||||
]);
|
||||
|
||||
if ($resource !== false) {
|
||||
openssl_pkey_export($resource, $privateOut);
|
||||
$details = openssl_pkey_get_details($resource);
|
||||
$publicPem = (string) ($details['key'] ?? '');
|
||||
$publicKey = preg_replace('/-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|\s+/', '', $publicPem) ?: '';
|
||||
$privateKey = $privateOut ?: null;
|
||||
}
|
||||
}
|
||||
|
||||
if ($publicKey === '') {
|
||||
$publicKey = Str::upper(Str::random(360));
|
||||
}
|
||||
|
||||
$privatePath = null;
|
||||
if (is_string($privateKey) && trim($privateKey) !== '') {
|
||||
$safeHost = Str::slug($domain->host, '_');
|
||||
$directory = storage_path('app/mail/dkim');
|
||||
File::ensureDirectoryExists($directory);
|
||||
$privatePath = $directory.'/'.$safeHost.'_'.$selector.'.key';
|
||||
File::put($privatePath, $privateKey);
|
||||
}
|
||||
|
||||
$key = DomainDkimKey::query()->create([
|
||||
'domain_id' => $domain->id,
|
||||
'selector' => $selector,
|
||||
'public_key_txt' => $publicKey,
|
||||
'private_key_path' => $privatePath,
|
||||
'status' => 'active',
|
||||
'generated_at' => now(),
|
||||
]);
|
||||
|
||||
Log::info('Generated DKIM key for domain', ['domain_id' => $domain->id, 'selector' => $selector]);
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
public function activeKey(Domain $domain): ?DomainDkimKey
|
||||
{
|
||||
return DomainDkimKey::query()
|
||||
->where('domain_id', $domain->id)
|
||||
->where('status', 'active')
|
||||
->latest('id')
|
||||
->first();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user