Viewing File: /usr/local/cpanel/whostmgr/docroot/cgi/ncssl/source/src/Service/State/StateUser.php

<?php

namespace App\Service\State;

use App\Entity\Certificate;
use App\Entity\User;
use App\Service\CpanelApi\Adapter\CliAdapter;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use League\OAuth2\Client\Token\AccessToken;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\Security\Core\User\UserInterface;

class StateUser
{
    private ?UserInterface $user;

    public function __construct(
        private readonly EntityManagerInterface $entityManager,
        private readonly Security $security,
        private readonly ClientRegistry $clientRegistry,
        private readonly CliAdapter $adapter,
    ) {
        $this->user = $this->security->getUser();
    }

    public function getAccessToken(): ?AccessToken
    {
        $user = $this->getUser();
        $accessToken = $user->getAccessToken();

        if (!$accessToken) {
            return null;
        }

        if ($accessToken->hasExpired()) {
            $accessToken = $this->clientRegistry->getClient('namecheap')->refreshAccessToken($accessToken->getRefreshToken(), ['access_token' => $accessToken->getToken()]);
            $user->setAccessToken($accessToken);
            $this->entityManager->flush();
        }

        return $user->getAccessToken();
    }

    /**
     * @return UserInterface
     */
    public function getUser(): UserInterface
    {
        return $this->user ?? $this->setUserByName($_SERVER['USER']);
    }

    /**
     * @param User|null $user
     */
    public function setUser(?User $user): void
    {
        if ($user) {
            $this->adapter->setUsername($user->getName());
        }

        $this->user = $user;
    }

    /**
     * @param string $name
     *
     * @return UserInterface
     */
    public function setUserByName(string $name): UserInterface
    {
        $user = $this->entityManager->getRepository(User::class)->findOneBy(['name' => $name]);

        if (!$user) {
            $user = new User();
            $user->setName($name);
            $this->entityManager->persist($user);
            $this->entityManager->flush();
        }

        $this->setUser($user);

        return $this->getUser();
    }

    /**
     * @throws Exception
     */
    public function setUserByCertificateId(int $certificateId): UserInterface
    {
        $certificate = $this->entityManager->getRepository(Certificate::class)->find($certificateId);

        if (!$certificate) {
            throw new \RuntimeException(sprintf('Can\'t find user by certificateId: %s, certificate not found', $certificateId));
        }

        $user = $certificate->getUser();

        $this->setUser($user);

        return $this->getUser();
    }
}
Back to Directory File Manager