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

<?php

namespace App\Service\Certificate;

use App\Repository\CertificateRepository;
use App\Service\CpanelHelper;
use App\Service\NcPlugin\PluginException;
use App\Entity\Certificate as CertificateEntity;
use Doctrine\ORM\EntityManagerInterface;

class PrivateKey
{
    public function __construct(
        private readonly CpanelHelper $cpanelHelper,
        private readonly EntityManagerInterface $entityManager,
    ) {
    }

    /**
     * @throws PluginException
     */
    private function getPkIdByCertificate($cert)
    {
        $usersPKs = $this->cpanelHelper->getPrivateKeys();
        foreach ($usersPKs as $pk) {
            $privateKey = $this->cpanelHelper->getPrivateKey($pk['id']);
            if (openssl_x509_check_private_key($cert, $privateKey)) {
                return $pk['id'];
            }
        }
        return null;
    }

    /**
     * @throws PluginException
     */
    public function restorePrivateKeyId(CertificateEntity $certificate, $certBody): CertificateEntity
    {
        $friendlyName = $this->cpanelHelper->generatePrivateKeyFriendlyName($certificate->getNcId());
        $privateKeyId = $this->cpanelHelper->getPrivateKeyId($friendlyName);

        if (empty($privateKeyId)) {
            $privateKeyId = $this->getPkIdByCertificate($certBody);
        }

        if (!empty($privateKeyId)) {
            $certificate->setPrivatekeyId($privateKeyId);
            $this->cpanelHelper->renamePrivateKey($certificate->getPrivatekeyId(), $friendlyName);
        } else {
            $certificate->setStatus(CertificateEntity::STATUS_CORRUPTED);
        }

        $this->entityManager->persist($certificate);
        $this->entityManager->flush();

        return $certificate;
    }
}
Back to Directory File Manager