source: trunk/reports/inc/class.ldap_functions.inc.php @ 7673

Revision 7673, 18.8 KB checked in by douglasz, 11 years ago (diff)

Ticket #3236 - Correcoes para Performance: Function Within Loop Declaration.

Line 
1<?php
2define('PHPGW_INCLUDE_ROOT','../');
3define('PHPGW_API_INC','../phpgwapi/inc');     
4include_once(PHPGW_API_INC.'/class.common.inc.php');
5include_once('class.functions.inc.php');
6
7function ldapRebind($ldap_connection, $ldap_url)
8{
9        // Enquanto estivermos utilizando referral na arvore ldap, teremos que continuar a utilizar o usuário sistemas:expresso.
10        // Depois, quando não existir mais referral, não existirá a necessidade de ldapRebind.
11        //ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']);
12        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
13        {
14                @ldap_bind($ldap_connection, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
15        }
16}
17
18class ldap_functions
19{
20        var $ldap;
21        var $current_config;
22        var $functions;
23        var $manager_contexts;
24       
25        function ldap_functions(){             
26                $GLOBALS['phpgw_info']['server'] = $_SESSION['phpgw_info']['expresso']['server'];
27                $this->current_config = $_SESSION['phpgw_info']['expresso']['expressoAdmin'];
28                $common = new common();
29               
30                if ( (!empty($GLOBALS['phpgw_info']['server']['ldap_master_host'])) &&
31                         (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_dn'])) &&
32                         (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_pw'])) )
33                {
34                        $this->ldap = $common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_master_host'],
35                                                                                           $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'],
36                                                                                           $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']);
37                }
38                else
39                {
40                        $this->ldap = $common->ldapConnect();
41                }
42               
43                $this->functions = new functions;
44                $manager_acl = $this->functions->read_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid']);
45                $this->manager_contexts = $manager_acl['contexts'];
46        }
47
48        //Busca usuários de um contexto e já retorna as options do select;
49        function get_available_users($params)
50        {
51                $context = $params['context'];
52                $recursive = $params['recursive'];
53                $justthese = array("cn", "uidNumber");
54                $filter="(phpgwAccountType=u)";
55               
56                if ($recursive == 'true')
57                        $groups_list=ldap_search($this->ldap, $context, $filter, $justthese);
58                else
59                $groups_list=ldap_list($this->ldap, $context, $filter, $justthese);
60       
61        $entries = ldap_get_entries($this->ldap, $groups_list);
62       
63                for ($i=0; $i<$entries["count"]; ++$i){
64                        $u_tmp[$entries[$i]["uidnumber"][0]] = $entries[$i]["cn"][0];
65                }
66                       
67                if (count($u_tmp))
68                        natcasesort($u_tmp);
69
70                $i = 0;
71                $users = array();
72                       
73                if (count($u_tmp))
74                {
75                        foreach ($u_tmp as $uidnumber => $cn)
76                        {
77                                $options .= "<option value=$uidnumber>$cn</option>";
78                        }
79                        unset($u_tmp);
80                }
81
82        return $options;
83        }
84
85        function get_available_groups($params)
86        {
87                $context = $params['context'];
88                $justthese = array("cn", "gidNumber");
89        $groups_list=ldap_list($this->ldap, $context, ("(phpgwAccountType=g)"), $justthese);
90        ldap_sort($this->ldap, $groups_list, "cn");
91       
92        $entries = ldap_get_entries($this->ldap, $groups_list);
93               
94                $options = '';
95                for ($i=0; $i<$entries['count']; ++$i)
96                {
97                        $options .= "<option value=" . $entries[$i]['gidnumber'][0] . ">" . $entries[$i]['cn'][0] . "</option>";
98                }
99       
100        return $options;               
101        }
102       
103        function get_available_maillists($params)
104        {
105                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
106                        return false;
107               
108                $context = $params['context'];
109                $justthese = array("uid","mail","uidNumber");
110        $maillists=ldap_list($ldapMasterConnect, $context, ("(phpgwAccountType=l)"), $justthese);
111        ldap_sort($ldapMasterConnect, $maillists, "uid");
112       
113        $entries = ldap_get_entries($ldapMasterConnect, $maillists);
114       
115                $options = '';                 
116                for ($i=0; $i<$entries['count']; ++$i)
117                {
118                        $options .= "<option value=" . $entries[$i]['uid'][0] . ">" . $entries[$i]['uid'][0] . " (" . $entries[$i]['mail'][0] . ")" . "</option>";
119                }
120       
121        ldap_close($ldapMasterConnect);
122        return $options;
123        }
124       
125        function get_user_info($uidnumber)
126        {
127                foreach ($this->manager_contexts as $index=>$context)
128                {
129                        $filter="(&(phpgwAccountType=u)(uidNumber=".$uidnumber."))";
130                        $search = ldap_search($this->ldap, $context, $filter);
131                        $entry = ldap_get_entries($this->ldap, $search);
132                       
133                        if ($entry['count'])
134                        {
135                                //Pega o dn do setor do usuario.
136                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
137                                $sector_dn_array = explode(",", $entry[0]['dn']);
138                $sector_dn_array_count = count($sector_dn_array);
139                                for($i=1; $i<$sector_dn_array_count; ++$i)
140                                        $sector_dn .= $sector_dn_array[$i] . ',';
141                                //Retira ultimo pipe.
142                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
143               
144                                $result['context']                              = $sector_dn;
145                                $result['uid']                                  = $entry[0]['uid'][0];
146                                $result['uidnumber']                    = $entry[0]['uidnumber'][0];
147                                $result['gidnumber']                    = $entry[0]['gidnumber'][0];
148                                $result['departmentnumber']             = $entry[0]['departmentnumber'][0];
149                                $result['givenname']                    = $entry[0]['givenname'][0];
150                                $result['sn']                                   = $entry[0]['sn'][0];
151                                $result['telephonenumber']              = $entry[0]['telephonenumber'][0];
152                                $result['passwd_expired']               = $entry[0]['phpgwlastpasswdchange'][0];
153                                $result['phpgwaccountstatus']   = $entry[0]['phpgwaccountstatus'][0];
154                                $result['phpgwaccountvisible']  = $entry[0]['phpgwaccountvisible'][0];
155                                $result['accountstatus']                = $entry[0]['accountstatus'][0];
156                                $result['mail']                                 = $entry[0]['mail'][0];
157                                $result['mailalternateaddress'] = $entry[0]['mailalternateaddress'];
158                                $result['mailforwardingaddress']= $entry[0]['mailforwardingaddress'];
159                                $result['deliverymode']                 = $entry[0]['deliverymode'][0];
160                                $result['userPasswordRFC2617']  = $entry[0]['userpasswordrfc2617'][0];
161
162                                //Photo
163                                if ($entry[0]['jpegphoto']['count'] == 1)
164                                        $result['photo_exist'] = 'true';
165               
166                                // Samba
167                                for ($i=0; $i<$entry[0]['objectclass']['count']; ++$i)
168                                {
169                                        if ($entry[0]['objectclass'][$i] == 'sambaSamAccount')
170                                                $result['sambaUser'] = true;
171                                }
172                                if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($result['sambaUser']))
173                                {
174                                        $result['sambaaccflags'] = $entry[0]['sambaacctflags'][0];
175                                        $result['sambalogonscript'] = $entry[0]['sambalogonscript'][0];
176                                        $result['homedirectory'] = $entry[0]['homedirectory'][0];
177                                        $a_tmp = explode("-", $entry[0]['sambasid'][0]);
178                                        array_pop($a_tmp);
179                                        $result['sambasid'] = implode("-", $a_tmp);
180                                }
181
182                                // Verifica o acesso do gerente aos atributos corporativos
183                                if ($this->functions->check_acl($_SESSION['phpgw_session']['session_lid'], 'manipulate_corporative_information'))
184                                {
185                                        $result['corporative_information_employeenumber']= $entry[0]['employeenumber'][0];
186                                        $result['corporative_information_cpf']                  = $entry[0]['cpf'][0];
187                                        $result['corporative_information_rg']                   = $entry[0]['rg'][0];
188                                        $result['corporative_information_rguf']                 = $entry[0]['rguf'][0];
189                                        $result['corporative_information_description']  = utf8_decode($entry[0]['description'][0]);
190                                }
191                               
192                                // MailLists
193                                $result['maillists_info'] = $this->get_user_maillists($result['mail']);
194                                if($result['maillists_info'])
195                                {
196                                        foreach ($result['maillists_info'] as $maillist)
197                                        {
198                                                $result['maillists'][] = $maillist['uid'];
199                                        }
200                                }
201                               
202                                // Groups
203                                $justthese = array("gidnumber","cn");
204                                $filter="(&(phpgwAccountType=g)(memberuid=".$result['uid']."))";
205                                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
206                        ldap_sort($this->ldap, $search, "cn");
207                        $entries = ldap_get_entries($this->ldap, $search);
208                        for ($i=0; $i<$entries['count']; ++$i)
209                        {
210                                $result['groups_ldap'][ $entries[$i]['gidnumber'][0] ] = $entries[$i]['cn'][0];
211                        }
212                        }
213                }
214                if (is_array($result))
215                        return $result;
216                else
217                        return false;
218        }
219               
220        function get_user_maillists($mail)
221        {
222                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
223                        return false;
224               
225                $result = array();
226               
227                //Mostra somente os mailists dos contextos do gerente
228                $justthese = array("uid","mail","uidnumber");
229                $filter="(&(phpgwAccountType=l)(mailforwardingaddress=$mail))";
230               
231                foreach ($this->manager_contexts as $index=>$context)
232                {
233                        $search = ldap_search($ldapMasterConnect, $context, $filter, $justthese);
234                $entries = ldap_get_entries($ldapMasterConnect, $search);
235               
236                for ($i=0; $i<$entries['count']; ++$i)
237                {
238                                $result[ $entries[$i]['uid'][0] ]['uid']                = $entries[$i]['uid'][0];
239                                $result[ $entries[$i]['uid'][0] ]['mail']               = $entries[$i]['mail'][0];
240                               
241                                $a_tmp[] = $entries[$i]['uid'][0];
242                }
243                }
244       
245        if($a_tmp) {
246                natcasesort($a_tmp);
247       
248                foreach ($a_tmp as $uid)
249                {
250                                $return[$uid]['uid']            = $result[$uid]['uid'];
251                                $return[$uid]['mail']           = $result[$uid]['mail'];
252                }
253        }
254        ldap_close($ldapMasterConnect);
255                return $return;
256        }
257       
258        function get_group_info($gidnumber)
259        {
260                foreach ($this->manager_contexts as $index=>$context)
261                {
262                        $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
263                        $search = ldap_search($this->ldap, $context, $filter);
264                        $entry = ldap_get_entries($this->ldap, $search);
265                       
266                        if ($entry['count'])
267                        {
268                                //Pega o dn do setor do grupo.
269                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
270                                $sector_dn_array = explode(",", $entry[0]['dn']);
271                $sector_dn_array_count = count($sector_dn_array);
272                                for($i=1; $i<$sector_dn_array_count; ++$i)
273                                        $sector_dn .= $sector_dn_array[$i] . ',';
274                                //Retira ultimo pipe.
275                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
276               
277                                $result['context']                              = $sector_dn;
278                                $result['cn']                                   = $entry[0]['cn'][0];
279                                $result['description']                  = $entry[0]['description'][0];
280                                $result['gidnumber']                    = $entry[0]['gidnumber'][0];
281                                $result['phpgwaccountvisible']  = $entry[0]['phpgwaccountvisible'][0];
282                                $result['email']                                = $entry[0]['mail'][0];
283               
284                                //MemberUid
285                                for ($i=0; $i<$entry[0]['memberuid']['count']; ++$i)
286                                {
287                                        $justthese = array("cn","uid","uidnumber");
288                       
289                                        // Montagem dinamica do filtro
290                                        $filter="(&(phpgwAccountType=u)(|";
291                                        for ($k=0; (($k<10) && ($i<$entry[0]['memberuid']['count'])); ++$k)
292                                        {
293                                                $filter .= "(uid=".$entry[0]['memberuid'][$i].")";
294                                                ++$i;
295                                        }
296                                        $i--;
297                                        $filter .= "))";
298                       
299                                        $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
300                                        $user_entry = ldap_get_entries($this->ldap, $search);
301
302                                        for ($j=0; $j<$user_entry['count']; ++$j)
303                                        {
304                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['cn'] = $user_entry[$j]['cn'][0];
305                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['uidnumber'] = $user_entry[$j]['uidnumber'][0];
306                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['type'] = 'u';
307                                        }
308                                }
309               
310                                // Checamos e-mails que não fazem parte do expresso.
311                                // Criamos um array temporario
312                                $tmp_array = array();
313                                if($result['memberuid_info'])
314                                        foreach ($result['memberuid_info'] as $uid => $user_data)
315                                        {
316                                                $tmp_array[] = $uid;
317                                        }
318               
319                                if($entry[0]['memberuid']) {
320                                        // Retira o count do array
321                                        array_shift($entry[0]['memberuid']);
322                                        // Vemos a diferença
323                                        $array_diff = array_diff($entry[0]['memberuid'], $tmp_array);
324                                        // Incluimos no resultado                       
325                                        foreach ($array_diff as $index=>$uid)
326                                        {
327                                                $result['memberuid_info'][$uid]['cn'] = $uid;
328                                        }
329                                }
330               
331                                // Samba
332                                for ($i=0; $i<$entry[0]['objectclass']['count']; ++$i)
333                                {
334                                        if ($entry[0]['objectclass'][$i] == 'sambaGroupMapping')
335                                                $result['sambaGroup'] = true;
336
337                                        $a_tmp = explode("-", $entry[0]['sambasid'][0]);
338                                        array_pop($a_tmp);
339                                        $result['sambasid'] = implode("-", $a_tmp);
340                                }
341                                return $result;
342                        }
343                }
344        }       
345       
346        function get_maillist_info($uidnumber)
347        {
348                /* folling referral connection */
349                $ldap_conn_following_ref = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
350                if ($ldap_conn_following_ref)
351                {
352                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_PROTOCOL_VERSION, 3);
353                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_REFERRALS, 1);
354
355                        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
356                                ldap_bind($ldap_conn_following_ref, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
357                }
358               
359                foreach ($this->manager_contexts as $index=>$context)
360                {
361                        $filter="(&(phpgwAccountType=l)(uidNumber=".$uidnumber."))";
362                        $search = ldap_search($this->ldap, $context, $filter);
363                        $entry = ldap_get_entries($this->ldap, $search);
364                       
365                        if ($entry['count'])
366                        {
367                                //Pega o dn do setor do usuario.
368                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
369                                $sector_dn_array = explode(",", $entry[0]['dn']);
370                $sector_dn_array_count = count($sector_dn_array);
371                                for($i=1; $i<$sector_dn_array_count; ++$i)
372                                        $sector_dn .= $sector_dn_array[$i] . ',';
373                                //Retira ultimo pipe.
374                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
375                       
376                                $result['context']                              = $sector_dn;
377                                $result['uidnumber']                    = $entry[0]['uidnumber'][0];
378                                $result['uid']                                  = strtolower($entry[0]['uid'][0]);
379                                $result['cn']                                   = $entry[0]['cn'][0];
380                                $result['mail']                                 = $entry[0]['mail'][0];
381                                $result['description']                  = utf8_decode($entry[0]['description'][0]);
382                                $result['accountStatus']                = $entry[0]['accountstatus'][0];
383                                $result['phpgwAccountVisible']  = $entry[0]['phpgwaccountvisible'][0];
384                       
385                                //Members
386                                for ($i=0; $i<$entry[0]['mailforwardingaddress']['count']; ++$i)
387                                {
388                                        $justthese = array("cn", "uidnumber", "uid", "phpgwaccounttype", "mail");
389                               
390                                        // Montagem dinamica do filtro, para nao ter muitas conexoes com o ldap
391                                        $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|";
392                                        for ($k=0; (($k<10) && ($i<$entry[0]['mailforwardingaddress']['count'])); ++$k)
393                                        {
394                                                $filter .= "(mail=".$entry[0]['mailforwardingaddress'][$i].")";
395                                                ++$i;
396                                        }
397                                        $i--;
398                                        $filter .= "))";
399                               
400                                        $search = ldap_search($ldap_conn_following_ref, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
401                                        $user_entry = ldap_get_entries($ldap_conn_following_ref, $search);
402                                                                       
403                                        for ($j=0; $j<$user_entry['count']; ++$j)
404                                        {
405                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['uid'] = $user_entry[$j]['uid'][0];
406                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['cn'] = $user_entry[$j]['cn'][0];
407                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['type'] = $user_entry[$j]['phpgwaccounttype'][0];
408                                                $result['mailForwardingAddress'][] = $user_entry[$j]['mail'][0];
409                                        }
410                                }
411
412                                // Emails não encontrados no ldap
413                                array_shift($entry[0]['mailforwardingaddress']); //Retira o count do array
414                                $missing_emails = array_diff($entry[0]['mailforwardingaddress'], $result['mailForwardingAddress']);
415                               
416                                // Incluimos estes no resultado
417                                foreach ($missing_emails as $index=>$mailforwardingaddress)
418                                {
419                                        $result['mailForwardingAddress_info'][$mailforwardingaddress]['uid'] = $mailforwardingaddress;
420                                        $result['mailForwardingAddress_info'][$mailforwardingaddress]['cn'] = 'E-Mail nao encontrado';
421                                        $result['mailForwardingAddress'][] = $mailforwardingaddress;
422                                }
423                               
424                                ldap_close($ldap_conn_following_ref);
425                                return $result;
426                        }
427                }
428        }       
429
430               
431
432        function group_exist($gidnumber)
433        {
434                $justthese = array("cn");
435                $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
436                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
437                               
438                $entry = ldap_get_entries($this->ldap, $search);
439                if ($entry['count'] == 0)
440                        return false;
441                else
442                        return true;
443        }
444
445        function gidnumbers2cn($gidnumbers)
446        {
447                $result = array();
448                if (count($gidnumbers))
449                {
450                        $justthese = array("cn");
451                        $i = 0;
452                        foreach ($gidnumbers as $gidnumber)
453                        {
454                                $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
455                                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
456                               
457                                $entry = ldap_get_entries($this->ldap, $search);
458                                if ($entry['count'] == 0)
459                                        $result['groups_info'][$i]['cn'] = '_' . $this->functions->lang('group only exist on DB, but does not exist on ldap');
460                                       
461                                else
462                                        $result['groups_info'][$i]['cn'] = $entry[0]['cn'][0];
463                                $result['groups_info'][$i]['gidnumber'] = $gidnumber;
464                       
465                                /* o gerente pode excluir um grupo de um usuario onde este grupo esta em outra OU ? */
466                                /* é o mesmo que o manager editar um grupo de outra OU */
467                                $result['groups_info'][$i]['group_disabled'] = 'true';
468                                foreach ($this->manager_contexts as $index=>$context)
469                                {
470                                        if (strpos(strtolower($entry[0]['dn']), strtolower($context)))
471                                        {
472                                                $result['groups_info'][$i]['group_disabled'] = 'false';
473                                        }
474                                }
475
476                                ++$i;
477                        }
478                }
479                return $result;
480        }
481
482        function uidnumber2uid($uidnumber)
483        {
484                $justthese = array("uid");
485                $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uidNumber=".$uidnumber."))";
486                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
487                $entry = ldap_get_entries($this->ldap, $search);
488                return $entry[0]['uid'][0];
489        }
490
491        function uidnumber2mail($uidnumber)
492        {
493                $justthese = array("mail");
494                $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uidNumber=".$uidnumber."))";
495                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
496                $entry = ldap_get_entries($this->ldap, $search);
497                return $entry[0]['mail'][0];
498        }
499       
500        function search_user($params)
501        {
502                $search = $params['search'];
503                $justthese = array("cn","uid", "mail");
504        $users_list=ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], "(&(phpgwAccountType=u) (|(cn=*$search*)(mail=$search*)) )", $justthese);
505       
506        if (ldap_count_entries($this->ldap, $users_list) == 0)
507        {
508                $return['status'] = 'false';
509                $result['msg'] = $this->functions->lang('Any result was found') . '.';
510                return $return;
511        }
512       
513        ldap_sort($this->ldap, $users_list, "cn");
514       
515        $entries = ldap_get_entries($this->ldap, $users_list);
516               
517                $options = '';
518                for ($i=0; $i<$entries['count']; ++$i)
519                {
520                        $options .= "<option value=" . $entries[$i]['uid'][0] . ">" . $entries[$i]['cn'][0] . " (".$entries[$i]['mail'][0].")" . "</option>";
521                }
522       
523        return $options;               
524        }
525}
526?>
Note: See TracBrowser for help on using the repository browser.