source: trunk/expressoAdmin1_2/inc/class.ldap_functions.inc.php @ 221

Revision 221, 53.6 KB checked in by niltonneto, 16 years ago (diff)
  • Property svn:eol-style set to native
  • Property svn:executable set to *
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        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
10        {
11                @ldap_bind($ldap_connection, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
12        }
13}
14
15class ldap_functions
16{
17        var $ldap;
18        var $current_config;
19        var $functions;
20        var $manager_contexts;
21       
22        function ldap_functions(){
23                $GLOBALS['phpgw_info']['server'] = $_SESSION['phpgw_info']['expresso']['server'];
24                $this->current_config = $_SESSION['phpgw_info']['expresso']['expressoAdmin'];
25                $common = new common();
26                $this->ldap = $common->ldapConnect();
27               
28                $this->functions = new functions;
29                $manager_acl = $this->functions->read_acl($_SESSION['phpgw_info']['expresso']['user']['account_lid']);
30                $this->manager_contexts = $manager_acl['contexts'];
31        }
32       
33        /* ldap connection following referals and using Contac Center config*/
34        function ldapMasterConnect()
35        {
36                if ( (is_array($_SESSION['phpgw_info']['expresso']['cc_ldap_server'])) && ($ldap_connection = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host'])) )
37                {
38                        ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
39                        ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
40                        ldap_set_rebind_proc($ldap_connection, ldapRebind);
41                        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
42                        {
43                                if ( ! ldap_bind($ldap_connection, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']) )
44                                {
45                                        return false;
46                                }
47                        }
48                        return $ldap_connection;
49                }
50                else
51                {
52                        $ldap_connection = ldap_connect($GLOBALS['phpgw_info']['server']['ldap_host']);
53                        if ($ldap_connection)
54                        {
55                                ldap_set_option($ldap_connection,LDAP_OPT_PROTOCOL_VERSION,3);
56                                ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
57                                if ( ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['ldap_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_root_pw']) )
58                                        return $ldap_connection;
59                        }
60                }
61               
62                return false;
63        }
64               
65        function validate_fields($params)
66        {
67                /* ldap connection following referals and using Contac Center config*/
68                if (is_array($_SESSION['phpgw_info']['expresso']['cc_ldap_server']))
69                {
70                        $ldap_connection = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
71                        if ($ldap_connection)
72                        {
73                                ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
74                                ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
75                               
76                                if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
77                                        ldap_bind($ldap_connection, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
78                                $context = $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['dn'];
79                        }
80                        else
81                        {
82                                $result['status'] = false;
83                                $result['msg'] = 'Falha na conexao com o ldap.';
84                                return $result;
85                        }
86                }
87                else
88                {
89                        $ldap_connection = ldap_connect($GLOBALS['phpgw_info']['server']['ldap_host']);
90                        ldap_set_option($ldap_connection,LDAP_OPT_PROTOCOL_VERSION,3);
91                        ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
92                        ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['ldap_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_root_pw']);
93                        $context = $GLOBALS['phpgw_info']['server']['ldap_context'];
94                }
95               
96                $result['status'] = true;
97               
98                $params = unserialize($params['attributes']);
99                $type = $params['type'];
100                $uid = $params['uid'];
101                $mail = $params['mail'];
102                $mailalternateaddress = $params['mailalternateaddress'];
103                               
104                if ($_SESSION['phpgw_info']['expresso']['global_denied_users'][$uid])
105                {
106                        $result['status'] = false;
107                        $result['msg'] = 'Este LOGIN não pode ser usado pois é uma conta de sistema.';
108                        return $result;
109                }
110               
111                if (($type == 'create_user') || ($type == 'rename_user'))
112                {
113                        if ($this->current_config['expressoAdmin_prefix_org'] == 'true')
114                        {
115                                //Obtenho UID sem a organização. Na criação o uid já vem sem a organização
116                                $tmp_uid_without_org = split("-", $params['uid']);
117                                $tmp_reverse_uid_without_org = array_reverse($tmp_uid_without_org);
118                                array_pop($tmp_reverse_uid_without_org);
119                                $uid_without_org = implode("-", $tmp_reverse_uid_without_org);
120                                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|(uid=$uid)(uid=$uid_without_org)))";
121                        }
122                        else
123                        {
124                                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uid=$uid))";
125                        }
126                        /*
127                        //UID
128                        if (($type == 'rename_user') && ($this->current_config['expressoAdmin_prefix_org'] == 'true'))
129                        {
130                                //Obtenho UID sem a organização. Na criação o uid já vem sem a organização
131                                $tmp_uid_without_org = split("-", $params['uid']);
132                                $tmp_reverse_uid_without_org = array_reverse($tmp_uid_without_org);
133                                array_pop($tmp_reverse_uid_without_org);
134                                $uid_without_org = implode("-", $tmp_reverse_uid_without_org);
135                                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|(uid=$uid)(uid=$uid_without_org)))";
136                        }
137                        else
138                        {
139                                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uid=$uid))";
140                        }
141                        */
142                       
143                        $justthese = array("uid", "mail", "cn");
144                        $search = ldap_search($ldap_connection, $context, $filter, $justthese);
145                        $count_entries = ldap_count_entries($ldap_connection,$search);
146                        if ($count_entries > 0)
147                        {
148                                $entries = ldap_get_entries($ldap_connection, $search);
149                               
150                                for ($i=0; $i<$entries['count']; $i++)
151                                {
152                                        $users .= $entries[$i]['cn'][0] . ' - ' . $entries[$i]['mail'][0] . "\n";
153                                }
154                               
155                                $result['status'] = false;
156                                $result['msg'] = "LOGIN já está sendo utilizado por:\n" . $users;
157                                return $result;
158                        }
159
160                        // GRUPOS
161                        $filter = "(&(phpgwAccountType=g)(cn=$uid))";
162                        $justthese = array("cn");
163                        $search = ldap_search($ldap_connection, $context, $filter, $justthese);
164                        $count_entries = ldap_count_entries($ldap_connection,$search);
165                        if ($count_entries > 0)
166                        {
167                                $result['status'] = false;
168                                $result['msg'] = 'LOGIN do usuário já esta sendo usado por um grupo.';
169                                return $result;
170                        }
171                       
172                       
173                        // UID em outras organizações, pesquiso apenas na maquina local e se utilizar prefix_org
174                        if ($this->current_config['expressoAdmin_prefix_org'] == 'true')
175                        {
176                                $ldap_connection2 = ldap_connect($GLOBALS['phpgw_info']['server']['ldap_host']);
177                                ldap_set_option($ldap_connection2,LDAP_OPT_PROTOCOL_VERSION,3);
178                                ldap_set_option($ldap_connection2, LDAP_OPT_REFERRALS, false);
179                                ldap_bind($ldap_connection2, $GLOBALS['phpgw_info']['server']['ldap_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_root_pw']);
180                                $context = $GLOBALS['phpgw_info']['server']['ldap_context'];
181                               
182                                //Obtenho UID sem a organização
183                                /*
184                                $tmp_uid_without_org = split("-", $params['uid']);
185                                if (count($tmp_uid_without_org) < 2)
186                                {
187                                        $result['status'] = false;
188                                        $result['msg'] = 'Novo login sem organização.';
189                                        return $result;
190                                }
191                                $tmp_reverse_uid_without_org = array_reverse($tmp_uid_without_org);
192                                array_pop($tmp_reverse_uid_without_org);
193                                $uid_without_org = implode("-", $tmp_reverse_uid_without_org);
194                                */
195                               
196                                $filter = "(ou=*)";
197                                $justthese = array("ou");
198                                $search = ldap_list($ldap_connection2, $context, $filter, $justthese);
199                                $entries = ldap_get_entries($ldap_connection2   ,$search);
200                               
201                                foreach ($entries as $index=>$org)
202                                {
203                                        $organization = $org['ou'][0];
204                                        $organization = strtolower($organization);
205                               
206                                        $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uid=$organization-$uid))";
207                                       
208                                        $justthese = array("uid");
209                                        $search = ldap_search($ldap_connection2, $context, $filter, $justthese);
210                                        $count_entries = ldap_count_entries($ldap_connection2,$search);
211                                        if ($count_entries > 0)
212                                        {
213                                                $result['status'] = false;
214                                                $result['msg'] = 'LOGIN já esta sendo usado por outro usuário em outra organização.';
215                                                ldap_close($ldap_connection2);
216                                                return $result;
217                                        }
218                                }
219                                ldap_close($ldap_connection2);
220                        }
221                }
222               
223                if ($type == 'rename_user')
224                {
225                        return $result;
226                }
227               
228                // MAIL
229                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|(mail=$mail)(mailalternateaddress=$mail)))";
230                $justthese = array("mail", "uid");
231                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
232                $entries = ldap_get_entries($ldap_connection,$search);
233                if ($entries['count'] == 1){
234                        if ($entries[0]['uid'][0] != $uid){
235                                $result['status'] = false;
236                                $result['msg'] = 'E-MAIL está sendo usado por 1 usuário: ' . $entries[0]['uid'][0];
237                                //ldap_close($ldap_connection);
238                                return $result;
239                        }
240                }
241                else if ($entries['count'] > 1){
242                        $result['status'] = false;
243                        $result['msg'] = 'E-MAIL está sendo usado por 2 ou mais usuários.';
244                        //ldap_close($ldap_connection);
245                        return $result;
246                }
247               
248                // MAILAlternateAddress
249                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|(mail=$mailalternateaddress)(mailalternateaddress=$mailalternateaddress)))";
250                $justthese = array("mail", "uid");
251                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
252                $entries = ldap_get_entries($ldap_connection,$search);
253                if ($entries['count'] == 1){
254                        if ($entries[0]['uid'][0] != $uid){
255                                $result['status'] = false;
256                                $result['msg'] = "E-MAIL alternativo está sendo usado por 1 usuário: " . $entries[0]['uid'][0];
257                                //ldap_close($ldap_connection);
258                                return $result;
259                        }
260                }
261                else if ($entries['count'] > 1){
262                        $result['status'] = false;
263                        $result['msg'] = 'E-MAIL alternativo está sendo usado por 2 ou mais usuários.';
264                        return $result;
265                }
266
267                return $result;
268        }
269       
270        function validate_fields_group($params)
271        {
272                /* ldap connection following referals and using Contac Center config*/
273                if (is_array($_SESSION['phpgw_info']['expresso']['cc_ldap_server']))
274                {
275                        $ldap_connection = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
276                        if ($ldap_connection)
277                        {
278                                ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
279                                ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
280                                if ( ($GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
281                                        ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['acc'], $GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['pw']);
282                                $context = $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['dn'];
283                        }
284                        else
285                        {
286                                $result['status'] = false;
287                                $result['msg'] = 'Falha na conexao com o ldap.';
288                                return $result;
289                        }
290                }
291                else
292                {
293                        $ldap_connection = ldap_connect($GLOBALS['phpgw_info']['server']['ldap_host']);
294                        ldap_set_option($ldap_connection,LDAP_OPT_PROTOCOL_VERSION,3);
295                        ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
296                        ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['ldap_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_root_pw']);
297                        $context = $GLOBALS['phpgw_info']['server']['ldap_context'];
298                }
299
300                $cn = $params['cn'];
301                $result['status'] = true;
302               
303                if ($_SESSION['phpgw_info']['expresso']['global_denied_groups'][$cn])
304                {
305                        $result['status'] = false;
306                        $result['msg'] = 'Este nome de grupo não pode ser usado pois é um grupo de sistema.';
307                        return $result;
308                }
309               
310                // CN
311                $filter = "(&(phpgwAccountType=g)(cn=$cn))";
312                $justthese = array("cn");
313                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
314                $count_entries = ldap_count_entries($ldap_connection,$search);
315                if ($count_entries > 0)
316                {
317                        $result['status'] = false;
318                        $result['msg'] = 'NOME do grupo já está sendo usado.';
319                        return $result;
320                }
321               
322                // UID
323                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uid=$cn))";
324                $justthese = array("uid");
325                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
326                $count_entries = ldap_count_entries($ldap_connection,$search);
327                if ($count_entries > 0)
328                {
329                        $result['status'] = false;
330                        $result['msg'] = 'NOME do grupo já esta sendo usado por um usuário.';
331                        return $result;
332                }
333               
334                return $result;
335        }
336       
337        function validate_fields_maillist($params)
338        {
339                /* ldap connection following referals and using Contac Center config*/
340                if (is_array($_SESSION['phpgw_info']['expresso']['cc_ldap_server']))
341                {
342                        $ldap_connection = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
343                        if ($ldap_connection)
344                        {
345                                ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
346                                ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
347                                if ( ($GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
348                                        ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['acc'], $GLOBALS['phpgw_info']['expresso']['cc_ldap_server']['pw']);
349                                $context = $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['dn'];
350                        }
351                        else
352                        {
353                                $result['status'] = false;
354                                $result['msg'] = 'Falha na conexao com o ldap.';
355                                return $result;
356                        }
357                }
358                else
359                {
360                        $ldap_connection = ldap_connect($GLOBALS['phpgw_info']['server']['ldap_host']);
361                        ldap_set_option($ldap_connection,LDAP_OPT_PROTOCOL_VERSION,3);
362                        ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);
363                        ldap_bind($ldap_connection, $GLOBALS['phpgw_info']['server']['ldap_root_dn'], $GLOBALS['phpgw_info']['server']['ldap_root_pw']);
364                        $context = $GLOBALS['phpgw_info']['server']['ldap_context'];
365                }
366               
367                $uid = $params['uid'];
368                $mail = $params['mail'];
369                $result['status'] = true;
370               
371                if ($_SESSION['phpgw_info']['expresso']['global_denied_users'][$uid])
372                {
373                        $result['status'] = false;
374                        $result['msg'] = 'Este LOGIN não pode ser usado pois é uma conta de sistema.';
375                        return $result;
376                }
377               
378                // UID
379                $filter = "(&(phpgwAccountType=l)(uid=$uid))";
380                $justthese = array("uid");
381                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
382                $count_entries = ldap_count_entries($ldap_connection,$search);
383                if ($count_entries > 0)
384                {
385                        $result['status'] = false;
386                        $result['msg'] = 'LOGIN da lista já está sendo usado.';
387                        return $result;
388                }
389               
390                // MAIL
391                $filter = "(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|(mail=$mail)(mailalternateaddress=$mail)))";
392                $justthese = array("mail");
393                $search = ldap_search($ldap_connection, $context, $filter, $justthese);
394                $count_entries = ldap_count_entries($ldap_connection,$search);
395                if ($count_entries > 0)
396                {
397                        $result['status'] = false;
398                        $result['msg'] = 'E-MAIL da lista já está sendo usado.';
399                        return $result;
400                }
401               
402                return $result;
403        }
404
405        //Busca usuários de um contexto e já retorna as options do select;
406        function get_available_users($params)
407        {
408                $context = $params['context'];
409                $recursive = $params['recursive'];
410                $justthese = array("cn", "uidNumber");
411                $filter="(phpgwAccountType=u)";
412               
413                if ($recursive == 'true')
414                        $groups_list=ldap_search($this->ldap, $context, $filter, $justthese);
415                else
416                $groups_list=ldap_list($this->ldap, $context, $filter, $justthese);
417       
418        $entries = ldap_get_entries($this->ldap, $groups_list);
419       
420                for ($i=0; $i<$entries["count"]; $i++){
421                        $u_tmp[$entries[$i]["uidnumber"][0]] = $entries[$i]["cn"][0];
422                }
423                       
424                if (count($u_tmp))
425                        natcasesort($u_tmp);
426
427                $i = 0;
428                $users = array();
429                       
430                if (count($u_tmp))
431                {
432                        foreach ($u_tmp as $uidnumber => $cn)
433                        {
434                                $options .= "<option value=$uidnumber>$cn</option>";
435                        }
436                        unset($u_tmp);
437                }
438
439        return $options;
440        }
441
442        //Busca usuários de um contexto e já retorna as options do select;
443        /*
444        function get_available_users_and_maillist($params)
445        {
446                $context = $params['context'];
447                $recursive = $params['recursive'];
448                $justthese = array("cn", "uidNumber");
449                $filter="(|(phpgwAccountType=u)(phpgwAccountType=l))";
450               
451                if ($recursive == 'true')
452                        $groups_list=ldap_search($this->ldap, $context, $filter, $justthese);
453                else
454                $groups_list=ldap_list($this->ldap, $context, $filter, $justthese);
455       
456        $entries = ldap_get_entries($this->ldap, $groups_list);
457       
458                for ($i=0; $i<$entries["count"]; $i++){
459                        $u_tmp[$entries[$i]["uidnumber"][0]] = $entries[$i]["cn"][0];
460                }
461                       
462                if (count($u_tmp))
463                        natcasesort($u_tmp);
464
465                $i = 0;
466                $users = array();
467                       
468                if (count($u_tmp))
469                {
470                        foreach ($u_tmp as $uidnumber => $cn)
471                        {
472                                $options .= "<option value=$uidnumber>$cn</option>";
473                        }
474                        unset($u_tmp);
475                }
476
477        return $options;
478        }
479        */
480
481        //Busca usuários e listas de um contexto e já retorna as options do select;
482        function get_available_users_and_maillist($params)
483        {
484                $context = $params['context'];
485                $recursive = $params['recursive'];
486               
487                //Usado para retirar a própria lista das possibilidades de inclusão.
488                $denied_uidnumber = $params['denied_uidnumber'];
489               
490                $justthese = array("cn", "uidNumber", "mail");
491               
492                $users_filter="(phpgwAccountType=u)";
493                $lists_filter = $denied_uidnumber == '' ? "(phpgwAccountType=l)" : "(&(phpgwAccountType=l)(!(uidnumber=$denied_uidnumber)))";
494               
495                $users = Array();
496                $lists = Array();               
497
498                /* folling referral connection */
499                $ldap_conn_following_ref = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
500                if ($ldap_conn_following_ref)
501                {
502                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_PROTOCOL_VERSION, 3);
503                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_REFERRALS, 1);
504
505                        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
506                                ldap_bind($ldap_conn_following_ref, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
507                }
508                else
509                        return false;
510
511                if ($recursive == 'true')
512                {
513                        $lists_search = ldap_search($ldap_conn_following_ref, $context, $lists_filter, $justthese);
514                        $users_search = ldap_search($ldap_conn_following_ref, $context, $users_filter, $justthese);
515                }
516                else
517                {
518                        $lists_search = ldap_list($ldap_conn_following_ref, $context, $lists_filter, $justthese);
519                        $users_search = ldap_list($ldap_conn_following_ref, $context, $users_filter, $justthese);
520                }
521               
522                /* email lists */
523                $lists_entries = ldap_get_entries($ldap_conn_following_ref, $lists_search);
524               
525                for ($i=0; $i<$lists_entries["count"]; $i++)
526                {
527                        $l_tmp[$lists_entries[$i]["mail"][0]] = $lists_entries[$i]["cn"][0];
528                }
529                       
530                if (count($l_tmp))
531                        natcasesort($l_tmp);
532                       
533                $i = 0;
534                $lists = array();
535               
536                $options .= '<option  value="-1" disabled>------------------------------&nbsp;&nbsp;&nbsp;&nbsp;Listas&nbsp;&nbsp;&nbsp;&nbsp;------------------------------ </option>'."\n";   
537                if (count($l_tmp))
538                {
539                        foreach ($l_tmp as $mail => $cn)
540                        {
541                                $options .= "<option value=$mail>$cn</option>";
542                        }
543                        unset($l_tmp);
544                }
545               
546                /* users */
547                $users_entries = ldap_get_entries($ldap_conn_following_ref, $users_search);
548                for ($i=0; $i<$users_entries["count"]; $i++)
549                {
550                        $u_tmp[$users_entries[$i]["mail"][0]] = $users_entries[$i]["cn"][0];
551                }
552                       
553                if (count($u_tmp))
554                        natcasesort($u_tmp);
555                       
556                $i = 0;
557                $users = array();
558               
559                $options .= '<option  value="-1" disabled>-----------------------------&nbsp;&nbsp;&nbsp;&nbsp;Usuários&nbsp;&nbsp;&nbsp;&nbsp;---------------------------- </option>'."\n";   
560                if (count($u_tmp))
561                {
562                        foreach ($u_tmp as $mail => $cn)
563                        {
564                                $options .= "<option value=$mail class='line-above'>$cn</option>";
565                        }
566                        unset($u_tmp);
567                }
568               
569                ldap_close($ldap_conn_following_ref);
570                return $options;
571        }
572
573        function get_available_groups($params)
574        {
575                $context = $params['context'];
576                $justthese = array("cn", "gidNumber");
577        $groups_list=ldap_list($this->ldap, $context, ("(phpgwAccountType=g)"), $justthese);
578        ldap_sort($this->ldap, $groups_list, "cn");
579       
580        $entries = ldap_get_entries($this->ldap, $groups_list);
581               
582                $options = '';
583                for ($i=0; $i<$entries['count']; $i++)
584                {
585                        $options .= "<option value=" . $entries[$i]['gidnumber'][0] . ">" . $entries[$i]['cn'][0] . "</option>";
586                }
587       
588        return $options;               
589        }
590       
591        function get_available_maillists($params)
592        {
593                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
594                        return false;
595               
596                $context = $params['context'];
597                $justthese = array("uid","mail","uidNumber");
598        $maillists=ldap_list($ldapMasterConnect, $context, ("(phpgwAccountType=l)"), $justthese);
599        ldap_sort($ldapMasterConnect, $maillists, "uid");
600       
601        $entries = ldap_get_entries($ldapMasterConnect, $maillists);
602       
603                $options = '';                 
604                for ($i=0; $i<$entries['count']; $i++)
605                {
606                        $options .= "<option value=" . $entries[$i]['uid'][0] . ">" . $entries[$i]['uid'][0] . " (" . $entries[$i]['mail'][0] . ")" . "</option>";
607                }
608       
609        ldap_close($ldapMasterConnect);
610        return $options;
611        }
612       
613        function ldap_add_entry($dn, $entry)
614        {
615                $result = array();
616                if (!@ldap_add ( $this->ldap, $dn, $entry ))
617                {
618                        $result['status'] = false;
619                        $result['msg'] = "Erro na funcao ldap_functions->ldap_add_entry ($dn).\nRetorno do servidor:" . ldap_error($this->ldap);
620                }
621                else
622                        $result['status'] = true;
623               
624                return $result;
625        }
626       
627        function ldap_save_photo($dn, $pathphoto, $photo_exist=false)
628        {
629                $fd = fopen($pathphoto, "r");
630                $fsize = filesize($pathphoto);
631                $jpegStr = fread($fd, $fsize);
632                fclose ($fd);
633                $attrs['jpegPhoto'] = $jpegStr;
634                       
635                if ($photo_exist)
636                        $res = @ldap_mod_replace($this->ldap, $dn, $attrs);
637                else
638                        $res = @ldap_mod_add($this->ldap, $dn, $attrs);
639                       
640                if ($res)
641                {
642                        $result['status'] = true;
643                }
644                else
645                {
646                        $result['status'] = false;
647                        $result['msg'] = "Erro na funcao ldap_functions->ldap_save_photo ($dn).\nRetorno do servidor:" . ldap_error($this->ldap);
648                }
649               
650                return $result;
651        }
652       
653        function ldap_remove_photo($dn)
654        {
655                $attrs['jpegPhoto'] = array();
656                $res = ldap_mod_del($this->ldap, $dn, $attrs);
657               
658                if ($res)
659                {
660                        $result['status'] = true;
661                }
662                else
663                {
664                        $result['status'] = false;
665                        $result['msg'] = "Erro na funcao ldap_functions->ldap_remove_photo ($dn).\nRetorno do servidor:" . ldap_error($this->ldap);
666                }
667               
668                return $result;
669        }       
670       
671        // Pode receber tanto um único memberUid quanto um array de memberUid's
672        function add_user2group($gidNumber, $memberUid)
673        {
674                $filter = "(&(phpgwAccountType=g)(gidNumber=$gidNumber))";
675                $justthese = array("dn");
676                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
677                $entry = ldap_get_entries($this->ldap, $search);
678                $group_dn = $entry[0]['dn'];
679                $attrs['memberUid'] = $memberUid;
680               
681                $res = @ldap_mod_add($this->ldap, $group_dn, $attrs);
682               
683                if ($res)
684                {
685                        $result['status'] = true;
686                }
687                else
688                {
689                        $result['status'] = false;
690                        $result['msg'] = "Erro na funcao ldap_functions->add_user2group ($memberUid).\nRetorno do servidor:" . ldap_error($this->ldap);
691                }
692                return $result;
693        }
694       
695        function remove_user2group($gidNumber, $memberUid)
696        {
697                $filter = "(&(phpgwAccountType=g)(gidNumber=$gidNumber))";
698                $justthese = array("dn");
699                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
700                $entry = ldap_get_entries($this->ldap, $search);
701                $group_dn = $entry[0]['dn'];
702                $attrs['memberUid'] = $memberUid;
703                $res = @ldap_mod_del($this->ldap, $group_dn, $attrs);
704               
705                /*echo 'usuarios recebidos para remocao no ldap';
706                echo '<pre>';
707                print_r($memberUid);*/
708               
709                if ($res)
710                {
711                        $result['status'] = true;
712                }
713                else
714                {
715                        $result['status'] = false;
716                        $result['msg'] = "Erro na funcao ldap_functions->remove_user2group ($memberUid).\nRetorno do servidor:" . ldap_error($this->ldap);
717                }
718                return $result;
719        }
720       
721        function add_user2maillist($uid, $mail)
722        {
723                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
724                {
725                        $result['status'] = false;
726                        $result['msg'] = "Falha de conexão com o openLDAP.\n\nRetorno do servidor:" . ldap_error($ldapMasterConnect);
727                        return $result;
728                }
729                       
730                $filter = "(&(phpgwAccountType=l)(uid=$uid))";
731                $justthese = array("dn");
732                $search = ldap_search($ldapMasterConnect, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
733                $entry = ldap_get_entries($ldapMasterConnect, $search);
734                $group_dn = $entry[0]['dn'];
735                $attrs['mailForwardingAddress'] = $mail;
736                $res = @ldap_mod_add($ldapMasterConnect, $group_dn, $attrs);
737               
738                if ($res)
739                {
740                        $result['status'] = true;
741                }
742                else
743                {
744                        $result['status'] = false;
745                        $result['msg'] = "Erro na funcao ldap_functions->add_user2maillist ($mail).\nRetorno do servidor:" . ldap_error($ldapMasterConnect);
746                }
747               
748                ldap_close($ldapMasterConnect);
749                return $result;
750        }
751       
752        function add_user2maillist_scl($dn, $array_emails)
753        {
754                $attrs['mailSenderAddress'] = $array_emails;
755               
756                print_r($attrs);
757               
758                $res = @ldap_mod_add($this->ldap, $dn, $attrs);
759               
760                if ($res)
761                {
762                        $result['status'] = true;
763                }
764                else
765                {
766                        $result['status'] = false;
767                        $result['msg'] = "Erro na funcao ldap_functions->add_user2maillist_scp ($dn).\n\nRetorno do servidor:" . ldap_error($this->ldap);
768                }
769                return $result;
770        }
771
772        function remove_user2maillist($uid, $mail)
773        {
774                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
775                {
776                        $result['status'] = false;
777                        $result['msg'] = "Falha de conexão com o openLDAP.\n\nRetorno do servidor:" . ldap_error($ldapMasterConnect);
778                        return $result;
779                }
780               
781                $filter = "(&(phpgwAccountType=l)(uid=$uid))";
782                $justthese = array("dn");
783                $search = ldap_search($ldapMasterConnect, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
784                $entry = ldap_get_entries($ldapMasterConnect, $search);
785                $group_dn = $entry[0]['dn'];
786                $attrs['mailForwardingAddress'] = $mail;
787                $res = @ldap_mod_del($ldapMasterConnect, $group_dn, $attrs);
788               
789                if ($res)
790                {
791                        $result['status'] = true;
792                }
793                else
794                {
795                        $result['status'] = false;
796                        $result['msg'] = "Erro na funcao ldap_functions->remove_user2maillist ($mail).\n\nRetorno do servidor:" . ldap_error($this->ldap);
797                }
798                ldap_close($ldapMasterConnect);
799                return $result;
800        }
801
802        function remove_user2maillist_scl($dn, $array_emails)
803        {
804                $attrs['mailSenderAddress'] = $array_emails;
805                $res = @ldap_mod_del($this->ldap, $dn, $attrs);
806               
807                if ($res)
808                {
809                        $result['status'] = true;
810                }
811                else
812                {
813                        $result['status'] = false;
814                        $result['msg'] = "Erro na funcao ldap_functions->remove_user2maillist_scp ($dn).\n\nRetorno do servidor:" . ldap_error($this->ldap);
815                }
816                return $result;
817        }
818
819        function replace_user2maillists($new_mail, $old_mail)
820        {
821                $filter = "(&(phpgwAccountType=l)(mailforwardingaddress=$old_mail))";
822                $justthese = array("dn");
823                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
824                $entries = ldap_get_entries($this->ldap, $search);
825                $result['status'] = true;
826                for ($i=0; $i<$entries['count']; $i++)
827                {
828                        $attrs['mailforwardingaddress'] = $old_mail;
829                        $res1 = @ldap_mod_del($this->ldap, $entries[$i]['dn'], $attrs);
830                        $attrs['mailforwardingaddress'] = $new_mail;
831                        $res2 = @ldap_mod_add($this->ldap, $entries[$i]['dn'], $attrs);
832               
833                        if ((!$res1) || (!$res2))
834                        {
835                                $result['status'] = false;
836                                $result['msg'] = "Erro na funcao ldap_functions->replace_user2maillists ($old_mail).\nRetorno do servidor:" . ldap_error($this->ldap);
837                        }
838                }
839               
840                return $result;
841        }
842       
843        function get_user_info($uidnumber)
844        {
845                foreach ($this->manager_contexts as $index=>$context)
846                {
847                        $filter="(&(phpgwAccountType=u)(uidNumber=".$uidnumber."))";
848                        $search = ldap_search($this->ldap, $context, $filter);
849                        $entry = ldap_get_entries($this->ldap, $search);
850                       
851                        if ($entry['count'])
852                        {
853                                //Pega o dn do setor do usuario.
854                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
855                                $sector_dn_array = explode(",", $entry[0]['dn']);
856                                for($i=1; $i<count($sector_dn_array); $i++)
857                                        $sector_dn .= $sector_dn_array[$i] . ',';
858                                //Retira ultimo pipe.
859                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
860               
861                                $result['context']                              = $sector_dn;
862                                $result['uid']                                  = $entry[0]['uid'][0];
863                                $result['uidnumber']                    = $entry[0]['uidnumber'][0];
864                                $result['gidnumber']                    = $entry[0]['gidnumber'][0];
865                                $result['departmentnumber']             = $entry[0]['departmentnumber'][0];
866                                $result['givenname']                    = $entry[0]['givenname'][0];
867                                $result['sn']                                   = $entry[0]['sn'][0];
868                                $result['telephonenumber']              = $entry[0]['telephonenumber'][0];
869                                $result['passwd_expired']               = $entry[0]['phpgwlastpasswdchange'][0];
870                                $result['phpgwaccountstatus']   = $entry[0]['phpgwaccountstatus'][0];
871                                $result['phpgwaccountvisible']  = $entry[0]['phpgwaccountvisible'][0];
872                                $result['accountstatus']                = $entry[0]['accountstatus'][0];
873                                $result['mail']                                 = $entry[0]['mail'][0];
874                                $result['mailalternateaddress'] = $entry[0]['mailalternateaddress'];
875                                $result['mailforwardingaddress']= $entry[0]['mailforwardingaddress'];
876                                $result['deliverymode']                 = $entry[0]['deliverymode'][0];
877                                $result['userPasswordRFC2617']  = $entry[0]['userpasswordrfc2617'][0];
878
879                                //Photo
880                                if ($entry[0]['jpegphoto']['count'] == 1)
881                                        $result['photo_exist'] = 'true';
882               
883                                // Samba
884                                for ($i=0; $i<$entry[0]['objectclass']['count']; $i++)
885                                {
886                                        if ($entry[0]['objectclass'][$i] == 'sambaSamAccount')
887                                                $result['sambaUser'] = true;
888                                }
889                                if (($this->current_config['expressoAdmin_samba_support'] == 'true') && ($result['sambaUser']))
890                                {
891                                        $result['sambaaccflags'] = $entry[0]['sambaacctflags'][0];
892                                        $result['sambalogonscript'] = $entry[0]['sambalogonscript'][0];
893                                        $result['homedirectory'] = $entry[0]['homedirectory'][0];
894                                        $a_tmp = explode("-", $entry[0]['sambasid'][0]);
895                                        array_pop($a_tmp);
896                                        $result['sambasid'] = implode("-", $a_tmp);
897                                }
898
899                                // Verifica o acesso do gerente aos atributos corporativos
900                                if ($this->functions->check_acl($_SESSION['phpgw_session']['session_lid'], 'manipulate_corporative_information'))
901                                {
902                                        $result['corporative_information_employeenumber']= $entry[0]['employeenumber'][0];
903                                        $result['corporative_information_cpf']                  = $entry[0]['cpf'][0];
904                                        $result['corporative_information_rg']                   = $entry[0]['rg'][0];
905                                        $result['corporative_information_rguf']                 = $entry[0]['rguf'][0];
906                                }
907                               
908                                // MailLists
909                                $result['maillists_info'] = $this->get_user_maillists($result['mail']);
910                                if($result['maillists_info'])
911                                {
912                                        foreach ($result['maillists_info'] as $maillist)
913                                        {
914                                                $result['maillists'][] = $maillist['uid'];
915                                        }
916                                }
917                               
918                                // Groups
919                                $justthese = array("gidnumber","cn");
920                                $filter="(&(phpgwAccountType=g)(memberuid=".$result['uid']."))";
921                                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
922                        ldap_sort($this->ldap, $search, "cn");
923                        $entries = ldap_get_entries($this->ldap, $search);
924                        for ($i=0; $i<$entries['count']; $i++)
925                        {
926                                $result['groups_ldap'][ $entries[$i]['gidnumber'][0] ] = $entries[$i]['cn'][0];
927                        }
928                        }
929                }
930                return $result;
931        }
932               
933        function get_user_maillists($mail)
934        {
935                if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
936                        return false;
937               
938                $result = array();
939               
940                //Mostra somente os mailists dos contextos do gerente
941                $justthese = array("uid","mail","uidnumber");
942                $filter="(&(phpgwAccountType=l)(mailforwardingaddress=$mail))";
943               
944                foreach ($this->manager_contexts as $index=>$context)
945                {
946                        $search = ldap_search($ldapMasterConnect, $context, $filter, $justthese);
947                $entries = ldap_get_entries($ldapMasterConnect, $search);
948               
949                for ($i=0; $i<$entries['count']; $i++)
950                {
951                                $result[ $entries[$i]['uid'][0] ]['uid']                = $entries[$i]['uid'][0];
952                                $result[ $entries[$i]['uid'][0] ]['mail']               = $entries[$i]['mail'][0];
953                               
954                                $a_tmp[] = $entries[$i]['uid'][0];
955                }
956                }
957       
958        if($a_tmp) {
959                natcasesort($a_tmp);
960       
961                foreach ($a_tmp as $uid)
962                {
963                                $return[$uid]['uid']            = $result[$uid]['uid'];
964                                $return[$uid]['mail']           = $result[$uid]['mail'];
965                }
966        }
967        ldap_close($ldapMasterConnect);
968                return $return;
969        }
970       
971        function get_group_info($gidnumber)
972        {
973                foreach ($this->manager_contexts as $index=>$context)
974                {
975                        $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
976                        $search = ldap_search($this->ldap, $context, $filter);
977                        $entry = ldap_get_entries($this->ldap, $search);
978                       
979                        if ($entry['count'])
980                        {
981                                //Pega o dn do setor do grupo.
982                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
983                                $sector_dn_array = explode(",", $entry[0]['dn']);
984                                for($i=1; $i<count($sector_dn_array); $i++)
985                                        $sector_dn .= $sector_dn_array[$i] . ',';
986                                //Retira ultimo pipe.
987                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
988               
989                                $result['context']                              = $sector_dn;
990                                $result['cn']                                   = $entry[0]['cn'][0];
991                                $result['description']                  = $entry[0]['description'][0];
992                                $result['gidnumber']                    = $entry[0]['gidnumber'][0];
993                                $result['phpgwaccountvisible']  = $entry[0]['phpgwaccountvisible'][0];
994                                $result['email']                                = $entry[0]['mail'][0];
995               
996                                //MemberUid
997                                for ($i=0; $i<$entry[0]['memberuid']['count']; $i++)
998                                {
999                                        $justthese = array("cn","uid","uidnumber");
1000                       
1001                                        // Montagem dinamica do filtro
1002                                        $filter="(&(phpgwAccountType=u)(|";
1003                                        for ($k=0; (($k<10) && ($i<$entry[0]['memberuid']['count'])); $k++)
1004                                        {
1005                                                $filter .= "(uid=".$entry[0]['memberuid'][$i].")";
1006                                                $i++;
1007                                        }
1008                                        $i--;
1009                                        $filter .= "))";
1010                       
1011                                        $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1012                                        $user_entry = ldap_get_entries($this->ldap, $search);
1013
1014                                        for ($j=0; $j<$user_entry['count']; $j++)
1015                                        {
1016                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['cn'] = $user_entry[$j]['cn'][0];
1017                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['uidnumber'] = $user_entry[$j]['uidnumber'][0];
1018                                                $result['memberuid_info'][$user_entry[$j]['uid'][0]]['type'] = 'u';
1019                                        }
1020                                }
1021               
1022                                // Checamos e-mails que não fazem parte do expresso.
1023                                // Criamos um array temporario
1024                                $tmp_array = array();
1025                                if($result['memberuid_info'])
1026                                        foreach ($result['memberuid_info'] as $uid => $user_data)
1027                                        {
1028                                                $tmp_array[] = $uid;
1029                                        }
1030               
1031                                if($entry[0]['memberuid']) {
1032                                        // Retira o count do array
1033                                        array_shift($entry[0]['memberuid']);
1034                                        // Vemos a diferença
1035                                        $array_diff = array_diff($entry[0]['memberuid'], $tmp_array);
1036                                        // Incluimos no resultado                       
1037                                        foreach ($array_diff as $index=>$uid)
1038                                        {
1039                                                $result['memberuid_info'][$uid]['cn'] = $uid;
1040                                        }
1041                                }
1042               
1043                                // Samba
1044                                for ($i=0; $i<$entry[0]['objectclass']['count']; $i++)
1045                                {
1046                                        if ($entry[0]['objectclass'][$i] == 'sambaGroupMapping')
1047                                                $result['sambaGroup'] = true;
1048
1049                                        $a_tmp = explode("-", $entry[0]['sambasid'][0]);
1050                                        array_pop($a_tmp);
1051                                        $result['sambasid'] = implode("-", $a_tmp);
1052                                }
1053                                return $result;
1054                        }
1055                }
1056        }       
1057       
1058        function get_maillist_info($uidnumber)
1059        {
1060               
1061                /* folling referral connection */
1062                $ldap_conn_following_ref = ldap_connect($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['host']);
1063                if ($ldap_conn_following_ref)
1064                {
1065                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_PROTOCOL_VERSION, 3);
1066                        ldap_set_option($ldap_conn_following_ref, LDAP_OPT_REFERRALS, 1);
1067
1068                        if ( ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'] != '') && ($_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw'] != '') )
1069                                ldap_bind($ldap_conn_following_ref, $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['acc'], $_SESSION['phpgw_info']['expresso']['cc_ldap_server']['pw']);
1070                }
1071               
1072                foreach ($this->manager_contexts as $index=>$context)
1073                {
1074                        $filter="(&(phpgwAccountType=l)(uidNumber=".$uidnumber."))";
1075                        $search = ldap_search($this->ldap, $context, $filter);
1076                        $entry = ldap_get_entries($this->ldap, $search);
1077                       
1078                        if ($entry['count'])
1079                        {
1080                                //Pega o dn do setor do usuario.
1081                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
1082                                $sector_dn_array = explode(",", $entry[0]['dn']);
1083                                for($i=1; $i<count($sector_dn_array); $i++)
1084                                        $sector_dn .= $sector_dn_array[$i] . ',';
1085                                //Retira ultimo pipe.
1086                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
1087                       
1088                                $result['context']                              = $sector_dn;
1089                                $result['uidnumber']                    = $entry[0]['uidnumber'][0];
1090                                $result['uid']                                  = strtolower($entry[0]['uid'][0]);
1091                                $result['cn']                                   = $entry[0]['cn'][0];
1092                                $result['mail']                                 = $entry[0]['mail'][0];
1093                                $result['accountStatus']                = $entry[0]['accountstatus'][0];
1094                                $result['phpgwAccountVisible']  = $entry[0]['phpgwaccountvisible'][0];
1095                       
1096                                //Members
1097                                for ($i=0; $i<$entry[0]['mailforwardingaddress']['count']; $i++)
1098                                {
1099                                        $justthese = array("cn", "uidnumber", "uid", "phpgwaccounttype", "mail");
1100                               
1101                                        // Montagem dinamica do filtro, para nao ter muitas conexoes com o ldap
1102                                        $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(|";
1103                                        for ($k=0; (($k<10) && ($i<$entry[0]['mailforwardingaddress']['count'])); $k++)
1104                                        {
1105                                                $filter .= "(mail=".$entry[0]['mailforwardingaddress'][$i].")";
1106                                                $i++;
1107                                        }
1108                                        $i--;
1109                                        $filter .= "))";
1110                               
1111                                        $search = ldap_search($ldap_conn_following_ref, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1112                                        $user_entry = ldap_get_entries($ldap_conn_following_ref, $search);
1113                                                                       
1114                                        for ($j=0; $j<$user_entry['count']; $j++)
1115                                        {
1116                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['uid'] = $user_entry[$j]['uid'][0];
1117                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['cn'] = $user_entry[$j]['cn'][0];
1118                                                $result['mailForwardingAddress_info'][$user_entry[$j]['mail'][0]]['type'] = $user_entry[$j]['phpgwaccounttype'][0];
1119                                                $result['mailForwardingAddress'][] = $user_entry[$j]['mail'][0];
1120                                        }
1121                                }
1122
1123                                // Emails não encontrados no ldap
1124                                array_shift($entry[0]['mailforwardingaddress']); //Retira o count do array
1125                                $missing_emails = array_diff($entry[0]['mailforwardingaddress'], $result['mailForwardingAddress']);
1126                               
1127                                // Incluimos estes no resultado
1128                                foreach ($missing_emails as $index=>$mailforwardingaddress)
1129                                {
1130                                        $result['mailForwardingAddress_info'][$mailforwardingaddress]['uid'] = $mailforwardingaddress;
1131                                        $result['mailForwardingAddress_info'][$mailforwardingaddress]['cn'] = 'E-Mail nao encontrado';
1132                                        $result['mailForwardingAddress'][] = $mailforwardingaddress;
1133                                }
1134                               
1135                                ldap_close($ldap_conn_following_ref);
1136                                return $result;
1137                        }
1138                }
1139        }       
1140
1141        function get_maillist_scl_info($uidnumber)
1142        {
1143                foreach ($this->manager_contexts as $index=>$context)
1144                {
1145                        $filter="(&(phpgwAccountType=l)(uidNumber=$uidnumber))";
1146                        $search = ldap_search($this->ldap, $context, $filter);
1147                        $entry = ldap_get_entries($this->ldap, $search);
1148
1149                        if ($entry['count'])
1150                        {
1151                                //Pega o dn do setor do usuario.
1152                                $entry[0]['dn'] = strtolower($entry[0]['dn']);
1153                                $sector_dn_array = explode(",", $entry[0]['dn']);
1154                                for($i=1; $i<count($sector_dn_array); $i++)
1155                                        $sector_dn .= $sector_dn_array[$i] . ',';
1156                                //Retira ultimo pipe.
1157                                $sector_dn = substr($sector_dn,0,(strlen($sector_dn) - 1));
1158               
1159                                $result['dn']                                           = $entry[0]['dn'];
1160                                $result['context']                                      = $sector_dn;
1161                                $result['uidnumber']                            = $entry[0]['uidnumber'][0];
1162                                $result['uid']                                          = $entry[0]['uid'][0];
1163                                $result['cn']                                           = $entry[0]['cn'][0];
1164                                $result['mail']                                         = $entry[0]['mail'][0];
1165                                $result['accountStatus']                        = $entry[0]['accountstatus'][0];
1166                                $result['phpgwAccountVisible']          = $entry[0]['phpgwaccountvisible'][0];
1167                                $result['accountRestrictive']           = $entry[0]['accountrestrictive'][0];
1168                                $result['participantCanSendMail']       = $entry[0]['participantcansendmail'][0];
1169               
1170                                //Senders
1171                                for ($i=0; $i<$entry[0]['mailsenderaddress']['count']; $i++)
1172                                {
1173                                        $justthese = array("cn", "uidnumber", "uid", "mail");
1174                                        $filter="(&(phpgwAccountType=u)(mail=".$entry[0]['mailsenderaddress'][$i]."))";
1175                                        $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1176                                        $user_entry = ldap_get_entries($this->ldap, $search);
1177                       
1178                                        $result['senders_info'][$user_entry[0]['mail'][0]]['uid'] = $user_entry[0]['uid'][0];
1179                                        $result['senders_info'][$user_entry[0]['mail'][0]]['cn'] = $user_entry[0]['cn'][0];
1180                                        $result['members'][] = $user_entry[0]['mail'][0];
1181                                }
1182                                return $result;
1183                        }
1184                }
1185        }       
1186
1187        function group_exist($gidnumber)
1188        {
1189                $justthese = array("cn");
1190                $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
1191                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1192                               
1193                $entry = ldap_get_entries($this->ldap, $search);
1194                if ($entry['count'] == 0)
1195                        return false;
1196                else
1197                        return true;
1198        }
1199
1200        function gidnumbers2cn($gidnumbers)
1201        {
1202                $result = array();
1203                if (count($gidnumbers))
1204                {
1205                        $justthese = array("cn");
1206                        $i = 0;
1207                        foreach ($gidnumbers as $gidnumber)
1208                        {
1209                                $filter="(&(phpgwAccountType=g)(gidNumber=".$gidnumber."))";
1210                                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1211                               
1212                                $entry = ldap_get_entries($this->ldap, $search);
1213                                if ($entry['count'] == 0)
1214                                        $result['groups_info'][$i]['cn'] = '_Grupo existe no BD mas não no LDAP';
1215                                else
1216                                        $result['groups_info'][$i]['cn'] = $entry[0]['cn'][0];
1217                                $result['groups_info'][$i]['gidnumber'] = $gidnumber;
1218                       
1219                                /* o gerente pode excluir um grupo de um usuario onde este grupo esta em outra OU ? */
1220                                /* é o mesmo que o manager editar um grupo de outra OU */
1221                                $result['groups_info'][$i]['group_disabled'] = 'true';
1222                                foreach ($this->manager_contexts as $index=>$context)
1223                                {
1224                                        if (strpos(strtolower($entry[0]['dn']), strtolower($context)))
1225                                        {
1226                                                $result['groups_info'][$i]['group_disabled'] = 'false';
1227                                        }
1228                                }
1229
1230                                $i++;
1231                        }
1232                }
1233                return $result;
1234        }
1235
1236        function uidnumber2uid($uidnumber)
1237        {
1238                $justthese = array("uid");
1239                $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uidNumber=".$uidnumber."))";
1240                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1241                $entry = ldap_get_entries($this->ldap, $search);
1242                return $entry[0]['uid'][0];
1243        }
1244
1245        function uidnumber2mail($uidnumber)
1246        {
1247                $justthese = array("mail");
1248                $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(uidNumber=".$uidnumber."))";
1249                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1250                $entry = ldap_get_entries($this->ldap, $search);
1251                return $entry[0]['mail'][0];
1252        }
1253
1254       
1255        function change_user_context($dn, $newrdn, $newparent)
1256        {
1257                if (!ldap_rename ( $this->ldap, $dn, $newrdn, $newparent, true ))
1258                {
1259                        $return['status'] = false;
1260                        $return['msg'] = 'Erro em ldap_funcitons->change_user_context: ' . ldap_error($this->ldap);
1261                }
1262                else
1263                        $return['status'] = true;
1264               
1265                return $return;
1266        }
1267       
1268        function replace_user_attributes($dn, $ldap_mod_replace)
1269        {
1270                if (!@ldap_mod_replace ( $this->ldap, $dn, $ldap_mod_replace ))
1271                {
1272                        $return['status'] = false;
1273                        $return['msg'] = 'Erro em ldap_funcitons->replace_user_attributes: ' . ldap_error($this->ldap);
1274                }
1275                else
1276                        $return['status'] = true;
1277               
1278                return $return;
1279        }
1280       
1281        function add_user_attributes($dn, $ldap_add)
1282        {
1283                if (!@ldap_mod_add ( $this->ldap, $dn, $ldap_add ))
1284                {
1285                        $return['status'] = false;
1286                        $return['msg'] = 'Erro em ldap_funcitons->add_user_attributes: ' . ldap_error($this->ldap);
1287                }
1288                else
1289                        $return['status'] = true;
1290               
1291                return $return;
1292        }
1293       
1294        function remove_user_attributes($dn, $ldap_remove)
1295        {
1296                if (!@ldap_mod_del ( $this->ldap, $dn, $ldap_remove ))
1297                {
1298                        $return['status'] = false;
1299                        $return['msg'] = 'Erro em ldap_funcitons->remove_user_attributes: ' . ldap_error($this->ldap);
1300                }
1301                else
1302                        $return['status'] = true;
1303               
1304                return $return;
1305        }
1306       
1307        function set_user_password($uid, $password)
1308        {
1309                $justthese = array("userPassword");
1310                $filter="(&(phpgwAccountType=u)(uid=".$uid."))";
1311                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1312            $entry = ldap_get_entries($this->ldap, $search);
1313                $dn = $entry[0]['dn'];
1314                $userPassword = $entry[0]['userpassword'][0];
1315                $ldap_mod_replace['userPassword'] = $password;
1316                $this->replace_user_attributes($dn, $ldap_mod_replace);
1317                return $userPassword;
1318        }
1319       
1320        function delete_user($user_info)
1321        {
1322                // Verifica acesso do gerente (OU) ao tentar deletar um usuário.
1323                $manager_access = false;
1324                foreach ($this->manager_contexts as $index=>$context)
1325                {
1326                        if ( (strpos(strtolower($user_info['context']), strtolower($context))) || (strtolower($user_info['context']) == strtolower($context)) )
1327                        {
1328                                $manager_access = true;
1329                                break;
1330                        }
1331                }
1332                if (!$manager_access)
1333                {
1334                        $return['status'] = false;
1335                        $return['msg'] .= 'Você não tem acesso para deletar este usuário.';
1336                        return $return;
1337                }
1338               
1339                $return['status'] = true;
1340               
1341                // GROUPS
1342                $attrs = array();
1343                $attrs['memberUid'] = $user_info['uid'];
1344                if (count($user_info['groups_info']))
1345                {
1346                        foreach ($user_info['groups_info'] as $group_info)
1347                        {
1348                                $gidnumber = $group_info['gidnumber'];
1349                                $justthese = array("dn");
1350                                $filter="(&(phpgwAccountType=g)(gidnumber=".$gidnumber."))";
1351                                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1352                        $entry = ldap_get_entries($this->ldap, $search);
1353                                $dn = $entry[0]['dn'];
1354                       
1355                                if (!@ldap_mod_del($this->ldap, $dn, $attrs))
1356                                {
1357                                        $return['status'] = false;
1358                                        $return['msg'] .= 'Erro em ldap_funcitons->delete_user, grupos: ' . ldap_error($this->ldap);
1359                                }
1360                        }
1361                }
1362                       
1363                // MAILLISTS
1364                $attrs = array();
1365                $attrs['mailForwardingAddress'] = $user_info['mail'];
1366               
1367                if (count($user_info['maillists_info']))
1368                {
1369                       
1370                        if ( !$ldapMasterConnect = $this->ldapMasterConnect() )
1371                        {
1372                                $return['status'] = false;
1373                                $return['msg'] .= 'Erro ao conectar ao ldap_master: ' . ldap_error($this->ldap);
1374                                return $return;
1375                        }
1376                       
1377                        foreach ($user_info['maillists_info'] as $maillists_info)
1378                        {
1379                                $uid = $maillists_info['uid'];
1380                                $justthese = array("dn");
1381                                $filter="(&(phpgwAccountType=l)(uid=".$uid."))";
1382                                $search = ldap_search($ldapMasterConnect, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1383                        $entry = ldap_get_entries($ldapMasterConnect, $search);
1384                                $dn = $entry[0]['dn'];
1385                       
1386                                if (!@ldap_mod_del($ldapMasterConnect, $dn, $attrs))
1387                                {
1388                                        $return['status'] = false;
1389                                        $return['msg'] .= 'Erro em ldap_funcitons->delete_user, listas de email: ' . ldap_error($this->ldap);
1390                                }
1391                        }
1392                        ldap_close($ldapMasterConnect);
1393                }
1394                       
1395                // UID
1396                $dn = "uid=" . $user_info['uid'] . "," . $user_info['context'];
1397                if (!@ldap_delete($this->ldap, $dn))
1398                {
1399                        $return['status'] = false;
1400                        $return['msg'] .= 'Erro em ldap_funcitons->delete_user, listas de email: ' . ldap_error($this->ldap);
1401                }
1402               
1403                return $return;
1404        }
1405       
1406        function delete_maillist($uidnumber, $mail)
1407        {
1408                $return['status'] = true;
1409               
1410                $justthese = array("dn");
1411               
1412                // remove listas dentro de listas
1413                $filter="(&(phpgwAccountType=l)(mailForwardingAddress=".$mail."))";
1414                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1415                $entry = ldap_get_entries($this->ldap, $search);
1416                $attrs['mailForwardingAddress'] = $mail;
1417                for ($i=0; $i<=$entry['count']; $i++)
1418            {
1419                        $dn = $entry[$i]['dn'];
1420                @ldap_mod_del ( $this->ldap, $dn,  $attrs);
1421            }
1422               
1423                $filter="(&(phpgwAccountType=l)(uidnumber=".$uidnumber."))";
1424                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1425                $entry = ldap_get_entries($this->ldap, $search);
1426                $dn = $entry[0]['dn'];
1427               
1428                if (!@ldap_delete($this->ldap, $dn))
1429                {
1430                        $return['status'] = false;
1431                        $return['msg'] .= 'Erro em ldap_funcitons->delete_maillist, listas de email: ' . ldap_error($this->ldap);
1432                }
1433               
1434                return $return;
1435        }
1436
1437        function delete_group($gidnumber)
1438        {
1439                $return['status'] = true;
1440               
1441                $justthese = array("dn");
1442                $filter="(&(phpgwAccountType=g)(gidnumber=".$gidnumber."))";
1443                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1444                $entry = ldap_get_entries($this->ldap, $search);
1445                $dn = $entry[0]['dn'];
1446               
1447                if (!@ldap_delete($this->ldap, $dn))
1448                {
1449                        $return['status'] = false;
1450                        $return['msg'] .= 'Erro em ldap_funcitons->delete_maillist, listas de email: ' . ldap_error($this->ldap);
1451                }
1452               
1453                return $return;
1454        }
1455
1456        function check_access_to_renamed($uid)
1457        {
1458                $justthese = array("dn");
1459                $filter="(&(phpgwAccountType=u)(uid=$uid))";
1460               
1461                foreach ($this->manager_contexts as $index=>$context)
1462                {
1463                        $search = ldap_search($this->ldap, $context, $filter, $justthese);
1464                        $entry = ldap_get_entries($this->ldap, $search);
1465                        if ($entry['count'])
1466                                return true;
1467                }
1468            return false;
1469        }
1470       
1471        function rename_uid($uid, $new_uid)
1472        {
1473                $return['status'] = true;
1474               
1475                $justthese = array("dn");
1476                $filter="(&(phpgwAccountType=u)(uid=".$uid."))";
1477                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1478            $entry = ldap_get_entries($this->ldap, $search);
1479                $dn = $entry[0]['dn'];
1480               
1481                $explode_dn = ldap_explode_dn($dn, 0);
1482                $rdn = "uid=" . $new_uid;
1483
1484                $parent = array();
1485                for ($j=1; $j<(count($explode_dn)-1); $j++)
1486                        $parent[] = $explode_dn[$j];
1487                $parent = implode(",", $parent);
1488               
1489                $return['new_dn'] = $rdn . ',' . $parent;
1490                       
1491                if (!@ldap_rename($this->ldap, $dn, $rdn, $parent, false))
1492                {
1493                        $return['status'] = false;
1494                        $return['msg'] .= 'Erro em ldap_funcitons->rename_uid: ' . ldap_error($this->ldap);
1495                }
1496               
1497                //Grupos
1498                $justthese = array("dn");
1499                $filter="(&(phpgwAccountType=g)(memberuid=".$uid."))";
1500                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1501            $entry = ldap_get_entries($this->ldap, $search);
1502        $array_mod_add['memberUid'] = $new_uid;
1503        $array_mod_del['memberUid'] = $uid;
1504
1505            for ($i=0; $i<=$entry['count']; $i++)
1506            {
1507                $dn = $entry[$i]['dn'];
1508                @ldap_mod_add ( $this->ldap, $dn,  $array_mod_add);
1509                @ldap_mod_del ( $this->ldap, $dn,  $array_mod_del);
1510            }
1511                return $return;
1512        }
1513
1514        function rename_cn($cn, $new_cn)
1515        {
1516                $return['status'] = true;
1517               
1518                $justthese = array("dn");
1519                $filter="(&(phpgwAccountType=g)(uid=".$cn."))";
1520                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter, $justthese);
1521            $entry = ldap_get_entries($this->ldap, $search);
1522                $dn = $entry[0]['dn'];
1523               
1524                $explode_dn = ldap_explode_dn($dn, 0);
1525                $rdn = "cn=" . $new_cn;
1526
1527                $parent = array();
1528                for ($j=1; $j<(count($explode_dn)-1); $j++)
1529                        $parent[] = $explode_dn[$j];
1530                $parent = implode(",", $parent);
1531               
1532                $return['new_dn'] = $rdn . ',' . $parent;
1533                       
1534                if (!@ldap_rename($this->ldap, $dn, $rdn, $parent, false))
1535                {
1536                        $return['status'] = false;
1537                }
1538               
1539                return $return;
1540        }
1541       
1542        function exist_sambadomains($contexts, $sambaDomainName)
1543        {
1544                $justthese = array("dn");
1545                $filter="(&(objectClass=sambaDomain)(sambaDomainName=$sambaDomainName))";
1546               
1547                foreach ($contexts as $index=>$context)
1548                {
1549                        $search = ldap_search($this->ldap, $context, $filter, $justthese);
1550                    $entry = ldap_get_entries($this->ldap, $search);
1551           
1552                        if ($entry['count'])
1553                                return true;
1554                }
1555                return false;
1556        }
1557       
1558        // Primeiro nilvel de organização.
1559        function exist_sambadomains_in_context($params)
1560        {
1561                $dn = $GLOBALS['phpgw_info']['server']['ldap_context'];
1562                $array_dn = ldap_explode_dn ( $dn, 0 );
1563               
1564                $context = $params['context'];
1565                $array_context = ldap_explode_dn ( $context, 0 );
1566               
1567                // Pego o setor no caso do contexto ser um sub-setor.
1568                if (($array_dn['count']+1) < ($array_context['count']))
1569                {
1570                        // inverto o array_dn para poder retirar o count
1571                        $array_dn_reverse  = array_reverse ( $array_dn, false );
1572                       
1573                        //retiro o count
1574                        array_pop($array_dn_reverse);
1575                       
1576                        //incluo o setor no dn
1577                        array_push ( $array_dn_reverse,  $array_context[ $array_context['count'] - 1 - $array_dn['count']]);
1578                       
1579                        // Volto a ordem natural
1580                        $array_dn  = array_reverse ( $array_dn_reverse, false );
1581                       
1582                        // Implodo
1583                        $context = implode ( ",", $array_dn );
1584                }
1585               
1586                $justthese = array("dn","sambaDomainName");
1587                $filter="(objectClass=sambaDomain)";
1588                $search = ldap_list($this->ldap, $context, $filter, $justthese);
1589            $entry = ldap_get_entries($this->ldap, $search);
1590           
1591            for ($i=0; $i<$entry['count']; $i++)
1592            {
1593                        $return['sambaDomains'][$i] = $entry[$i]['sambadomainname'][0];
1594            }
1595           
1596                if ($entry['count'])
1597                        $return['status'] = true;
1598                else
1599                        $return['status'] = false;
1600                       
1601                return $return;
1602        }
1603       
1604        function add_sambadomain($sambadomainname, $sambasid, $context)
1605        {
1606                $result = array();
1607               
1608                $dn                                                             = "sambaDomainName=$sambadomainname,$context";
1609                $entry['sambaSID']                                      = $sambasid;
1610                $entry['objectClass']                           = 'sambaDomain';
1611                $entry['sambaAlgorithmicRidBase']       = '1000';
1612                $entry['sambaDomainName']                       = $sambadomainname;
1613               
1614                if (!@ldap_add ( $this->ldap, $dn, $entry ))
1615                {
1616                        $return['status'] = false;
1617                        $return['msg'] = "Erro na funcao ldap_functions->add_sambadomain ($dn).\nRetorno do servidor: " . ldap_error($this->ldap);
1618                }
1619                else
1620                        $return['status'] = true;
1621               
1622                return $return;
1623        }
1624       
1625        function delete_sambadomain($sambadomainname)
1626        {
1627                $return['status'] = true;
1628                $filter="(sambaDomainName=$sambadomainname)";
1629                $search = ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], $filter);
1630            $entry = ldap_get_entries($this->ldap, $search);
1631         
1632                if ($entry['count'] != 0)
1633            {
1634                        $dn = $entry[0]['dn'];
1635                       
1636                        if (!@ldap_delete($this->ldap, $dn))
1637                        {
1638                                $return['status'] = false;
1639                                $return['msg'] .= "Erro em ldap_funcitons->delete_sambadomain ($sambadomainname).\nRetorno do servidor: " . ldap_error($this->ldap);
1640                        }
1641            }
1642           
1643                return $return;
1644        }
1645       
1646        function search_user($params)
1647        {
1648                $search = $params['search'];
1649                $justthese = array("cn","uid", "mail");
1650        $users_list=ldap_search($this->ldap, $GLOBALS['phpgw_info']['server']['ldap_context'], "(&(phpgwAccountType=u) (|(cn=*$search*)(mail=$search*)) )", $justthese);
1651       
1652        if (ldap_count_entries($this->ldap, $users_list) == 0)
1653        {
1654                $return['status'] = 'false';
1655                $return['msg'] = 'Nenhum resultado encontrado.';
1656                return $return;
1657        }
1658       
1659        ldap_sort($this->ldap, $users_list, "cn");
1660       
1661        $entries = ldap_get_entries($this->ldap, $users_list);
1662               
1663                $options = '';
1664                for ($i=0; $i<$entries['count']; $i++)
1665                {
1666                        $options .= "<option value=" . $entries[$i]['uid'][0] . ">" . $entries[$i]['cn'][0] . " (".$entries[$i]['mail'][0].")" . "</option>";
1667                }
1668       
1669        return $options;               
1670        }
1671       
1672       
1673}
1674?>
Note: See TracBrowser for help on using the repository browser.