Comment charger le liveAPI PHP du cPanel

Ngilio

New Member
#1
Hello world.

La liveAPI PHP (https://documentation.cpanel.net/display/DD/Guide+to+the+LiveAPI+System+-+PHP+Class) semble très intéressante. Seulement comment l'exploiter ? La classe CPANEL est impossible à instancier et le fichier source " /usr/local/cpanel/php/cpanel.php " à importer sonne absent. Si le chemin d'accès doit être substitué contextuellement, quel en est le modèle de substitution ?

Bref, quelqu'un aurait-il déjà réussi à faire fonctionner le liveAPI PHP ? Si oui, merci de me détailler comment invoquer convenablement la classe CPANEL.

Cordialement.
 

PH-Gabriel

Moderateur
Membre du personnel
#2
Bonjour Ngilio,

La class CPANEL est en effet très utile pour faciliter la communication avec l'API de cPanel. Par contre, ce fichier est protégé et accessible seulement depuis un plug-in cPanel. Si vous tentez de l'utiliser depuis votre site internet, ceci ne va pas fonctionner.

Si vous avez besoin d'utiliser l'API cPanel avec votre site internet, je vous conseil de contacter l'API directement avec CURL (ou autre).
 

Ngilio

New Member
#3
Bonsoir. Merci de votre réponse.

Je suppose que "contacter l'API directement" équivaut à procéder par "cPanel or Webmail Session URL calls" tel que j'en vois l'exemple dans la documentation du CPANEL. Si oui, j'essaie CURL au plus vite.

Merci.

[Edit]
Cet appel est-il possible depuis un compte World ? J'ai beau essayer mais l'authentification semble ne pas marcher pourtant je pense bien suivre le modèle https://documentation.cpanel.net/display/DD/Guide+to+API+Authentication+-+Single+Sign+Onhttps://documentation.cpanel.net/display/DD/Guide+to+API+Authentication+-+Single+Sign+On

Serait-ce une fonctionnalité bridée par mon type de compte ? Si oui, que faire pour la passer ?

En attendant, ça charge longtemps pour me donner systématiquement bool(false)
 
Dernière édition:

PH-Gabriel

Moderateur
Membre du personnel
#4
cPanel possède plusieurs types d'authentifications, mais je crois que la seule compatible avec ce que vous voulez faire est celle où nous utilisons l'utilisateur et le mot de passe.

https://documentation.cpanel.net/di...cation+-+Username+and+Password+Authentication

Dans cet exemple, ils utilisent le port 2087 (WHM) pour communiquer, mais il sera aussi possible d'utiliser le port 2083 (cPanel).

La première étape consiste à encode en base64 votre "username: password" (sans espace) et à l'ajouter en tant qu'header à votre appel curl.

Le format du header doit être: "Authorization: Basic base64string"

Veuillez noter que c'est un risque important de sécurité de mettre votre utilisateur / mot de passe dans le code de votre site. N'oubliez pas que base64 n'est pas un système de cryptage sécuritaire. Il est seulement utilisé pour faciliter la communication des identifiants.

Par la suite, vous avez seulement à faire appel à l'url https://localhost:2083/votre/fonction pour récupérer vos données. Puisque vous utilisez le port SSL, il faudra aussi indiquer à curl d'accepter le certificat malgré que celui-ci ne correspond pas au domaine du serveur.

Voici un example avec la ligne de commande:

Code:
# getting base64 encoded string
encoded=$(php -r "echo base64_encode('user:password');")
# listing domains
curl -k -H "Authorization: Basic $encoded" https://localhost:2083/execute/DomainInfo/list_domains
En espérant d'avoir été clair.
Cordialement,
Gabriel
 

Ngilio

New Member
#5
Merci de votre réponse.
En reprenant l'exemple type et en appliquant un var_dump sur "$result".
- Le port 2083 me donne une chaine de caractères et " The firewall on this server is blocking your connection. ".
- Le port 2087 met longtemps à réagir puis renvoit false.

Comment puis-je m'assurer que la connexion ai réussie ou pas ?
 

PH-Gabriel

Moderateur
Membre du personnel
#6
Vous n'allez pas pouvoir utiliser 2087 en effet.

Pouvez-vous vérifier que vous utilisez bien localhost avec le port 2083 ? Le firewall ne devrait pas bloquer les connexions avec localhost.

Si c'est bien le cas, est-il possible de partager le code que vous utilisez ?
 

Ngilio

New Member
#7
Ok. J'essayais avec l'adresse extérieure au lieu de localhost. Avec localhost, ça semble passer pour l'exemple typique.
Bon pour ce qui est de mon cas pratique, j'ai besoin d'interagir avec MySQL. Du coup je ne sais trop comment le formuler. J'ai essayé :
* https://localhost:2083/json-api/execute/Mysql/create_database?name=.$dbName;
* https://localhost:2083/execute/Mysql/create_database?name=.$dbName;

$dbName étant le nom de la base de donnée à créer précédé de mon préfixe de compte comme requis

Les 2 me donnent : bool(false) resource(6) of type (Unknown)

Pourriez-vous me fournir une requête typique permettant créer une base de donnée svp ?

Mon code actuel est en gros :
PHP:
<?php
    class Curl_Request{
        private $cpanel;
        private $prefix='prefixe_';

        private $whmusername = "login";
        private $whmpassword = "password";

        private function FormatDbData($data){           
            $data=$prefix.SecureData::ToString(str_replace('-', '_', $data));
            return $data;
        }
        
        public static function GetInstance(){
            static $_instance=false;
            if(($_instance===false)){
                $_instance=new static;
            }
            return $_instance;
        }

        private function ExecuteRequest($request){           
            $query = "https://localhost:2083/json-api/Mysql/".$request;

            $curl = curl_init();                                // Create Curl Object
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);        // Allow self-signed certs
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);         // Allow certs that do not match the hostname
            curl_setopt($curl, CURLOPT_HEADER,0);                // Do not include header in output
            curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);        // Return contents of transfer on curl_exec
            $header[0] = "Authorization: Basic " . base64_encode($this->whmusername.":".$this->whmpassword) . "\n\r";
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);    // set the username and password
            curl_setopt($curl, CURLOPT_URL, $query);            // execute the query
            $result = curl_exec($curl);
            if ($result == false) {
                error_log("curl_exec threw error \"" . curl_error($curl) . "\" for $query");   
                                                                // log error if curl exec fails
            }
            curl_close($curl);
            //var_dump($curl);
            return $curl;
        }

        public function CreateDatabase($dbName){
            $dbName=$this->FormatDbData($dbName);
            $request='create_database?name='.$dbName;

            return $this->ExecuteRequest($request);
        }
    }

    $obj=Curl_Request::GetInstance();
    $result=$obj->CreateDatabase("test");
    var_dump($result);
 

