Rechtebechebung für User mit Sudorechte

main
boban 2025-10-19 23:53:50 +02:00
parent b80ff05a0a
commit 033ae32538
1 changed files with 63 additions and 7 deletions

View File

@ -2,8 +2,10 @@
namespace App\Observers;
use App\Models\DkimKey;
use App\Models\Domain;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Process;
class DomainObserver
{
@ -41,33 +43,87 @@ class DomainObserver
/**
* Beim Löschen alle DKIM-Selector dieser Domain aus OpenDKIM entfernen.
*/
public function deleted(Domain $domain): void
public function deleting(Domain $domain): void
{
try {
$svc = app(\App\Services\DkimService::class);
foreach ($domain->dkimKeys as $key) {
$svc->removeForDomain($domain, $key->selector);
// Selector VOR dem Delete einsammeln (Relation oder direkte Query)
$selectors = DkimKey::where('domain_id', $domain->id)->pluck('selector')->all();
$selectors = $selectors ?: ['mwl1'];
foreach ($selectors as $sel) {
$cmd = ['sudo','-n','/usr/local/sbin/mailwolt-remove-dkim', $domain->domain, $sel];
$res = Process::timeout(30)->run($cmd);
Log::info('DKIM remove exit', [
'domain' => $domain->domain,
'selector' => $sel,
'exit' => $res->exitCode(),
'out' => $res->output(),
'err' => $res->errorOutput(),
]);
if ($res->failed()) {
throw new \RuntimeException('OpenDKIM-Remove fehlgeschlagen: '.$res->errorOutput());
}
}
// Local storage wegräumen (kein Root nötig)
// lokale Backups unter storage/… löschen (App-User, kein sudo nötig)
$path = storage_path("app/private/dkim/{$domain->domain}");
if (is_dir($path)) {
\Illuminate\Support\Facades\File::deleteDirectory($path);
}
Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]);
// OpenDKIM neu laden (best effort)
Process::run(['sudo','-n','/bin/systemctl','reload','opendkim']);
} catch (\Throwable $e) {
Log::error("Domain delete cleanup failed", ['domain'=>$domain->domain,'error'=>$e->getMessage()]);
Log::error('Domain deleting cleanup failed', [
'domain' => $domain->domain,
'error' => $e->getMessage(),
]);
// Optional: Exception werfen, um das Löschen vollständig abzubrechen
// throw $e;
}
}
/** Nur noch Info-Log NACH dem Löschen (kein Cleanup mehr hier) */
public function deleted(Domain $domain): void
{
Log::info('Domain deleted', ['domain' => $domain->domain]);
}
/** Für forceDelete bei SoftDeletes */
public function forceDeleted(Domain $domain): void
{
$this->deleted($domain);
}
// public function deleted(Domain $domain): void
// {
// try {
// $svc = app(\App\Services\DkimService::class);
//
// foreach ($domain->dkimKeys as $key) {
// $svc->removeForDomain($domain, $key->selector);
// }
//
// // Local storage wegräumen (kein Root nötig)
// $path = storage_path("app/private/dkim/{$domain->domain}");
// if (is_dir($path)) {
// \Illuminate\Support\Facades\File::deleteDirectory($path);
// }
//
// Log::info("Domain deleted + DKIM cleaned", ['domain' => $domain->domain]);
// } catch (\Throwable $e) {
// Log::error("Domain delete cleanup failed", ['domain'=>$domain->domain,'error'=>$e->getMessage()]);
// }
// }
//
// public function forceDeleted(Domain $domain): void
// {
// $this->deleted($domain);
// }
// public function created(Domain $domain): void
// {
// if ($domain->is_server) {