source: trunk/services/class.ldap.php @ 5130

Revision 5130, 10.8 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus, do modulo services.

  • Property svn:executable set to *
Line 
1<?php
2/**
3*
4* Copyright (C) 2011 Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
5*
6*  This program is free software; you can redistribute it and/or
7*  modify it under the terms of the GNU General Public License
8*  as published by the Free Software Foundation; either version 2
9*  of the License, or (at your option) any later version.
10*
11*  This program is distributed in the hope that it will be useful,
12*  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*  GNU General Public License for more details.
15*
16*  You should have received a copy of the GNU General Public License
17*  along with this program; if not, write to the Free Software
18*  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19*
20* You can contact Prognus Software Livre headquarters at Av. Tancredo Neves,
21* 6731, PTI, Bl. 05, Esp. 02, Sl. 10, Foz do Iguaçu - PR - Brasil or at
22* e-mail address prognus@prognus.com.br.
23*
24*
25* @package    LdapService
26* @license    http://www.gnu.org/copyleft/gpl.html GPL
27* @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
28* @sponsor    Caixa Econômica Federal
29* @version    1.0
30* @since      2.4.0
31*/
32
33class LdapService
34{
35    var $limit = 11;
36
37    var $allTargetTypes = array( 'i', 'g', 'l', 'u', 's' );
38
39    var $connection;
40
41    function LdapService()
42    {
43        if(isset($GLOBALS['phpgw_info']['server']['ldap_context']) )
44                        $this->context = $GLOBALS['phpgw_info']['server']['ldap_context'];
45    }
46
47        public function setContext( $pContext )
48            {
49                $this->context = $pContext;
50            }
51       
52    function connect($host='', $dn='', $passwd='', $ldapreferral=false)
53    {
54        if(!$host || $host == $GLOBALS['phpgw_info']['server']['ldap_host'])
55        {
56            $dn         = $dn ? $dn : $GLOBALS['phpgw_info']['server']['ldap_root_dn'];
57            $passwd = $passwd ? $passwd : $GLOBALS['phpgw_info']['server']['ldap_root_pw'];
58            $host   = $host ? $host : $GLOBALS['phpgw_info']['server']['ldap_host'];
59        }
60
61        $conection = ldap_connect($host);
62
63        if(!ldap_set_option($conection,LDAP_OPT_PROTOCOL_VERSION,3))
64            $GLOBALS['phpgw_info']['server']['ldap_version3'] = False;
65       
66        ldap_set_option($conection, LDAP_OPT_REFERRALS, $ldapreferral);
67
68        if($ldapreferral)
69        {
70            $GLOBALS['phpgw_info']['server']['user_ldap_referral'] = $dn;
71            $GLOBALS['phpgw_info']['server']['password_ldap_referral'] = $passwd;
72            ldap_set_rebind_proc($conection, ldap_rebind);
73        }
74
75        if($dn && $passwd && !@ldap_bind($conection,$dn,$passwd))
76            @ldap_bind($conection,$dn,$passwd);
77
78        $this->connection = $conection;
79
80        return( $connection );
81    }
82
83    function _or( $toWrap )
84    {
85                if( !is_array( $toWrap ) )
86                        return( $toWrap );
87       
88                return $this->wrap( $toWrap, '|' );
89    }
90
91    function _and( $toWrap )
92    {
93                if( !is_array( $toWrap ) )
94                        return( $toWrap );
95       
96                return $this->wrap( $toWrap, '&' );
97    }
98
99    function _not( $toWrap )
100    {
101                return $this->wrap( $toWrap, '!' );
102    }
103
104    function wrap( $toWrap, $conditional = "" )
105    {
106                if( !is_array( $toWrap ) )
107                        $toWrap = array( $toWrap );
108       
109                $toWrap = array_unique( $toWrap );
110
111                return "(".$conditional.implode( "", $toWrap ).")";
112    }
113
114    function getSearchFilter( $search, $targetTypes = false, $customFilter = '', $exact = false )
115    {
116        $search = utf8_encode( $search );
117
118                if( !$targetTypes )
119                                $targetTypes = $this->allTargetTypes;
120       
121                if( !is_array( $targetTypes ) )
122                        $targetTypes = array( $targetTypes );
123       
124                $searchFilter = '';
125       
126                foreach( $targetTypes as $targetType )
127                {
128                        switch( $targetType )
129                        {
130                        case 'g':
131                        {
132                                //no caso de grupos, a busca so precisa ser feita em cima do CN
133                                $searchFilter = $this->stemFilter( $search, 'cn' );
134                        }
135                        break;
136       
137                        default :
138                        {
139                        //parametros que a busca tem que ser sintaticas
140                                $searchFilter = /*array( */$this->stemFilter( $search, array(
141                                                        // UID e employeeNumber podem ser iguais ou muito similares, dependendo da organizacao
142                                                        'uid', /*'employeeNumber', */'cn',
143                                                        // givenName e SN sao complementares (nome e sobrenome)
144                                                'givenName', 'sn', 'displayName', 'mail', 'mailAlternateAddress' ) //),
145                                                        //parametros que a busca pode ser por aproximacao fonetica
146                                                /*$this->approxFilter( $search, array(
147                                                        // O CN e displayName geralmente sao a mesma coisa
148                                                        'cn', 'displayName' ))*/  );
149       
150                                $searchFilter = $this->stemFilter( $search, array( 'cn', 'givenName', 'uid',
151                                                                       'sn', 'displayName', 'mail', 'mailAlternateAddress' ) );
152                        }
153                        break;
154                        }
155                }
156
157                $filter = array();
158       
159                if( $customFilter )
160                        $filter[] = $customFilter;
161                if( $search )
162                        $filter[] = $searchFilter;
163       
164                return $this->_and( array(
165                        // Somente objetos relacionados com o Expresso
166                        $this->accountFilter( $targetTypes ),
167                        // Objetos ocultados e/ou desativados pelo Administrador nao podem ser exibidos nas consultas do Expresso
168                        $this->securityFilter( $targetTypes ),
169                        //foco da busca
170                        ( $exact ? $this->_and( $filter ) : $this->_or( $filter ) )
171                        ));
172       
173        }
174
175        function securityFilter( $targetTypes )
176    {
177                if( !$targetTypes )
178                                $targetTypes = $this->allTargetTypes;
179
180                if( !is_array( $targetTypes ) )
181                        $targetTypes = array( $targetTypes );
182       
183                $typeFilter = array();
184       
185                foreach( $targetTypes as $targetType )
186                {
187                        switch( $targetType )
188                        {
189                        case 'g': $typeFilter[] = "(objectClass=posixGroup)";
190                        break;
191                       
192                default : $typeFilter[] = "(phpgwAccountStatus=A)(accountStatus=active)";
193                        break;
194                        }
195                }
196
197                return $this->_and( array( '(!(phpgwAccountVisible=-1))', $this->_or( $typeFilter ) ) );
198        }
199
200    function accountFilter( $targetTypes )
201    {
202        if( !$targetTypes )
203            $targetTypes = $this->allTargetTypes;
204
205        if( !is_array( $targetTypes ) )
206           $targetTypes = array( $targetTypes );
207
208        $typeFilter = array();
209
210        foreach( $targetTypes as $targetType )
211            $typeFilter[] = '(phpgwAccountType='.$targetType.')';
212
213        return $this->_and( array( '(objectClass=phpgwAccount)', $this->_or( $typeFilter ) ) );
214    }
215
216        function stemFilter( $search, $params )
217    {
218                $search = str_replace( ' ', '*', $search );
219       
220                if( !is_array( $params ) )
221                        $params = array( $params );
222       
223                foreach( $params as $i => $param )
224                        $params[$i] = "($param=*$search*)";
225               
226                return $this->_or( $params );
227    }
228
229        function phoneticFilter( $search, $params )
230    {
231                if( eregi( "\d", $search ) )
232                        return( "" );
233       
234                if( !is_array( $params ) )
235                        $params = array( $params );
236       
237                foreach( $params as $i => $param )
238                        $params[$i] = "($param~=$search)";
239               
240                return $this->_or( $params );
241    }
242
243       
244       
245       
246    function approxFilter( $search, $params )
247    {
248                return $this->_or( array( $this->stemFilter( $search, $params ),
249                                  $this->phoneticFilter( $search, $params ) ) );
250    }
251
252        public function accountSearch($search, $justthese = "*", $context = false , $accountType = false, $sort = false)
253    {
254         if( !$this->connection )
255            $this->connect();
256
257         $filter =  $this->getSearchFilter($search,$accountType);
258
259         if( !$context )
260             $context = $this->context;
261
262         $sr = ldap_search( $this->connection, utf8_encode($context), $filter, $justthese, 0, $this->limit );
263
264                 if(!$sr) return false;
265
266         if($sort)
267             ldap_sort( $this->connection, $sr, $sort );
268
269                         return $this->formatEntries( ldap_get_entries( $this->connection, $sr ) );
270                    }
271                     
272                    private function formatEntries ( $pEntries )
273                    {     
274
275                         if( !$pEntries ) return( false ); 
276
277         $return = array();
278
279         for ($i=0; $i < $pEntries["count"]; $i++)
280         {
281               $entrieTmp = array();
282               foreach ($pEntries[$i] as $index => $value)
283               {
284                   if(!is_numeric($index) && $index != 'count')
285                   {
286                       if(is_array($value))
287                       {
288                           if(count($value) == 2)
289                               $entrieTmp[$index] = utf8_decode($value['0']);
290                           else
291                           {
292                               foreach ($value as $index2 =>$value2)
293                               {
294                                    if($index != 'count')
295                                        $entrieTmp[$index][$index2] = utf8_decode($value2);
296                               }
297                           }
298                       }
299                       else
300                           $entrieTmp[$index] = utf8_decode($value);
301                   }
302               }
303
304               $return[] = $entrieTmp;
305         }
306
307         return( $return );
308    }
309
310                        /**
311                    * Retorna o endereço de e-mail da conta pelo uidNumber
312                    *
313                    * @license    http://www.gnu.org/copyleft/gpl.html GPL
314                    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
315                    * @sponsor    Caixa Econômica Federal
316                    * @author     Cristiano Corrêa Schmidt
317                    * @param      int $pUidNumber uidNumber da conta
318                        * @return     string
319                    * @access     public
320                    */
321                    public function getMailByUidNumber( $pUidNumber )
322                    {
323                        if( !$this->connection ) $this->connect();
324                        $sr =  ldap_search( $this->connection, $this->context, '(uidNumber='.$pUidNumber.')', array('mail') );
325                        if(!$sr) return false;
326                           
327                        $return = ldap_get_entries( $this->connection, $sr );
328                        return   $return[0]['mail'][0];
329                    }
330                     
331                    /**
332                    * Retorna em um array os endereços de e-mails alternativos da conta pelo uidNumber
333                    *
334                    * @license    http://www.gnu.org/copyleft/gpl.html GPL
335                    * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
336                    * @sponsor    Caixa Econômica Federal
337                    * @author     Cristiano Corrêa Schmidt
338                    * @param      int $pUidNumber uidNumber da conta
339                    * @return     Array
340                    * @access     public
341                    */
342                    public function getMailAlternateByUidNumber( $pUidNumber )
343                    {
344                         if( !$this->connection ) $this->connect();
345                         
346                         $sr = ldap_search( $this->connection, $this->context, '(uidNumber='.$pUidNumber.')', array('mailAlternateAddress'));
347                         if(!$sr) return false;
348                         
349                         $returnL = ldap_get_entries( $this->connection,$sr);
350                         $return = array();
351                         foreach ($returnL[0]['mailalternateaddress'] as $i => $v)
352                         {
353                             if($i === 'count') continue;
354                             $return[] = $v;
355                         }
356                         return $return;
357                    }
358
359}
360
361ServiceLocator::register( 'ldap', new LdapService() );
362
Note: See TracBrowser for help on using the repository browser.