From 9f035d3b9158ea2cef672d6777f984c53d35f881 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Oct 2011 15:55:06 +0200 Subject: [PATCH] New: Add web service to get user Add generator of webservice --- dev/skeletons/.gitignore | 2 + dev/skeletons/build_webservice_from_class.php | 75 +++- dev/skeletons/skeleton_webservice_server.php | 199 +++++++++++ htdocs/webservices/server_thirdparty.php | 4 +- htdocs/webservices/server_user.php | 250 +++++++++++++ test/soapui/Dolibarr-soapui-project.xml | 327 ++++++++++++------ 6 files changed, 740 insertions(+), 117 deletions(-) create mode 100644 dev/skeletons/.gitignore create mode 100644 dev/skeletons/skeleton_webservice_server.php create mode 100644 htdocs/webservices/server_user.php diff --git a/dev/skeletons/.gitignore b/dev/skeletons/.gitignore new file mode 100644 index 00000000000..2dda6229d24 --- /dev/null +++ b/dev/skeletons/.gitignore @@ -0,0 +1,2 @@ +out.* +socpeople* diff --git a/dev/skeletons/build_webservice_from_class.php b/dev/skeletons/build_webservice_from_class.php index 4bc6b60052e..435b068df35 100644 --- a/dev/skeletons/build_webservice_from_class.php +++ b/dev/skeletons/build_webservice_from_class.php @@ -62,16 +62,85 @@ print 'Classname='.$argv[2]."\n"; $classfile=$argv[1]; $classname=$argv[2]; +$classmin=strtolower($classname); $property=array(); -$outfile='webservice_'.dol_sanitizeFileName($classfile).'.php'; $targetcontent=''; -// This script must load the class, found the CRUD function and build a web service to call this functions. -// TODO ... +// Load the class and read properties +require_once($classfile); + +$property=array(); +$class = new $classname($db); +$values=get_class_vars($classname); + +unset($values['db']); +unset($values['error']); +unset($values['errors']); +unset($values['element']); +unset($values['table_element']); +unset($values['table_element_line']); +unset($values['fk_element']); +unset($values['ismultientitymanaged']); + +$properties=array_keys($values); + +// Read skeleton_class.class.php file +$skeletonfile='skeleton_webservice_server.php'; +$sourcecontent=file_get_contents($skeletonfile); +if (! $sourcecontent) +{ + print "\n"; + print "Error: Failed to read skeleton sample '".$skeletonfile."'\n"; + print "Try to run script from skeletons directory.\n"; + exit; +} + +// Define output variables +$outfile='out.server_'.$classmin.'.php'; +$targetcontent=$sourcecontent; +// Substitute class name +$targetcontent=preg_replace('/Skeleton/', $classname, $targetcontent); +$targetcontent=preg_replace('/skeleton/', $classmin, $targetcontent); +// Substitute declaration parameters +$varprop="\n"; +$cleanparam=''; +$i=0; + +while($i array('name'=>'".$properties[$i]."','type'=>'xsd:string')"; + $i++; + + if ($i == count($properties)) + $varprop.="\n"; + else + $varprop.=",\n"; +} + +$targetcontent=preg_replace('/\'prop1\'=>\'xxx\',/', $varprop, $targetcontent); +$targetcontent=preg_replace('/\'prop2\'=>\'xxx\',/', '', $targetcontent); +// Substitute get method parameters +$varprop="\n"; +$cleanparam=''; +$i=0; + +while($i $".$classmin."->".$properties[$i]; + + $i++; + if ($i == count($properties)) + $varprop.="\n"; + else + $varprop.=",\n"; +} + +$targetcontent=preg_replace('/\'prop1\'=>\$'.$classmin.'->prop1,/', $varprop, $targetcontent); +$targetcontent=preg_replace('/\'prop2\'=>\$'.$classmin.'->prop2,/', '', $targetcontent); // Build file $fp=fopen($outfile,"w"); diff --git a/dev/skeletons/skeleton_webservice_server.php b/dev/skeletons/skeleton_webservice_server.php new file mode 100644 index 00000000000..6980c1322ec --- /dev/null +++ b/dev/skeletons/skeleton_webservice_server.php @@ -0,0 +1,199 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/webservices/server_skeleton.php + * \brief File that is entry point to call Dolibarr WebServices + * \version $Id: server_skeleton.php,v 1.7 2010/12/19 11:49:37 eldy Exp $ + */ + +// This is to make Dolibarr working with Plesk +set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs'); + +require_once("../master.inc.php"); +require_once(NUSOAP_PATH.'/nusoap.php'); // Include SOAP +require_once(DOL_DOCUMENT_ROOT."/lib/ws.lib.php"); +require_once(DOL_DOCUMENT_ROOT."/skeleton/class/skeleton.class.php"); + + +dol_syslog("Call Skeleton webservices interfaces"); + +// Enable and test if module web services is enabled +if (empty($conf->global->MAIN_MODULE_WEBSERVICES)) +{ + $langs->load("admin"); + dol_syslog("Call Dolibarr webservices interfaces with module webservices disabled"); + print $langs->trans("WarningModuleNotActive",'WebServices').'.

