Viewing File: /usr/local/cpanel/base/frontend/jupiter/ls_web_cache_manager/core/EcCertSite.php

<?php

/** *********************************************
 * LiteSpeed Web Cache Management Plugin for cPanel
 *
 * @author    Michael Alegre
 * @copyright 2020-2023 LiteSpeed Technologies, Inc.
 * @since     2.1
 * *******************************************
 */

namespace LsUserPanel;

use LsUserPanel\Lsc\UserLogger;
use LsUserPanel\Lsc\UserLSCMException;

/**
 *
 * @since 2.1
 */
class EcCertSite
{

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_HAS_SSL_VH = 'hasSslVhost';

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_DOCROOT = 'docroot';

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_SERVERNAME = 'serverName';

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_EC_EXISTS = 'ecExists';

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_EC_CERT_COVERED = 'ecCertCovered';

    /**
     * @since 2.1
     * @var   string
     */
    const FLD_LAST_GEN_MSG = 'lastGenMsg';

    /**
     * @since 2.1
     * @var   array
     */
    private $data;

    /**
     *
     * @since 2.1
     *
     * @param string   $docroot
     * @param string   $domain
     * @param bool     $sslVh
     * @param bool     $ecCert
     * @param string[] $ecCertCovered,
     * @param string   $lastGenMsg
     */
    public function __construct(
              $docroot,
              $domain,
              $sslVh,
              $ecCert,
        array $ecCertCovered,
              $lastGenMsg )
    {
        $this->init(
            $docroot,
            $domain,
            $sslVh,
            $ecCert,
            $ecCertCovered,
            $lastGenMsg
        );
    }

    /**
     *
     * @since 2.1
     *
     * @param string   $docroot
     * @param string   $domain
     * @param bool     $sslVh
     * @param bool     $ecCert
     * @param string[] $ecCertCovered
     * @param string   $lastGenMsg
     */
    private function init(
              $docroot,
              $domain,
              $sslVh,
              $ecCert,
        array $ecCertCovered,
              $lastGenMsg )
    {
        if ( ($realPath = realpath($docroot)) ) {
            $docroot = $realPath;
        }

        $this->data = array(
            self::FLD_DOCROOT         => $docroot,
            self::FLD_SERVERNAME      => $domain,
            self::FLD_HAS_SSL_VH      => $sslVh,
            self::FLD_EC_EXISTS       => $ecCert,
            self::FLD_EC_CERT_COVERED => $ecCertCovered,
            self::FLD_LAST_GEN_MSG    => $lastGenMsg
        );
    }

    /**
     *
     * @since 2.1
     *
     * @return string
     */
    public function __toString()
    {
        return sprintf(
            "%s (docroot=%s  hasSslVh=%d  ecCertExists=%s  "
                . "coveredDomains=%s  lastGenMsg=\"%s\")",
            $this->data[self::FLD_SERVERNAME],
            $this->data[self::FLD_DOCROOT],
            (int)$this->data[self::FLD_HAS_SSL_VH],
            (int)$this->data[self::FLD_EC_EXISTS],
            implode(',', $this->data[self::FLD_EC_CERT_COVERED]),
            $this->data[self::FLD_LAST_GEN_MSG]
        );
    }

    /**
     *
     * @since 2.1
     *
     * @param string $field
     *
     * @return mixed|null
     */
    public function getData( $field = '' )
    {
        if ( !$field ) {
            return $this->data;
        }

        if ( !isset($this->data[$field]) ) {
            /**
             * Error out
             */
            return null;
        }

        return $this->data[$field];
    }

    /**
     *
     * @since 2.1
     *
     * @return bool
     *
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::logMsg()
     *     call.
     */
    public function hasValidPath()
    {
        if ( !is_dir($this->data[self::FLD_DOCROOT]) ) {
            UserLogger::addUiMsg(
                "{$this->data[self::FLD_SERVERNAME]} - "
                    . _(
                        'DocRoot could not be found and has been removed from '
                            . 'EC Certificate Manger list.'
                    ),
                UserLogger::UI_ERR
            );
            UserLogger::logMsg(
                "{$this->data[self::FLD_SERVERNAME]} - DocRoot could not be "
                    . 'found and has been removed from EC Certificate Manager '
                    . 'list.',
                UserLogger::L_NOTICE
            );

            return false;
        }

        return true;
    }