Yeo

New Member
#9
Salut a tous,
Je suis bloqué au niveau de la connexion a mon cpanel,
Voila mon fichier cpanel.php:

PHP:
<?php

// This can also be the reseller who owns the cPanel user.
$whmusername = "root";
$whmpassword = "mon_mot_de_passe";

$query = "https://localhost:2083/json-api/listaccts?api.version=1";

$curl = curl_init();                                // Create Curl Object
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);       // Allow self-signed certs
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);       // Allow certs that do not match the hostname
curl_setopt($curl, CURLOPT_HEADER,0);               // Do not include header in output
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);       // Return contents of transfer on curl_exec
$header[0] = "Authorization: Basic " . base64_encode($whmusername.":".$whmpassword) . "\n\r";
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);    // set the username and password
curl_setopt($curl, CURLOPT_URL, $query);            // execute the query
$result = curl_exec($curl);
if ($result == false) {
    error_log("curl_exec threw error \"" . curl_error($curl) . "\" for $query");  
                                                    // log error if curl exec fails
}
curl_close($curl);

var_dump($curl);

print $result;

?>
Je constate que le paramètre "result":"0" du coût je peux plus avancer,
Excuser moi de vous déranger... Aidez moi
 

PH-Quentin

Administrator
Membre du personnel
#10
Bonjour Yeo,

Merci pour votre retour, d'après moi le problème vient du fait que vous procédez a un appel a la fonction "listaccts" qui est une fonction WHM et non cPanel. Dès lors le call doit se fait sur le port 2087 dédié à WHM (root) et non le port 2083 qui est utilisé par cPanel.

https://XXXXXX.planethoster.net:2087/cpsessXXXXXXXXX/json-api/listaccts?api.version=1

Pouvez-vous dès lors essayer cela et m'indiquer si cela fonctionne mieux ?
 
Haut