'; + print $langs->trans("ToActivateModule"); + exit; +} + +// Create the soap Object +$server = new nusoap_server(); +$server->soap_defencoding='UTF-8'; +$server->decode_utf8=false; +$ns='http://www.dolibarr.org/ns/'; +$server->configureWSDL('WebServicesDolibarrSkeleton',$ns); +$server->wsdl->schemaTargetNamespace=$ns; + + +// Define WSDL Authentication object +$server->wsdl->addComplexType( + 'authentication', + 'complexType', + 'struct', + 'all', + '', + array( + 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'), + 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'), + 'login' => array('name'=>'login','type'=>'xsd:string'), + 'password' => array('name'=>'password','type'=>'xsd:string'), + 'entity' => array('name'=>'entity','type'=>'xsd:string'), + ) +); + +// Define WSDL Return object +$server->wsdl->addComplexType( + 'result', + 'complexType', + 'struct', + 'all', + '', + array( + 'result_code' => array('name'=>'result_code','type'=>'xsd:string'), + 'result_label' => array('name'=>'result_label','type'=>'xsd:string'), + ) +); + +// Define other specific objects +$server->wsdl->addComplexType( + 'skeleton', + 'complexType', + 'struct', + 'all', + '', + array( + 'prop1'=>'xxx', + 'prop2'=>'xxx', + //... + ) +); + + + +// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped +// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model. +// http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/ +$styledoc='rpc'; // rpc/document (document is an extend into SOAP 1.0 to support unstructured messages) +$styleuse='encoded'; // encoded/literal/literal wrapped +// Better choice is document/literal wrapped but literal wrapped not supported by nusoap. + + +// Register WSDL +$server->register( + 'getSkeleton', + // Entry values + array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'), + // Exit values + array('result'=>'tns:result','skeleton'=>'tns:skeleton'), + $ns, + $ns.'#getSkeleton', + $styledoc, + $styleuse, + 'WS to get skeleton' +); + + + + +/** + * Get produt or service + * + * @param array $authentication Array of authentication information + * @param int $id Id of object + * @param string $ref Ref of object + * @param ref_ext $ref_ext Ref external of object + * @return mixed + */ +function getSkeleton($authentication,$id,$ref='',$ref_ext='') +{ + global $db,$conf,$langs; + + dol_syslog("Function: getSkeleton login=".$authentication['login']." id=".$id." ref=".$ref." ref_ext=".$ref_ext); + + if ($authentication['entity']) $conf->entity=$authentication['entity']; + + // Init and check authentication + $objectresp=array(); + $errorcode='';$errorlabel=''; + $error=0; + $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel); + // Check parameters + if (! $error && (($id && $ref) || ($id && $ref_ext) || ($ref && $ref_ext))) + { + $error++; + $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id, ref and ref_ext can't be both provided. You must choose one or other but not both."; + } + + if (! $error) + { + $fuser->getrights(); + + if ($fuser->rights->skeleton->read) + { + $skeleton=new Skeleton($db); + $result=$skeleton->fetch($id,$ref,$ref_ext); + if ($result > 0) + { + // Create + $objectresp = array( + 'result'=>array('result_code'=>'OK', 'result_label'=>''), + 'skeleton'=>array( + 'prop1'=>$skeleton->prop1, + 'prop2'=>$skeleton->prop2, + //... + ) + ); + } + else + { + $error++; + $errorcode='NOT_FOUND'; $errorlabel='Object not found for id='.$id.' nor ref='.$ref.' nor ref_ext='.$ref_ext; + } + } + else + { + $error++; + $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request'; + } + } + + if ($error) + { + $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel)); + } + + return $objectresp; +} + + + +// Return the results. +$server->service($HTTP_RAW_POST_DATA); + +?> diff --git a/htdocs/webservices/server_thirdparty.php b/htdocs/webservices/server_thirdparty.php index 2187f345b5e..e4b19ad66dd 100755 --- a/htdocs/webservices/server_thirdparty.php +++ b/htdocs/webservices/server_thirdparty.php @@ -180,8 +180,8 @@ function getThirdParty($authentication,$id='',$ref='',$ref_ext='') 'ref' => $thirdparty->name, 'ref_ext' => $thirdparty->ref_ext, 'fk_user_author' => $thirdparty->fk_user_author, -// 'date_creation' => $thirdparty-> -// 'date_modification' => $thirdparty-> + 'date_creation' => dol_print_date($thirdparty->datec,'dayhourrfc'), + 'date_modification' => dol_print_date($thirdparty->date_update,'dayhourrfc'), 'address' => $thirdparty->address, 'zip' => $thirdparty->zip, 'town' => $thirdparty->town, diff --git a/htdocs/webservices/server_user.php b/htdocs/webservices/server_user.php new file mode 100644 index 00000000000..189840058b1 --- /dev/null +++ b/htdocs/webservices/server_user.php @@ -0,0 +1,250 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/webservices/server_user.php + * \brief File that is entry point to call Dolibarr WebServices + * \version $Id: server_user.php,v 1.7 2010/12/19 11:49:37 eldy Exp $ + */ + +// This is to make Dolibarr working with Plesk +set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs'); + +require_once("../master.inc.php"); +require_once(NUSOAP_PATH.'/nusoap.php'); // Include SOAP +require_once(DOL_DOCUMENT_ROOT."/lib/ws.lib.php"); +require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); + + +dol_syslog("Call User webservices interfaces"); + +// Enable and test if module web services is enabled +if (empty($conf->global->MAIN_MODULE_WEBSERVICES)) +{ + $langs->load("admin"); + dol_syslog("Call Dolibarr webservices interfaces with module webservices disabled"); + print $langs->trans("WarningModuleNotActive",'WebServices').'.

