source: trunk/expressoMail1_2/inc/class.ldap_functions.inc.php @ 320

Revision 320, 18.0 KB checked in by niltonneto, 16 years ago (diff)

Versionamento 1.222
Ver changelog de alterações no Trac.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php                   
2include_once("class.imap_functions.inc.php");
3
4function ldapRebind($ldap_connection, $ldap_url)
5{
6        @ldap_bind($ldap_connection, $_SESSION['phpgw_info']['expressomail']['ldap_server']['acc'],$_SESSION['phpgw_info']['expressomail']['ldap_server']['pw']);
7}
8                       
9class ldap_functions
10{
11        var $ds;
12        var $ldap_host;
13        var $ldap_context;
14        var $imap;
15       
16        // usa o host e context do contact center.
17        function ldapConnect($refer = false){
18                $this->ldap_host        = $_SESSION['phpgw_info']['expressomail']['ldap_server']['host'];
19                $this->ldap_context = $_SESSION['phpgw_info']['expressomail']['ldap_server']['dn'];
20                $this->ds                       = ldap_connect($this->ldap_host);
21                ldap_set_option($this->ds, LDAP_OPT_PROTOCOL_VERSION, 3);
22                ldap_set_option($this->ds, LDAP_OPT_REFERRALS, $refer);
23                if ($refer)
24                {
25                        ldap_set_rebind_proc($this->ds, ldapRebind);
26                }
27                @ldap_bind($this->ds, $_SESSION['phpgw_info']['expressomail']['ldap_server']['acc'],$_SESSION['phpgw_info']['expressomail']['ldap_server']['pw']);                             
28        }
29
30        //Teste jakjr retornando o DS
31        function ldapConnect2($refer = false){
32                $ds = ldap_connect($_SESSION['phpgw_info']['expressomail']['ldap_server']['host']);
33               
34                if (!$ds)
35                        return false;
36               
37                ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
38                ldap_set_option($ds, LDAP_OPT_REFERRALS, $refer);
39                if ($refer)
40                        ldap_set_rebind_proc($ds, ldapRebind);
41                @ldap_bind($ds, $_SESSION['phpgw_info']['expressomail']['ldap_server']['acc'],$_SESSION['phpgw_info']['expressomail']['ldap_server']['pw']);
42               
43                return $ds;                             
44        }
45
46
47        // usa o host e context do setup.
48        function ldapRootConnect($refer = false){
49                $this->ldap_host        = $_SESSION['phpgw_info']['expressomail']['server']['ldap_host'];
50                $this->ldap_context = $_SESSION['phpgw_info']['expressomail']['server']['ldap_context'];
51                $this->ds                       = ldap_connect($this->ldap_host);
52                ldap_set_option($this->ds, LDAP_OPT_PROTOCOL_VERSION, 3);
53                ldap_set_option($this->ds, LDAP_OPT_REFERRALS, $refer);
54                ldap_bind($this->ds, $_SESSION['phpgw_info']['expressomail']['server']['ldap_root_dn'],$_SESSION['phpgw_info']['expressomail']['server']['ldap_root_pw']);                             
55
56        }
57
58        function quicksearch($params)
59        {       
60                include_once("class.functions.inc.php");
61                $functions = new functions;                                             
62
63                $search_for     = $params['search_for'];
64                $field          = $params['field'];
65                $ID                     = $params['ID'];
66               
67                $contacts_result = array();
68                $contacts_result['field'] = $field;
69                $contacts_result['ID'] = $ID;
70               
71                // follow the referral
72                $this->ldapConnect(true);
73               
74                if ($this->ds)
75                {
76                        if (($field != 'null') && ($ID != 'null'))
77                        {
78                                $filter="(& (|(phpgwAccountType=u)(phpgwAccountType=l)) (|(cn=*$search_for*)(mail=$search_for*)) (!(phpgwaccountvisible=-1)) )";
79                                $justthese = array("cn", "mail", "telephoneNumber", "mobile", "phpgwAccountVisible", "uid");
80                        }
81                        else
82                        {
83                                $filter="(& (phpgwAccountType=u)(cn=*$search_for*) (!(phpgwaccountvisible=-1)) )";
84                                $justthese = array("cn", "mail", "telephoneNumber", "mobile", "phpgwAccountVisible", "jpegPhoto", "uid");
85                        }
86                       
87                        $sr=ldap_search($this->ds, $this->ldap_context, $filter, $justthese);
88                        $count_entries = ldap_count_entries($this->ds,$sr);
89
90                        // Get user org dn.                     
91                        $user_dn = $_SESSION['phpgw_info']['expressomail']['user']['account_dn'];
92                        $user_sector_dn = ldap_explode_dn ( $user_dn, false );
93                        array_shift($user_sector_dn);
94                        array_shift($user_sector_dn);
95                        $user_sector_dn = implode(",", $user_sector_dn);
96                       
97                        // New search only on user sector
98                        if ($count_entries > 200)
99                        {
100                                // Close old ldap conection
101                                ldap_close($this->ds);
102                               
103                                // Reopen a local ldap connection, following referral
104                                $this->ldapRootConnect(true);
105                               
106                                $sr=ldap_search($this->ds, $user_sector_dn, $filter, $justthese);
107                                $count_entries = ldap_count_entries($this->ds,$sr);
108                               
109                                if ($count_entries > 200){
110                                        $return = array();
111                                        $return['status'] = false;
112                                        $return['error'] = "many results";
113                                        return $return;
114                                }
115                                else
116                                {
117                                        $quickSearch_only_in_userSector = true;
118                                }
119                        }
120                       
121                        $info = ldap_get_entries($this->ds, $sr);
122                       
123                        $tmp = array();
124                        $tmp_users_from_user_org = array();
125                        for ($i=0; $i<$info["count"]; $i++)
126                        {
127                                // Usuario sempre serao da minha org.
128                                if ($quickSearch_only_in_userSector)
129                                {
130                                        $tmp[$info[$i]["mail"][0] . '%' . $info[$i]["telephonenumber"][0] . '%'. $info[$i]["mobile"][0] . '%' . $info[$i]["uid"][0] . '%' . $info[$i]["jpegphoto"]['count']] = $info[$i]["cn"][0];
131                                }
132                                else
133                                {
134                                        if (preg_match("/$user_sector_dn/i", $info[$i]['dn']))
135                                        {
136                                                $tmp_users_from_user_org[$info[$i]["mail"][0] . '%' . $info[$i]["telephonenumber"][0] . '%'. $info[$i]["mobile"][0] . '%' . $info[$i]["uid"][0] . '%' . $info[$i]["jpegphoto"]['count']] = $info[$i]["cn"][0];
137                                        }
138                                        else
139                                        {
140                                                $tmp[$info[$i]["mail"][0] . '%' . $info[$i]["telephonenumber"][0] . '%'. $info[$i]["mobile"][0] . '%' . $info[$i]["uid"][0] . '%' . $info[$i]["jpegphoto"]['count']] = $info[$i]["cn"][0];
141                                        }
142                                }
143                        }
144                        natcasesort($tmp_users_from_user_org);
145                        natcasesort($tmp);
146                       
147                        if (($field != 'null') && ($ID != 'null'))
148                        {
149                                $i = 0;
150                               
151                                $tmp = array_merge($tmp, $tmp_users_from_user_org);
152                                natcasesort($tmp);
153                               
154                                foreach ($tmp as $info => $cn)
155                                {
156                                        $contacts_result[$i] = array();
157                                        $contacts_result[$i]["cn"] = $cn;
158                                        list ($contacts_result[$i]["mail"], $contacts_result[$i]["phone"], $contacts_result[$i]["mobile"]) = split ('%', $info);
159                                        $i++;
160                                }
161                                $contacts_result['quickSearch_only_in_userSector'] = $quickSearch_only_in_userSector;
162                        }
163                        else
164                        {
165                                $options_users_from_user_org = '';
166                                $options = '';
167
168                                /* List of users from user org */
169                                $i = 0;
170                                foreach ($tmp_users_from_user_org as $info => $cn)
171                                {
172                                        $contacts_result[$i] = array();
173                                        $options_users_from_user_org .= $this->make_quicksearch_card($info, $cn);
174                                        $i++;
175                                }
176
177                                /* List of users from others org */
178                                foreach ($tmp as $info => $cn)
179                                {
180                                        $contacts_result[$i] = array();
181                                        $options .= $this->make_quicksearch_card($info, $cn);
182                                        $i++;
183                                }
184                               
185                                if ($quickSearch_only_in_userSector)
186                                {
187                                        if ($options != '')
188                                        {
189                                                $head_option =
190                                                        '<tr class="quicksearchcontacts_unselected">' .
191                                                                '<td colspan="2" width="100%" align="center">' .
192                                                                        $functions->getLang('More than 200 results were found') . '.<br>' .
193                                                                        $functions->getLang('Showing only the results found in your organization') . '.';
194                                                                '</td>' .
195                                                        '</tr>';
196                                                $contacts_result = $head_option . $options_users_from_user_org . $options;
197                                        }
198                                        else
199                                        {
200                                                $return = array();
201                                                $return['status'] = false;
202                                                $return['error'] = "many results";
203                                                return $return;
204                                        }
205                                }
206                                else
207                                {
208                                        if (($options_users_from_user_org != '') && ($options != ''))
209                                        {
210                                                $head_option0 =
211                                                        '<tr class="quicksearchcontacts_unselected">' .
212                                                                '<td colspan="2" width="100%" align="center" style="background:#EEEEEE"><B>' .
213                                                                        $functions->getLang('Users from your organization') . '.';
214                                                                '</B></td>' .
215                                                        '</tr>';
216
217                                                $head_option1 =
218                                                        '<tr class="quicksearchcontacts_unselected">' .
219                                                                '<td colspan="2" width="100%" align="center" style="background:#EEEEEE"><B>' .
220                                                                        $functions->getLang('Users from others organizations') . '.';
221                                                                '</B></td>' .
222                                                        '</tr>';
223                                        }
224                                        $contacts_result = $head_option0 . $options_users_from_user_org . $head_option1 . $options;
225                                }
226                        }
227                }
228                ldap_close($this->ds);
229                return $contacts_result;
230        }
231
232        function make_quicksearch_card($info, $cn)
233        {
234                include_once("class.functions.inc.php");
235                $functions = new functions;                                             
236               
237                $contacts_result = array();
238                $contacts_result["cn"] = $cn;
239                list ($contacts_result["mail"], $contacts_result["phone"], $contacts_result["mobile"], $contacts_result["uid"], $contacts_result["jpegphoto"]) = split ('%', $info);
240                                       
241                if ($contacts_result['jpegphoto'])
242                        $photo_link = '<img src="./inc/show_user_photo.php?mail='.$contacts_result['mail'].'">';
243                else
244                        $photo_link = '<img src="./templates/default/images/photo.png">';
245                                       
246                $phoneUser = $contacts_result['phone'];
247                                       
248                if($_SESSION['phpgw_info']['user']['preferences']['expressoMail']['voip_enabled'] && $phoneUser) {
249                        $phoneUser = '<a title="'.$functions->getLang("Call to Comercial Number").'" href="#" onclick="InfoContact.connectVoip(\''.$phoneUser.'\',\'com\')">'.$phoneUser.'</a>';
250                        if($contacts_result['mobile']){
251                                $phoneUser .= ' / <a title="'.$functions->getLang("Call to Mobile Number").'" href="#" onclick="InfoContact.connectVoip(\''.$contacts_result['mobile'].'\',\'mob\')">'.$contacts_result['mobile'].'</a>';
252                        }
253                }
254                $option =
255                        '<tr class="quicksearchcontacts_unselected">' .
256                                '<td class="cc" width="1%">' .
257                                        '<a title="'.$functions->getLang("Write message").'" onClick="javascript:QuickSearchUser.create_new_message(\''.$contacts_result["cn"].'\', \''.$contacts_result["mail"].'\')">' .
258                                                $photo_link .
259                                        '</a>' .
260                                '</td>' .
261                                '<td class="cc">' .
262                                        '<span name="cn">' . $contacts_result['cn'] . '</span>' . '<br>' .
263                                        '<a title="'.$functions->getLang("Write message").'" onClick="javascript:QuickSearchUser.create_new_message(\''.$contacts_result["cn"].'\', \''.$contacts_result["mail"].'\')">' .
264                                                '<font color=blue>' .
265                                                        '<span name="mail">' . $contacts_result['mail'] . '</span>' . '<br>' .
266                                                '</font>' .
267                                        '</a>' .
268                                        $phoneUser .
269                                '</td>' .
270                        '</tr>';
271                return $option;
272        }
273
274        function get_organizations($params){
275                $organizations = array();
276                $referral = $params['referral'];
277                $this->ldapConnect($referral);
278                if ($this->ds) {
279                        $filter="ou=*";         
280                        $justthese = array("ou");
281                        $sr = ldap_list($this->ds, $this->ldap_context, $filter, $justthese);
282                        $info = ldap_get_entries($this->ds, $sr);
283                       
284                        for ($i=0; $i<$info["count"]; $i++)
285                                $organizations[$i] = $info[$i]["ou"][0];
286
287                        ldap_close($this->ds);
288                        sort($organizations);                                   
289                }
290                return $organizations;
291        }
292
293        function get_organizations2($params){
294                $organizations = array();
295                $referral = $params['referral'];
296                $this->ldapRootConnect($referral);
297                if ($this->ds) {
298                        $filter="ou=*";         
299                        $justthese = array("ou");
300                        $sr = ldap_list($this->ds, $this->ldap_context, $filter, $justthese);
301                        $info = ldap_get_entries($this->ds, $sr);
302                       
303                        for ($i=0; $i<$info["count"]; $i++)
304                        {
305                                $organizations[$i]['ou'] = $info[$i]["ou"][0];
306                                $organizations[$i]['dn'] = $info[$i]["dn"];
307                        }
308                       
309                        ldap_close($this->ds);
310                        sort($organizations);                                   
311                }
312                return $organizations;
313        }
314
315        function catalogsearch($params)
316        {       
317                $this->ldapConnect(true);
318                $cn     = $params['search_for'] ? "*".$params['search_for']."*" : "*";
319                $user_context = "ou=".$params['organization'].",".$this->ldap_context;         
320                $max_result       = $params['max_result'] ? $params['max_result'] : '200';             
321                $error = False;
322               
323                if ($this->ds) {                                                                                       
324                        $justthese = array("cn", "mail", "phpgwaccounttype", "phpgwAccountVisible");
325                        $filter="(&(|(phpgwAccountType=u)(phpgwAccountType=l))(cn=".$cn."))";
326                        $sr=ldap_search($this->ds, $user_context, $filter, $justthese);
327                       
328                        $count_entries = ldap_count_entries($this->ds,$sr);
329                        if ($count_entries > $max_result){
330                                $info = null;
331                                $error = True;                                         
332                        }
333                        else
334                                $info = ldap_get_entries($this->ds, $sr);               
335                       
336                        ldap_close($this->ds);                 
337                       
338                        $u_tmp = array();
339                        $g_tmp = array();
340                       
341                        for ($i=0; $i<$info["count"]; $i++){
342                                if ($info[$i]["phpgwaccountvisible"][0] == '-1')
343                                        continue;
344                                if((strtoupper($info[$i]["phpgwaccounttype"][0]) == 'U') && ($info[$i]["phpgwaccountvisible"][0] != '-1'))
345                                        $u_tmp[$info[$i]["mail"][0]] = $info[$i]["cn"][0];
346                                else
347                                        $g_tmp[$info[$i]["mail"][0]] = $info[$i]["cn"][0];
348                        }                                                                               
349                       
350                        natcasesort($u_tmp);
351                        natcasesort($g_tmp);
352                       
353                        $i = 0;
354                        $users = array();                       
355                       
356                        foreach ($u_tmp as $mail => $cn){                               
357                                $users[$i++] = array("name" => $cn, "email" => $mail);
358                        }
359                        unset($u_tmp);
360                       
361                        $i = 0;                 
362                        $groups = array();
363                       
364                        foreach ($g_tmp as $mail => $cn){                               
365                                $groups[$i++] = array("name" => $cn, "email" => $mail);
366                        }
367                        unset($g_tmp);
368                       
369                        return  array('users' => $users, 'groups' => $groups, 'error' => $error);
370                }                               
371                return null;
372        }
373       
374        function get_emails_ldap(){
375
376                $result['mail']= array();
377                $result['mailalter']= array();         
378                $user = $_SESSION['phpgw_info']['expressomail']['user']['account_lid'];
379                $this->ldapRootConnect(false);
380                if ($this->ds) {
381                        $filter="uid=".$user;           
382                        $justthese = array("mail","mailAlternateAddress");
383                        $sr = ldap_search($this->ds,$this->ldap_context, $filter, $justthese);
384                        $ent = ldap_get_entries($this->ds, $sr);
385                        ldap_close($this->ds);
386                       
387                        for ($i=0; $i<$ent["count"]; $i++){
388                                $result['mail'][] = $ent[$i]["mail"][0];
389                                $result['mailalter'][] = $ent[$i]["mailalternateaddress"][0];                           
390                        }
391                }
392                return $result;
393        }
394       
395        //Busca usuários de um contexto e já retorna as options do select;
396        function get_available_users($params)
397    {
398        $this->ldapRootConnect();
399        //Monta lista de Grupos e Usuários
400        $users = Array();
401        $groups = Array();
402        $user_context= $params['context'];
403        $owner = $_SESSION['phpgw_info']['expressomail']['user']['owner'];
404
405        if ($this->ds)
406        {
407            $justthese = array("gidNumber","cn");
408            if ($params['type'] == 'search')
409                $sr=ldap_search($this->ds, $user_context, ("(&(cn=*)(phpgwaccounttype=g)(!(phpgwaccountvisible=-1)))"),$justthese);
410            else
411                $sr=ldap_list($this->ds, $user_context, ("(&(cn=*)(phpgwaccounttype=g)(!(phpgwaccountvisible=-1)))"),$justthese);
412            $info = ldap_get_entries($this->ds, $sr);
413            for ($i=0; $i<$info["count"]; $i++)
414                $groups[$uids=$info[$i]["gidnumber"][0]] = Array('name'    =>    $uids=$info[$i]["cn"][0], 'type'    =>    g);           
415            $justthese = array("phpgwaccountvisible","uidNumber","cn");
416            if ($params['type'] == 'search')
417                $sr=ldap_search($this->ds, $user_context, ("(&(cn=*)(phpgwaccounttype=u)(!(phpgwaccountvisible=-1)))"),$justthese);
418            else
419                $sr=ldap_list($this->ds, $user_context, ("(&(cn=*)(phpgwaccounttype=u)(!(phpgwaccountvisible=-1)))"),$justthese);
420
421            $info = ldap_get_entries($this->ds, $sr);
422            for ($i=0; $i<$info["count"]; $i++)
423            {
424                if ($info[$i]["phpgwaccountvisible"][0] == '-1')
425                    continue;
426                $users[$uids=$info[$i]["uidnumber"][0]] = Array('name'    =>    $uids=$info[$i]["cn"][0], 'type'    =>    u);
427            }
428        }
429        ldap_close($this->ds);
430           
431        @asort($users);
432        @reset($users);   
433        @asort($groups);
434        @reset($groups);
435        $user_options ='';
436        $group_options ='';
437
438        foreach($groups as $id => $user_array) {
439                $newId = $id.'U';
440                $group_options .= '<option  value="'.$newId.'">'.utf8_decode($user_array['name']).'</option>'."\n";
441        }
442        foreach($users as $id => $user_array) {
443            if($owner != $id){
444                $newId = $id.'U';
445                $user_options .= '<option  value="'.$newId.'">'.utf8_decode($user_array['name']).'</option>'."\n";
446            }
447        }
448        return array("users" => $user_options, "groups" => $group_options);
449    }
450
451        //Busca usuários de um contexto e já retorna as options do select;
452        function get_available_users2($params)
453        {
454                $this->ldapRootConnect();
455               
456                $context= $params['context'];
457                $justthese = array("cn", "uid", "cn");
458                $filter = "(&(phpgwaccounttype=u)(!(phpgwaccountvisible=-1)))";
459
460            if ($this->ds)
461            {
462                        $sr=ldap_search($this->ds, $context, $filter, $justthese);
463                        $entries = ldap_get_entries($this->ds, $sr);
464                       
465                        for ($i=0; $i<$entries["count"]; $i++){
466                                if($_SESSION['phpgw_info']['expressomail']['user']['account_lid'] != $entries[$i]["uid"][0]){
467                                        $u_tmp[$entries[$i]["uid"][0]] = $entries[$i]["cn"][0];
468                                }
469                        }
470                       
471                        natcasesort($u_tmp);
472
473                        $i = 0;
474                        $users = array();
475                       
476                        if (count($u_tmp))
477                        {
478                                foreach ($u_tmp as $uidnumber => $cn)
479                                {
480                                        $options .= "<option value=$uidnumber>$cn</option>";
481                                }
482                                unset($u_tmp);
483                        }
484
485                        ldap_close($this->ds);
486                return $options;
487                }
488        }
489       
490        function uid2cn($uid)
491        {       
492                // do not follow the referral
493                $this->ldapRootConnect(false);
494                if ($this->ds)
495                {
496                        $filter="(&(phpgwAccountType=u)(uid=$uid))";           
497                        $justthese = array("cn");
498                        $sr=ldap_search($this->ds, $this->ldap_context, $filter, $justthese);
499                       
500                        $info = ldap_get_entries($this->ds, $sr);
501                        return $info[0]["cn"][0];
502                }
503                return false;
504        }
505        function getSharedUsersFrom($params){           
506                $uids = explode(";",$params['uids']);
507
508                $this->imap = new imap_functions();
509                $filter = '';
510
511                foreach($uids as $index => $uid){
512                        $params = array();             
513                        $acl = $this->imap->getacltouser($uid);
514                        if(preg_match("/a/",$acl))
515                                $filter .= "(uid=$uid)";
516                }
517
518                $this->ldapRootConnect(false);
519                $filter="(&(phpgwAccountType=u)(|$filter))";
520                if ($this->ds) {                                       
521                        $justthese = array("cn","mail");
522                        $sr             =       ldap_search($this->ds, $this->ldap_context, $filter, $justthese);
523                        ldap_sort($this->ds,$sr,"cn");                 
524                        $info   =       ldap_get_entries($this->ds, $sr);
525                        $info['myname'] = $_SESSION['phpgw_info']['expressomail']['user']['fullname'];                                         
526                        return $info;
527                }
528        }
529
530        function getUserByEmail($params)
531        {
532                $filter="(&(phpgwAccountType=u)(mail=" . $params['email'] . "))";
533                $ldap_context = $_SESSION['phpgw_info']['expressomail']['ldap_server']['dn'];
534                $justthese = array("cn","uid","telephoneNumber","jpegPhoto","mobile");
535
536                // Follow the referral
537                $ds = $this->ldapConnect2(true);
538                if ($ds)
539                {                       
540                        $sr=ldap_search($ds, $ldap_context, $filter, $justthese);
541                       
542                        if (!$sr)
543                                return null;
544                       
545                        $entry = ldap_first_entry($ds, $sr);
546                       
547                        if($entry) {                                           
548                                $obj =  array("cn" => ldap_get_values($ds, $entry, "cn"),
549                                                  "email" => $params['email'],
550                                                  "uid" => ldap_get_values($ds, $entry, "uid"),
551                                                  "type" => "global",
552                                                  "mobile" =>  @ldap_get_values($ds, $entry, "mobile"),
553                                                  "telefone" =>  @ldap_get_values($ds, $entry, "telephonenumber")
554                                        );
555
556                                $_SESSION['phpgw_info']['expressomail']['contact_photo'] = @ldap_get_values_len($ds, $entry, "jpegphoto");
557                                ldap_close($ds);
558                                return $obj;
559                        }
560                }
561                return null;
562        }
563}
564?>
Note: See TracBrowser for help on using the repository browser.