. */ namespace SP\Services\CustomField; defined('APP_ROOT') || die(); use Exception; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use SP\Core\Crypt\Crypt; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\Core\Exceptions\ConstraintException; use SP\Core\Exceptions\QueryException; use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldData; use SP\Services\Crypt\UpdateMasterPassRequest; use SP\Services\Service; use SP\Services\ServiceException; use SP\Services\Task\TaskFactory; /** * Class CustomFieldCryptService * * @package SP\Mgmt\CustomFields */ final class CustomFieldCryptService extends Service { protected ?CustomFieldService $customFieldService = null; protected ?UpdateMasterPassRequest $request = null; /** * Actualizar los datos encriptados con una nueva clave * * @param UpdateMasterPassRequest $request * * @throws ServiceException */ public function updateMasterPassword(UpdateMasterPassRequest $request): void { try { $this->request = $request; $this->processUpdateMasterPassword( function (CustomFieldData $customFieldData) { return Crypt::decrypt( $customFieldData->getData(), $customFieldData->getKey(), $this->request->getCurrentMasterPass()); } ); } catch (Exception $e) { $this->eventDispatcher->notifyEvent('exception', new Event($e)); throw new ServiceException( __u('Error while updating the custom fields data'), SPException::ERROR, null, $e->getCode(), $e); } } /** * @throws ConstraintException * @throws QueryException */ protected function processUpdateMasterPassword(callable $decryptor): void { $customFields = $this->customFieldService->getAllEncrypted(); if (count($customFields) === 0) { $this->eventDispatcher->notifyEvent('update.masterPassword.customFields', new Event($this, EventMessage::factory() ->addDescription(__u('Update Master Password')) ->addDescription(__u('There aren\'t any data from custom fields'))) ); return; } $this->eventDispatcher->notifyEvent('update.masterPassword.customFields.start', new Event($this, EventMessage::factory() ->addDescription(__u('Update Master Password')) ->addDescription(__u('Updating encrypted data'))) ); if ($this->request->useTask()) { $task = $this->request->getTask(); TaskFactory::update($task, TaskFactory::createMessage( $task->getTaskId(), __('Update Master Password') )->setMessage(__('Updating encrypted data'))); } $errors = []; $success = []; foreach ($customFields as $customField) { try { $customField->setData($decryptor($customField)); $this->customFieldService->updateMasterPass( $customField, $this->request->getNewMasterPass() ); $success[] = $customField->getId(); } catch (Exception $e) { processException($e); $this->eventDispatcher->notifyEvent('exception', new Event($e)); $errors[] = $customField->getId(); } } $this->eventDispatcher->notifyEvent('update.masterPassword.customFields.end', new Event($this, EventMessage::factory() ->addDescription(__u('Update Master Password')) ->addDetail(__u('Records updated'), implode(',', $success)) ->addDetail(__u('Records not updated'), implode(',', $errors))) ); } /** * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ protected function initialize(): void { $this->customFieldService = $this->dic->get(CustomFieldService::class); } }