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.2.php

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

prise en charge de la dernier version dans le SVN

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