*/ class EmailAccount extends Record implements Di\CryptAware { use Di\CryptSetter; protected function filterInput($data) { parent::filterInput($data); if (property_exists($data, 'password')) { $data->password = $this->crypt->encrypt($data->password); } if (property_exists($data, 'smtpPassword')) { $data->smtpPassword = $this->crypt->encrypt($data->smtpPassword); } } public function processValidation(Entity $entity, $data) { parent::processValidation($entity, $data); if ($entity->get('useImap')) { if (!$entity->get('fetchSince')) { throw new BadRequest("EmailAccount validation: fetchSince is required."); } } } public function create(stdClass $data, CreateParams $params): Entity { if (!$this->user->isAdmin()) { $count = $this->entityManager ->getRDBRepository('EmailAccount') ->where([ 'assignedUserId' => $this->getUser()->getId() ]) ->count(); if ($count >= $this->getConfig()->get('maxEmailAccountCount', \PHP_INT_MAX)) { throw new Forbidden(); } } $entity = parent::create($data, $params); if (!$this->getUser()->isAdmin()) { $entity->set('assignedUserId', $this->getUser()->getId()); } $this->entityManager->saveEntity($entity); return $entity; } public function storeSentMessage(EmailAccountEntity $emailAccount, Message $message): void { /** @var AccountService $service */ $service = $this->injectableFactory->create(AccountService::class); $service->storeSentMessage($emailAccount->getId(), $message); } /** * @return EmailAccountEntity|null */ public function findAccountForUser(User $user, string $address) { $emailAccount = $this->entityManager ->getRDBRepository('EmailAccount') ->where([ 'emailAddress' => $address, 'assignedUserId' => $user->getId(), 'status' => 'Active', ]) ->findOne(); return $emailAccount; } /** * @return ?array */ public function getSmtpParamsFromAccount(EmailAccountEntity $emailAccount): ?array { $smtpParams = []; $smtpParams['server'] = $emailAccount->get('smtpHost'); if ($smtpParams['server']) { $smtpParams['port'] = $emailAccount->get('smtpPort'); $smtpParams['auth'] = $emailAccount->get('smtpAuth'); $smtpParams['security'] = $emailAccount->get('smtpSecurity'); if ($emailAccount->get('smtpAuth')) { $smtpParams['username'] = $emailAccount->get('smtpUsername'); $smtpParams['password'] = $emailAccount->get('smtpPassword'); $smtpParams['authMechanism'] = $emailAccount->get('smtpAuthMechanism'); } if (array_key_exists('password', $smtpParams)) { $smtpParams['password'] = $this->crypt->decrypt($smtpParams['password']); } $this->applySmtpHandler($emailAccount, $smtpParams); return $smtpParams; } return null; } /** * @param array $params */ public function applySmtpHandler(EmailAccountEntity $emailAccount, array &$params): void { /** @var ?class-string */ $handlerClassName = $emailAccount->get('smtpHandler'); if (!$handlerClassName) { return; } try { $handler = $this->injectableFactory->create($handlerClassName); } catch (Throwable $e) { $this->log->error( "EmailAccount: Could not create Smtp Handler for account {$emailAccount->getId()}. Error: " . $e->getMessage() ); return; } if (method_exists($handler, 'applyParams')) { $handler->applyParams($emailAccount->getId(), $params); } } }