. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Hooks\OAuthClientSecret; use Espo\Core\Hook\Hook\BeforeSave; use Espo\Core\Utils\PasswordHash; use Espo\Core\Utils\Util; use Espo\Tools\OAuthServer\Entities\ClientSecret; use Espo\ORM\Entity; use Espo\ORM\Exceptions\PersistenceException; use Espo\ORM\Repository\Option\SaveOptions; use Espo\Tools\OAuthServer\ClientType; /** * @implements BeforeSave */ class SetFields implements BeforeSave { public function __construct( private PasswordHash $passwordHash, ) {} public function beforeSave(Entity $entity, SaveOptions $options): void { if ($entity->isNew()) { $this->setForNew($entity); } } private function prepareName(string $secret): string { return '...' . substr($secret, - 6); } private function setForNew(ClientSecret $entity): void { if ($entity->getClient()->getClientType() !== ClientType::Confidential) { throw new PersistenceException("Cannot create secret for Confidential client."); } $secret = Util::generateSecretKey(); $hash = $this->passwordHash->hash($secret); $entity->setName($this->prepareName($secret)); $entity->setHash($hash); $entity->setValue($secret); } }