From 4960cd1cbc5af0dac019e65edae9b4380ca7766c Mon Sep 17 00:00:00 2001 From: Laurent Giovannoni <laurent.giovannoni@maarch.org> Date: Sun, 24 Oct 2010 17:11:26 +0000 Subject: [PATCH] evol : soap server in core --- .../core/class/web_service/SOAPserver.php | 50 +++++ core/trunk/core/class/web_service/server.php | 187 ++++++++++++++++++ .../trunk/core/class/web_service/services.php | 75 +++++++ 3 files changed, 312 insertions(+) create mode 100755 core/trunk/core/class/web_service/SOAPserver.php create mode 100755 core/trunk/core/class/web_service/server.php create mode 100755 core/trunk/core/class/web_service/services.php diff --git a/core/trunk/core/class/web_service/SOAPserver.php b/core/trunk/core/class/web_service/SOAPserver.php new file mode 100755 index 00000000000..47882c3e327 --- /dev/null +++ b/core/trunk/core/class/web_service/SOAPserver.php @@ -0,0 +1,50 @@ +<?php + +require('SOAP/Server.php'); +require('SOAP/Disco.php'); +require('services.php'); + +if (!isset($SOAP_dispatch_map)) { + $SOAP_dispatch_map = Array(); +} + +class MySoapServer { + var $__dispatch_map; + var $__typedef; + + function __construct() { + global $SOAP_dispatch_map, $SOAP_typedef; + $this->__dispatch_map = $SOAP_dispatch_map; + $this->__typedef = $SOAP_typedef; + } + + function __dispatch($methodname) { + if(isset($this->__dispatch_map[$methodname])) { + return $this->__dispatch_map[$methodname]; + } + return null; + } + + public static function __call($method, $args) { + return call_user_func_array($method, $args); + } + +} + +$server = new SOAP_Server(); +$webservice = new MySoapServer(); +$server->addObjectMap($webservice,'urn:MySoapServer'); + +if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST') { + $server->service($HTTP_RAW_POST_DATA); +} else { + $disco = new SOAP_DISCO_Server($server,'MySoapServer'); + header("Content-type: text/xml"); + if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) { + echo $disco->getWSDL(); + } else { + echo $disco->getDISCO(); + } +} + +?> diff --git a/core/trunk/core/class/web_service/server.php b/core/trunk/core/class/web_service/server.php new file mode 100755 index 00000000000..204dd1c2181 --- /dev/null +++ b/core/trunk/core/class/web_service/server.php @@ -0,0 +1,187 @@ +<?php +$session_name=md5(time()); +session_name($session_name); + +if(!isset($SOAP_dispatch_map)) { + $SOAP_dispatch_map = Array(); +} +if(!isset($XMLRPC_dispatch_map)) { + $XMLRPC_dispatch_map = Array(); +} +if(!isset($SOAP_typedef)) { + $SOAP_typedef = Array(); +} + +chdir('../../../'); + +unset($_SESSION['config']); +unset($_SESSION['businessapps']); + +/*********************** + * * + * Import des services * + * * + ***********************/ +require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_functions.php"); +require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_portal.php"); +require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_db.php"); +require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_request.php"); +require_once("core".DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_core_tools.php"); + +$portal = new portal(); +$portal->unset_session(); +$portal->build_config(); + +$coreTools = new core_tools(); +$coreTools->build_core_config("core".DIRECTORY_SEPARATOR."xml".DIRECTORY_SEPARATOR."config.xml"); +$_SESSION["config"]["app_id"] = $_SESSION["businessapps"][0]["appid"]; +require_once("apps".DIRECTORY_SEPARATOR.$_SESSION["businessapps"][0]["appid"].DIRECTORY_SEPARATOR."class".DIRECTORY_SEPARATOR."class_business_app_tools.php"); + +$businessAppTools = new business_app_tools(); +$businessAppTools->build_business_app_config(); + +//retrieveWSApps(); +//retrieveWSModules(); +if($_SERVER["PHP_AUTH_USER"] && $_SERVER["PHP_AUTH_PW"] && preg_match("/^Basic /", $_SERVER["HTTP_AUTHORIZATION"])) { + list($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6))); +} + +$authenticated = false; +if($_SERVER["PHP_AUTH_USER"] || $_SERVER["PHP_AUTH_PW"]) { + $connexion = new dbquery(); + $connexion->connect(); + $connexion->query("select * from ".$_SESSION['tablename']['users']." where user_id = '".$_SERVER["PHP_AUTH_USER"]."' and password = '".md5($_SERVER["PHP_AUTH_PW"])."' and STATUS <> 'DEL'"); + if($connexion->nb_result() > 0) { + $authenticated = true; + } +} + +if(!$authenticated) { + header("WWW-Authenticate: Basic realm=\"Maarch WebServer Engine\""); + if (preg_match("/Microsoft/", $_SERVER["SERVER_SOFTWARE"])) { + header("Status: 401 Unauthorized"); + exit(); + } else { + header("HTTP/1.0 401 Unauthorized"); + echo "Access denied"; + exit; + } +} + +/*function retrieveWSApps() { + if(file_exists($_SESSION['config']['businessapppath'].DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'ws.php')) { + require($_SESSION['config']['businessapppath'].DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'ws.php'); + } +}*/ + +/*function retrieveWSModules() { + for($cptModules=0;$cptModules<count($_SESSION['modules']);$cptModules++) { + if($_SESSION['modules'][$cptModules]['moduleid']<> "" && file_exists($_SESSION['pathtomodules'].$_SESSION['modules'][$cptModules]['moduleid'].DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'ws.php')){ + require($_SESSION['pathtomodules'].$_SESSION['modules'][$cptModules]['moduleid'].DIRECTORY_SEPARATOR.'class'.DIRECTORY_SEPARATOR.'ws.php'); + } + } +}*/ + +require('services.php'); + +/******************************************************** + * * + * Initiation des variables de description des services * + * * + ********************************************************/ +if(!isset($SOAP_dispatch_map)) { + $SOAP_dispatch_map = Array(); +} +if(!isset($SOAP_typedef)) { + $SOAP_typedef = Array(); +} +if(!isset($XMLRPC_dispatch_map)) { + $XMLRPC_dispatch_map = Array(); +} + +/**************************************************************** + * * + * Définition de la classe qui présente les webservices en SOAP * + * (Elle ne sera instanciée que si il y en a besoin) * + * * + ****************************************************************/ +class MySoapServer { + var $__dispatch_map; + var $__typedef; + + function __construct() { + global $SOAP_dispatch_map, $SOAP_typedef; + $this->__dispatch_map = $SOAP_dispatch_map; + $this->__typedef = $SOAP_typedef; + } + + function __dispatch($methodname) { + if (isset($this->__dispatch_map[$methodname])){ + return $this->__dispatch_map[$methodname]; + } + return null; + } + + public function __call($method, $args) { + return call_user_func_array($method, $args); + } +} + +/********************************* + * * + * définition des wrappers (DRY) * + * * + *********************************/ +function importSOAPLibs(){ + require('SOAP/Server.php'); + require('SOAP/Disco.php'); +} + +function launchSOAPServer(){ + $server = new SOAP_Server(); + $webservice = new MySoapServer(); + $server->addObjectMap($webservice,'urn:MySoapServer'); + return $server; +} + +function makeWSDL(){ + importSOAPLibs(); + $server = launchSOAPServer(); + $disco = new SOAP_DISCO_Server($server,'MySoapServer'); + header("Content-type: text/xml"); + echo $disco->getWSDL(); +} + +function makeSOAPServer(){ + global $HTTP_RAW_POST_DATA; + importSOAPLibs(); + $server = launchSOAPServer(); + $server->service($HTTP_RAW_POST_DATA); +} + +function makeDISCO(){ + importSOAPLibs(); + $server = launchSOAPServer(); + $disco = new SOAP_DISCO_Server($server,'MySoapServer'); + header("Content-type: text/xml"); + echo $disco->getDISCO(); +} + +/************************************* + * * + * Début du traitement de la requête * + * * + *************************************/ +// Si on sert le wsdl +if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) { + makeWSDL(); +} else { + // Si on sert une requete SOAP + if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST') { + makeSOAPServer(); + } else { + //Par défault, on sert un xml Discovery + makeDISCO(); + } +} +?> diff --git a/core/trunk/core/class/web_service/services.php b/core/trunk/core/class/web_service/services.php new file mode 100755 index 00000000000..11d753fa87c --- /dev/null +++ b/core/trunk/core/class/web_service/services.php @@ -0,0 +1,75 @@ +<?php + +if(!isset($SOAP_dispatch_map)) { + $SOAP_dispatch_map = Array(); +} +if (!isset($XMLRPC_dispatch_map)) { + $XMLRPC_dispatch_map = Array(); +} +if (!isset($SOAP_typedef)) { + $SOAP_typedef = Array(); +} + +$SOAP_dispatch_map['echoString'] = Array( + 'in' => Array('in' => 'string'), + 'out' => Array('out' => 'string') + ); +function echoString($in) { + return $in; +} + +/* +$SOAP_dispatch_map['stringToArray'] = Array( + 'in' => Array('in' => 'string'), + 'out' => Array('out' => 'Array') + ); +function stringToArray($in){ + return array($in, 'tableau'); +} + +$SOAP_dispatch_map['intToNumberData'] = Array( + 'in' => Array('in' => 'int'), + 'out' => Array('out' => '{urn:MySoapServer}numberData') + ); +$SOAP_typedef['numberData'] = Array('nombre'=>'int', + 'double'=>'int', + 'carre'=>'int'); +function intToNumberData($in){ + return array('nombre' => $in, + 'double' => $in*2, + 'carre'=> $in*$in); +} + +$SOAP_dispatch_map['wordsToString'] = Array( + 'in' => Array('in' => 'Array'), + 'out' => Array('out' => 'string') + ); +function wordsToString($in){ + return implode(' ', $in); +}*/ + +/* +$SOAP_dispatch_map['twoWordsToString'] = Array( + 'in' => Array('in' => '{urn:MySoapServer}twoWords'), + 'out' => Array('out' => 'string') + ); +$SOAP_typedef['twoWords'] = Array('premier'=>'string', + 'dernier'=>'string'); +function twoWordsToString($in){ + return $in->premier.' + blah + '.$in->dernier; +}*/ + + + + +/*$SOAP_dispatch_map['getImage'] = Array( + 'in' => Array(), + 'out' => Array('out' => 'base64') + ); +function getImage(){ + $content = file_get_contents('logo.gif',FILE_BINARY); + $encodedContent = base64_encode($content); + return $encodedContent; +}*/ + +?> -- GitLab