'; + print $langs->trans("ToActivateModule"); + exit; +} + +// Create the soap Object +$server = new nusoap_server(); +$server->soap_defencoding='UTF-8'; +$server->decode_utf8=false; +$ns='http://www.dolibarr.org/ns/'; +$server->configureWSDL('WebServicesDolibarrUser',$ns); +$server->wsdl->schemaTargetNamespace=$ns; + + +// Define WSDL Authentication object +$server->wsdl->addComplexType( + 'authentication', + 'complexType', + 'struct', + 'all', + '', + array( + 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'), + 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'), + 'login' => array('name'=>'login','type'=>'xsd:string'), + 'password' => array('name'=>'password','type'=>'xsd:string'), + 'entity' => array('name'=>'entity','type'=>'xsd:string'), + ) +); + +// Define WSDL Return object +$server->wsdl->addComplexType( + 'result', + 'complexType', + 'struct', + 'all', + '', + array( + 'result_code' => array('name'=>'result_code','type'=>'xsd:string'), + 'result_label' => array('name'=>'result_label','type'=>'xsd:string'), + ) +); + +// Define other specific objects +$server->wsdl->addComplexType( + 'user', + 'complexType', + 'struct', + 'all', + '', + array( +'element' => array('name'=>'element','type'=>'xsd:string'), +'id' => array('name'=>'id','type'=>'xsd:string'), +'lastname' => array('name'=>'lastname','type'=>'xsd:string'), +'firstname' => array('name'=>'firstname','type'=>'xsd:string'), +'note' => array('name'=>'note','type'=>'xsd:string'), +'email' => array('name'=>'email','type'=>'xsd:string'), +'signature' => array('name'=>'signature','type'=>'xsd:string'), +'office_phone' => array('name'=>'office_phone','type'=>'xsd:string'), +'office_fax' => array('name'=>'office_fax','type'=>'xsd:string'), +'user_mobile' => array('name'=>'user_mobile','type'=>'xsd:string'), +'admin' => array('name'=>'admin','type'=>'xsd:string'), +'login' => array('name'=>'login','type'=>'xsd:string'), +'entity' => array('name'=>'entity','type'=>'xsd:string'), +'pass_indatabase' => array('name'=>'pass_indatabase','type'=>'xsd:string'), +'pass_indatabase_crypted' => array('name'=>'pass_indatabase_crypted','type'=>'xsd:string'), +'datec' => array('name'=>'datec','type'=>'xsd:dateTime'), +'datem' => array('name'=>'datem','type'=>'xsd:dateTime'), +'societe_id' => array('name'=>'societe_id','type'=>'xsd:string'), +'fk_member' => array('name'=>'fk_member','type'=>'xsd:string'), +'datelastlogin' => array('name'=>'datelastlogin','type'=>'xsd:dateTime'), +'datepreviouslogin' => array('name'=>'datepreviouslogin','type'=>'xsd:dateTime'), +'statut' => array('name'=>'statut','type'=>'xsd:string'), +'photo' => array('name'=>'photo','type'=>'xsd:string'), +'lang' => array('name'=>'lang','type'=>'xsd:string'), +'entrepots' => array('name'=>'entrepots','type'=>'xsd:string'), +//'rights' => array('name'=>'rights','type'=>'xsd:string'), +'canvas' => array('name'=>'canvas','type'=>'xsd:string') + ) +); + + + +// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped +// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model. +// http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/ +$styledoc='rpc'; // rpc/document (document is an extend into SOAP 1.0 to support unstructured messages) +$styleuse='encoded'; // encoded/literal/literal wrapped +// Better choice is document/literal wrapped but literal wrapped not supported by nusoap. + + +// Register WSDL +$server->register( + 'getUser', + // Entry values + array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'), + // Exit values + array('result'=>'tns:result','user'=>'tns:user'), + $ns, + $ns.'#getUser', + $styledoc, + $styleuse, + 'WS to get user' +); + + + + +/** + * Get produt or service + * + * @param array $authentication Array of authentication information + * @param int $id Id of object + * @param string $ref Ref of object + * @param ref_ext $ref_ext Ref external of object + * @return mixed + */ +function getUser($authentication,$id,$ref='',$ref_ext='') +{ + global $db,$conf,$langs; + + dol_syslog("Function: getUser login=".$authentication['login']." id=".$id." ref=".$ref." ref_ext=".$ref_ext); + + if ($authentication['entity']) $conf->entity=$authentication['entity']; + + // Init and check authentication + $objectresp=array(); + $errorcode='';$errorlabel=''; + $error=0; + $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel); + // Check parameters + if (! $error && (($id && $ref) || ($id && $ref_ext) || ($ref && $ref_ext))) + { + $error++; + $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id, ref and ref_ext can't be both provided. You must choose one or other but not both."; + } + + if (! $error) + { + $fuser->getrights(); + + if ($fuser->rights->user->user->lire) + { + $user=new User($db); + $result=$user->fetch($id,$ref,$ref_ext); + if ($result > 0) + { + // Create + $objectresp = array( + 'result'=>array('result_code'=>'OK', 'result_label'=>''), + 'user'=>array( +'id' => $user->id, +'lastname' => $user->lastname, +'firstname' => $user->firstname, +'note' => $user->note, +'email' => $user->email, +'signature' => $user->signature, +'office_phone' => $user->office_phone, +'office_fax' => $user->office_fax, +'user_mobile' => $user->user_mobile, +'admin' => $user->admin, +'login' => $user->login, +'entity' => $user->entity, +'pass_indatabase' => $user->pass_indatabase, +'pass_indatabase_crypted' => $user->pass_indatabase_crypted, +'datec' => dol_print_date($user->datec,'dayhourrfc'), +'datem' => dol_print_date($user->datem,'dayhourrfc'), +'societe_id' => $user->societe_id, +'fk_member' => $user->fk_member, +'webcal_login' => $user->webcal_login, +'phenix_login' => $user->phenix_login, +'phenix_pass' => $user->phenix_pass, +'phenix_pass_crypted' => $user->phenix_pass_crypted, +'datelastlogin' => dol_print_date($user->datelastlogin,'dayhourrfc'), +'datepreviouslogin' => dol_print_date($user->datepreviouslogin,'dayhourrfc'), +'statut' => $user->statut, +'photo' => $user->photo, +'lang' => $user->lang, +'entrepots' => $user->entrepots, +//'rights' => $user->rights, +'canvas' => $user->canvas + ) + ); + } + else + { + $error++; + $errorcode='NOT_FOUND'; $errorlabel='Object not found for id='.$id.' nor ref='.$ref.' nor ref_ext='.$ref_ext; + } + } + else + { + $error++; + $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request'; + } + } + + if ($error) + { + $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel)); + } + + return $objectresp; +} + + + +// Return the results. +$server->service($HTTP_RAW_POST_DATA); + +?> diff --git a/test/soapui/Dolibarr-soapui-project.xml b/test/soapui/Dolibarr-soapui-project.xml index 71f1e13f5bd..b8cff16c05a 100755 --- a/test/soapui/Dolibarr-soapui-project.xml +++ b/test/soapui/Dolibarr-soapui-project.xml @@ -1,5 +1,5 @@ -http://localhost/dolibarrnew/webservices/server_other.php?wsdl +http://localhost/dolibarrnew/webservices/server_other.php?wsdl @@ -69,109 +69,6 @@ -]]>http://localhost/dolibarrnew/webservices/server_thirdparty.php?wsdl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WS to get Versions - - - - - - - - - - - - - - - - - - - - - -]]>http://schemas.xmlsoap.org/wsdl/http://localhost/dolibarrnew/webservices/server_thirdparty.php<xml-fragment/>UTF-8http://localhost/dolibarrnew/webservices/server_thirdparty.php - - - - - - ? - ? - ? - ? - ? - - ? - ? - ? - - ]]>http://localhost/dolibarrnew/webservices/server_invoice.php?wsdl @@ -633,8 +530,8 @@ - ? - ? + dolibarrkey + aaa admin admin @@ -772,11 +669,11 @@ - ? - ? - ? - ? - ? + dolibarrkey + aaa + admin + admin + @@ -811,4 +708,210 @@ -]]> \ No newline at end of file +]]>http://localhostdolibarr/webservices/server_user.php?wsdl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WS to get user + + + + + + + + + + + + + + + + + + + + + +]]>http://schemas.xmlsoap.org/wsdl/http://localhostdolibarr/webservices/server_user.php<xml-fragment/>UTF-8http://localhostdolibarr/webservices/server_user.php + + + + + + dolibarrkey + aaa + admin + admin + + + 1 + + + + +]]>http://localhostdolibarr/webservices/server_thirdparty.php?wsdl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WS to get Versions + + + + + + + + + + + + + + + + + + + + + +]]>http://schemas.xmlsoap.org/wsdl/http://localhostdolibarr/webservices/server_thirdparty.php<xml-fragment/>UTF-8http://localhostdolibarr/webservices/server_thirdparty.php + + + + + + dolibarrkey + aaa + admin + admin + + + 1 + + + + +]]> \ No newline at end of file