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