Comment charger le liveAPI PHP du CPanel

Discussion dans 'API RESTful PlanetHoster' démarrée par Ngilio, Mar 26, 2018.

Tags:
  1. Ngilio

    Ngilio New Member

    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.
     
  2. PH-Gabriel

    PH-Gabriel Moderateur Membre de l'équipe

    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).
     
  3. Ngilio

    Ngilio New Member

    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: Mar 28, 2018
  4. PH-Gabriel

    PH-Gabriel Moderateur Membre de l'équipe

    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
     
  5. Ngilio

    Ngilio New Member

    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 ?
     
  6. PH-Gabriel

    PH-Gabriel Moderateur Membre de l'équipe

    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 ?
     
  7. Ngilio

    Ngilio New Member

    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($curlCURLOPT_SSL_VERIFYPEER,0);        // Allow self-signed certs
                
    curl_setopt($curlCURLOPT_SSL_VERIFYHOST,0);         // Allow certs that do not match the hostname
                
    curl_setopt($curlCURLOPT_HEADER,0);                // Do not include header in output
                
    curl_setopt($curlCURLOPT_RETURNTRANSFER,1);        // Return contents of transfer on curl_exec
                
    $header[0] = "Authorization: Basic " base64_encode($this->whmusername.":".$this->whmpassword) . "\n\r";
                
    curl_setopt($curlCURLOPT_HTTPHEADER$header);    // set the username and password
                
    curl_setopt($curlCURLOPT_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);
     
  8. PH-Gabriel

    PH-Gabriel Moderateur Membre de l'équipe

Partager cette page