    /**
     *
     * @since 2.1
     *
     * @param string $msg
     */
    private function setLastGenerationMessage( $msg )
    {
        $this->data[self::FLD_LAST_GEN_MSG] =
            '[' . date('Y-m-d H:i:s', time()) . "] $msg";
    }

    /**
     *
     * @since 2.1
     *
     * @throws UserLSCMException  Thrown indirectly by UserLogger::debug() call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::debug() call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     */
    public function generateEcCert()
    {
        $serverName = $this->getData(self::FLD_SERVERNAME);

        $result = CPanelWrapper::getCpanelObj()->uapi(
            'lsws',
            'generateEcCert',
            array( 'domain' => $serverName )
        );

        $data   = $result['cpanelresult']['result']['data'];
        $retVar = $data['retVar'];

        UserLogger::debug("EcCert command generate=$retVar for $serverName");

        if ( !empty(($output = $data['output'])) ) {
            UserLogger::debug('output = ' . var_export($output, true));
            $this->setLastGenerationMessage($output);
        }

        $ecCert = (bool)$data['ecCert'];

        if ( $retVar == 0 ) {
            UserLogger::addUiMsg(
                "$serverName - "
                    . _('Successfully generated a new EC certificate.'),
                UserLogger::UI_SUCC
            );
        }
        elseif ( $ecCert ) {
            UserLogger::addUiMsg(
                "$serverName - "
                    . _('EC certificate already exists, no need to generate.'),
                UserLogger::UI_SUCC
            );
        }
        else {
            UserLogger::addUiMsg(
                "$serverName - "
                    . _('Failed to generate a new EC certificate.'),
                UserLogger::UI_ERR
            );
        }

        $this->data[self::FLD_HAS_SSL_VH]      = (bool)$data['sslVh'];
        $this->data[self::FLD_EC_EXISTS]       = $ecCert;
        $this->data[self::FLD_EC_CERT_COVERED] =
            Ls_WebCacheMgr_Util::getCertificateAltNames(
                $data['ecCertFingerprint']
            )
        ;
    }

    /**
     *
     * @since 2.1
     *
     * @throws UserLSCMException  Thrown indirectly by UserLogger::debug() call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::debug() call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     * @throws UserLSCMException  Thrown indirectly by UserLogger::addUiMsg()
     *     call.
     */
    public function removeEcCert()
    {
        $serverName = $this->getData(self::FLD_SERVERNAME);

        $result = CPanelWrapper::getCpanelObj()->uapi(
            'lsws',
            'removeEcCert',
            array( 'domain' => $serverName )
        );

        $data = $result['cpanelresult']['result']['data'];
        $retVar = $data['retVar'];

        UserLogger::debug("EcCert command remove=$retVar for $serverName");

        if ( !empty(($output = $data['output'])) ) {
            UserLogger::debug('output = ' . var_export($output, true));
        }

        switch ( $retVar ) {

            case 0:
                UserLogger::addUiMsg(
                    "$serverName - "
                    . _('Successfully removed EC certificate.'),
                    UserLogger::UI_SUCC
                );
                break;

            case 100:
                UserLogger::addUiMsg(
                    "$serverName - " . _('Domain not found.'),
                    UserLogger::UI_ERR
                );
                break;

            case 101:
                UserLogger::addUiMsg(
                    "$serverName - " . _('No EC certificate found.'),
                    UserLogger::UI_SUCC
                );
                break;

            default:
                UserLogger::addUiMsg(
                    "$serverName - " . _('Failed to remove EC certificate.'),
                    UserLogger::UI_ERR
                );
        }

        $this->data[self::FLD_HAS_SSL_VH]      = (bool)$data['sslVh'];
        $this->data[self::FLD_EC_EXISTS]       = (bool)$data['ecCert'];
        $this->data[self::FLD_EC_CERT_COVERED] =
            Ls_WebCacheMgr_Util::getCertificateAltNames(
                $data['ecCertFingerprint']
            )
        ;
    }

}
Back to Directory File Manager