<?php 
// On définit la clef d'authentification qui doit être identique à celle
// présente sur le serveur client.
define('REQUEST_AUTHENTICATE', '657c080af2561edfea164e9f0c6af7bde673a3a310d78');
// Préfixe et suffixe pour le script contenant la fonction
define('REMOTE_SCRIPT_PREFIX', 'remote_');
define('REMOTE_SCRIPT_SUFFIX', '.php');

// on définit le tableau qui sera linéarisé à la fin du script
$result = array();

if (empty($_GET['auth']) or $_GET['auth'] != REQUEST_AUTHENTICATE) {
   // Pas de clef authentification ou clef incorrecte.
   $result['exception'] = 'L\'authentification a échoué';
} else {
   if (empty($_GET['serviceName'])) {
      // S'il n'y a pas de nom de service, on lève une erreur
      $result['exception'] = 'Nom de service absent';
   } else {
      // Le nom du service ne doit contenir que des lettres, chiffres, "_" et
      // ":". La chaîne "::" servant à séparer le nom du script du service
      $serviceName = preg_replace('`[^\w:]`', '', $_GET['serviceName']); 
      // on sépare le nom du script, du nom du service
      list($script, $functionName) = explode('::', $serviceName); 
      // S'il n'y a pas de nom de service, par défaut, le nom du script porte
      // le nom du service.
      if (empty($functionName)) $functionName = $script; 
      // Le script est préfixé de "remote" et porte l'extention ".php"
      $scriptName = REMOTE_SCRIPT_PREFIX . $script . REMOTE_SCRIPT_SUFFIX;

      if (file_exists($scriptName)) {
         // Si le script existe, on le "charge"
         require $scriptName;

         if (function_exists($functionName)) {
            // Si la fonction existe, on prépare l'appel.
            // Si "args" n'existe pas, on considère qu'il n'y a pas d'arguments
            // Sinon, on la délinéarise
            if (empty($_GET['args'])) $args = array();
            else $args = unserialize($_GET['args']); 
            // On attrape des exceptions levées dans la fonction
            try {
               // On appelle la fonction et on place le résultat dans la
               // variable de résultat
               $result['return'] = call_user_func_array($functionName, $args);
            } catch(Exception $e) {
               // En cas d'exception, on remonte le message dans le résultat.
               $result['exception'] = $e->getMessage();
            } 
         } else {
            // La fonction n'existe pas dans le script appelé
            $result['exception'] = 'Nom de service ' . $functionName . ' inexistant';
         } 
      } else {
         // Le script n'existe pas.
         $result['exception'] = 'Script ' . $scriptName . ' introuvable';
      } 
   } 
} 
// On linéarise le résultat pour l'envoyer à l'appelant.
echo serialize($result);

?>