. */ namespace SP\Domain\Notification\Providers; use Exception; use SP\Core\Application; use SP\Core\Events\Event; use SP\Core\Messages\MailMessage; use SP\Core\Messages\TextFormatter; use SP\Domain\Core\Events\EventReceiver; use SP\Domain\Http\Ports\RequestService; use SP\Domain\Notification\Ports\MailService; use function SP\__; use function SP\processException; /** * Class MailHandler */ final class MailHandler extends \SP\Domain\Common\Providers\Provider implements EventReceiver { use \SP\Domain\Common\Providers\EventsTrait; public const EVENTS = [ 'create.', 'delete.', 'edit.', 'save.', 'import.ldap.end', 'run.backup.end', 'run.import.end', ]; public const EVENTS_FIXED = [ 'clear.eventlog', 'refresh.masterPassword', 'update.masterPassword.start', 'update.masterPassword.end', 'request.account', 'edit.user.password', 'save.config.', 'create.tempMasterPassword', ]; private readonly string $events; public function __construct( Application $application, private readonly MailService $mailService, private readonly RequestService $request ) { parent::__construct($application); $this->setup(); } private function setup(): void { $configEvents = $this->config->getConfigData()->getMailEvents(); if (count($configEvents) === 0) { $this->events = $this->parseEventsToRegex(self::EVENTS_FIXED); } else { $this->events = $this->parseEventsToRegex(array_merge($configEvents, self::EVENTS_FIXED)); } } /** * Devuelve los eventos que implementa el observador en formato cadena * * @return string */ public function getEventsString(): string { return $this->events; } /** * Evento de actualización * * @param string $eventType Nombre del evento * @param Event $event Objeto del evento */ public function update(string $eventType, Event $event): void { if (($eventMessage = $event->getEventMessage()) !== null) { try { $configData = $this->config->getConfigData(); $emails = $eventMessage->getExtra('email'); if ($emails && count($emails) > 0) { $recipients = $emails; } else { $recipients = $configData->getMailRecipients(); } $to = array_filter($recipients); if (empty($to)) { return; } $userData = $this->context->getUserData(); $mailMessage = new MailMessage(); if ($eventMessage->getDescriptionCounter() === 0 && $eventMessage->getDetailsCounter() === 0 ) { $mailMessage->addDescription(sprintf(__('Event: %s'), $eventType)); } else { $mailMessage->addDescription($eventMessage->composeText('
')); } $mailMessage->addDescriptionLine(); if ($userData->getId() !== null) { $mailMessage->addDescription( sprintf( __('Performed by: %s (%s)'), $userData->getName(), $userData->getLogin() ) ); } else { $mailMessage->addDescription( sprintf( __('Performed by: %s (%s)'), 'sysPass', 'APP' ) ); } $mailMessage->addDescription( sprintf( __('IP Address: %s'), $this->request->getClientAddress(true) ) ); $subject = $eventMessage->getDescription(new TextFormatter(), true) ?: $eventType; $this->mailService->send( $subject, $to, $mailMessage ); } catch (Exception $e) { processException($e); } } } }