developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #38: jAuthDriverLDS.class.php

File jAuthDriverLDS.class.php, 6.6 KB (added by njeudy, 14 years ago)

Ajout des exception et des log dans la connexion XMLRPC

Line 
1<?php
2/**
3* @package    jelix
4* @subpackage auth
5* @version    $Id:$
6* @author     Nicolas JEUDY
7* @contributor
8* @copyright  2006 Nicolas JEUDY
9* @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
10*/
11
12
13/**
14* driver base de donnée pour l'authentification
15*/
16class jAuthDriverLDS implements jIAuthDriver {
17
18    protected $_params;
19
20    function __construct($params){
21        $this->_params = $params;
22    }
23
24    /**
25 * function wich decode UTF-8 Entity with ref
26 * &#03; for example
27 * need because XMLRPC server doest not like this sort
28 * of encoding
29 */
30
31public function decode_entities($text) {
32        $text = html_entity_decode($text,ENT_QUOTES,"ISO-8859-1"); /* NOTE: UTF-8 does not work! */
33        $text= preg_replace('/&#(\d+);/me',"chr(\\1)",$text); /* decimal notation */
34        $text= preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)",$text);  /* hex notation */
35        return $text;
36}
37/**
38 * call an xmlrpc call for a method
39 * via the xmlrpc server in python (lmc-agent)
40 * @param $method name of the method
41 * @param $params array with param
42 */
43public function xmlCall($method,$params) {
44
45        $output_options = array( "output_type" => "xml", "verbosity" => "pretty", "escaping" => array("markup", "non-ascii", "non-print"), "version" => "xmlrpc", "encoding" => "UTF-8" );
46
47#$output_options = array( "output_type" => "xml", "verbosity" => "pretty", "escaping" => array("markup", "non-ascii", "non-print"), "version" => "xmlrpc", "encoding" => "iso-8859-1" );
48
49        if ($params==null) {
50                $request = xmlrpc_encode_request($method,null,$output_options);
51        }
52        else {
53                $request = xmlrpc_encode_request($method,$params,$output_options);
54                $request = $this->decode_entities($request,ENT_QUOTES,"UTF-8");
55        }
56
57
58        $host= $this->_params['host'].":".$this->_params['port'];
59        $url = "/";
60
61        $httpQuery = "POST ". $url ." HTTP/1.0\r\n";
62        $httpQuery .= "User-Agent: xmlrpc\r\n";
63        $httpQuery .= "Host: ". $host ."\r\n";
64        $httpQuery .= "Content-Type: text/xml\r\n";
65        $httpQuery .= "Content-Length: ". strlen($request) ."\r\n";
66        $httpQuery .= "Authorization: Basic ".base64_encode($this->_params['login']).":".base64_encode($this->_params['password'])."\r\n\r\n";
67        $httpQuery .= $request;
68        $sock=null;
69
70        // if crypted connexion
71        if ($this->_params['scheme']=="https") { $prot="ssl://"; }
72        $sock = fsockopen($prot.$this->_params['host'],$this->_params['port'], $errNo, $errString);
73
74        if ( !$sock ) {
75        jLog::log('Can not Connect XMLRPC server');
76        jLog::dump($prot.$this->_params['host']);
77        jLog::dump($this->_params['port']);
78        jLOG::dump($httpQuery);
79        jLOG::dump(strlen($httpQuery));
80        jLOG::dump($errNo);
81        jLOG::dump($errString);
82        throw new Exception('Can not connect XMLRPC server: jAuthDriverLDS');
83        }
84
85        if ( !fwrite($sock, $httpQuery, strlen($httpQuery)) ) {
86                jLog::log('Can not connect XMLRPC server: jAuthDriverLDS-> Error while trying to send request');
87                throw new Exception('Can not connect XMLRPC server: jAuthDriverLDS-> Error while trying to send request');
88                return FALSE;
89        }
90
91        fflush($sock);
92        // We get the response from the server
93        while ( !feof($sock) ) {
94                $xmlResponse .= fgets($sock);
95        }
96        // Closing the connection
97        fclose($sock);
98        $xmlResponse = substr($xmlResponse, strpos($xmlResponse, "\r\n\r\n") +4);
99        /*****
100         * To decode the XML into PHP, we use the (finaly a short function)
101         * xmlrpc_decode function. And that should've done the trick.
102         * We now have what ever the server function made in our $xmlResponse
103         * variable.
104         *****/
105
106        /* Test if the XMLRPC result is a boolean value set to False.
107           If it is the case, xmlrpc_decode will return an empty string.
108           So we need to test this special case. */
109
110        $booleanFalse = "<?xml version='1.0'?>\n<methodResponse>\n<params>\n<param>\n<value><boolean>0</boolean></value>\n</param>\n</params>\n</methodResponse>\n";
111        if ($xmlResponse == $booleanFalse) $xmlResponse = "0";
112        else {
113                $xmlResponseTmp = xmlrpc_decode($xmlResponse,"UTF-8");
114
115                //if we cannot decode in UTF-8
116                if (!$xmlResponseTmp) {
117                        //conversion in UTF-8
118                        $xmlResponse = iconv("ISO-8859-1","UTF-8",$xmlResponse);
119                        $xmlResponse = xmlrpc_decode($xmlResponse,"UTF-8");
120                } else {
121                        $xmlResponse=$xmlResponseTmp;
122                }
123        }
124
125        return $xmlResponse;
126
127}
128
129    public function saveNewUser($user){
130        $login = $user->login;
131        $pass = $user->password;
132        $firstname = "Jelix User";
133        $name = "Jelix User";
134        // NULL homedir = /tmp ...
135        $homedir = "/tmp";
136        $param = array($login, $pass, $firstname, $name, $homedir);
137        $ret = $this->xmlCall("base.createUser",$param);
138        return true;
139    }
140
141    public function removeUser($login){
142        //fichier=1 -> remove user files (homeDirectory etc)
143        $fichier=0;
144        $param=array ($login,$fichier);
145        //ldap account can be modified from an other apps, so group can be use in an other app
146        $this->xmlCall("base.delUserFromAllGroups", $login);
147        $this->xmlCall("base.delUser",$param);
148        return true;
149    }
150
151    public function updateUser($user){
152        return true;
153    }
154
155    public function getUser($login){
156        $login = '*'.$login.'*';
157        $paramsArr = $this->xmlCall('base.getUsersLdap',$login);
158        $user = new jAuthUser();
159        $user->login = $paramsArr['uid'][0];
160        $user->password = $paramsArr['userPassword'][0];
161        return $user;
162    }
163
164    public function createUser($login,$password){
165        $user = new jAuthUser();
166        $user->login = $login;
167        $user->password = $password;
168        return $user;
169    }
170
171    public function getUserList($pattern){
172        $filter = $pattern . '*';
173        $users = $this->xmlCall('base.getUsersLdap',$filter);
174        $userslist = array();
175        $i = 0;
176        foreach ($users as $userldap) {
177        $user = new jAuthUser();
178        $user->login = $userldap['uid'];
179        $userslist[$i] = $user;
180        $i++;
181        }
182        return $userslist;
183    }
184
185    public function changePassword($login, $newpassword){
186        $param[]=$login;
187        $param[]=$newpassword;
188        return $this->xmlCall("base.changeUserPasswd",$param);
189    }
190
191    public function verifyPassword($login, $password){
192        $param[]=$login;
193        $param[]=$password;
194        $ret= $this->xmlCall("base.ldapAuth",$param);
195        if ( $ret == '1') {
196        $user = new jAuthUser();
197        $user->login = $login;
198        $user->password = $password;
199        }
200        return ($user?$user:false);
201    }
202
203}
204?>