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

<?php

namespace App\Service\Whm;

use Symfony\Component\Process\Process;

class WhmApi implements WhmApiInterface
{
    const WHM_API_NAME = 'whmapi1';

    const WHM_COMMAND_CREATE_TOKEN = 'api_token_create';
    const WHM_COMMAND_DELETE_TOKEN = 'api_token_revoke';
    const WHM_COMMAND_LIST_TOKEN = 'api_token_list';

    const DEFAULT_TOKEN_NAME = 'acl_api_token_ssl';
    const DEFAULT_EXPIRES_AT = 0; // The API token will not expire.

    const DEFAULT_USER = 'wh';

    const SUCCESS_RESPONSE = 'OK';

    /**
     * @return mixed
     * @throws WhmApiException
     */
    public function createToken(): string
    {
        $consoleCommand = [
            self::WHM_API_NAME,
            self::WHM_COMMAND_CREATE_TOKEN,
            '--output=jsonpretty',
            sprintf('token_name=%s', self::DEFAULT_TOKEN_NAME),
            sprintf('expires_at=%s', self::DEFAULT_EXPIRES_AT),
            sprintf('--user=%s', self::DEFAULT_USER),
            'acl-1=create-user-session',
            'acl-2=ssl',
            'acl-3=ssl-info'
        ];

        $process = new Process($consoleCommand);
        $process->run();

        $response = $this->getResponse($process);
        return $response['token'];
    }

    /**
     * @return array
     * @throws WhmApiException
     */
    public function deleteToken(): array
    {
        $consoleCommand = [
            self::WHM_API_NAME,
            self::WHM_COMMAND_DELETE_TOKEN,
            '--output=jsonpretty',
            sprintf('--user=%s', self::DEFAULT_USER),
            sprintf('token_name=%s', self::DEFAULT_TOKEN_NAME)
        ];

        $process = new Process($consoleCommand);
        $process->run();

        return $this->getResponse($process);
    }

    /**
     * @return array
     * @throws WhmApiException
     */
    public function listToken(): array
    {
        $consoleCommand = [
            self::WHM_API_NAME,
            self::WHM_COMMAND_LIST_TOKEN,
            '--output=jsonpretty',
            sprintf('--user=%s', self::DEFAULT_USER)
        ];

        $process = new Process($consoleCommand);
        $process->run();

        $response = $this->getResponse($process);

        return $response['tokens'] ?? [];
    }


    /**
     * @param Process $process
     * @return array
     * @throws WhmApiException
     */
    protected function getResponse(Process $process): array
    {
        if (!$process->isSuccessful()) {
            throw new WhmApiException($process->getOutput());
        }

        $response = json_decode($process->getOutput(), true);
        $this->checkResponse($response);

        return $response['data'] ?? [];
    }

    /**
     * @param array $data
     * @throws WhmApiException
     */
    protected function checkResponse(array $data = []): void
    {
        if (!isset($data['metadata']) || !isset($data['metadata']['reason'])) {
            throw new WhmApiException('Wrong whm response');
        }

        if ($data['metadata']['reason'] !== self::SUCCESS_RESPONSE) {
            throw new WhmApiException($data['metadata']['reason']);
        }
    }
}
Back to Directory File Manager