source: trunk/contactcenter/inc/class.bo_global_ldap_catalog.inc.php @ 880

Revision 880, 35.4 KB checked in by niltonneto, 15 years ago (diff)

Ticket #480 - Inclusão dos grupos LDAP na busca do Catálogo Geral.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2  /***************************************************************************\
3  * eGroupWare - Contacts Center                                              *
4  * http://www.egroupware.org                                                 *
5  * Written by:                                                               *
6  *  - Raphael Derosso Pereira <raphaelpereira@users.sourceforge.net>         *
7  * ------------------------------------------------------------------------- *
8  *  This program is free software; you can redistribute it and/or modify it  *
9  *  under the terms of the GNU General Public License as published by the    *
10  *  Free Software Foundation; either version 2 of the License, or (at your   *
11  *  option) any later version.                                               *
12  \***************************************************************************/
13
14        /*
15                This class is responsible for manipulating the Global LDAP Contact Manager
16        */
17        include_once('class.abo_catalog.inc.php');
18       
19        class bo_global_ldap_catalog extends abo_catalog
20        {
21                var $ldap;
22       
23                var $src_info;
24               
25                var $trans_table;
26                // used to determine if a catalog is external
27                var $external;
28                var $fields = array(
29                        'id_contact'    => true,
30                        'status'        => true,
31                        'photo'         => true,
32                        'alias'         => true,
33                        'prefix'        => true,
34                        'given_names'   => true,
35                        'family_names'  => true,
36                        'account_type'  => true,
37                        'names_ordered' => true,
38                        'suffix'        => true,
39                        'birthdate'     => true,
40                        'sex'           => true,
41                        'pgp_key'       => true,
42                        'notes'         => true,
43                       
44                        /* Array fields */
45                        'companies'     => true,
46                        'relations'     => true,
47                        'addresses'     => true,
48                        'connections'   => true
49                );
50               
51                /*
52               
53                        @function global_ldap_catalog
54                        @abstract Constructor
55                        @author Raphael Derosso Pereira
56                        @author Mário César Kolling (external catalogs)
57
58                        @param integer $id_source The ID of the LDAP source
59                        @param string $context Ldap bind DN
60                        @param integer $external 0 = internal catalog, 1 = external catalog
61                */
62                function bo_global_ldap_catalog ( $id_source, $context, $external = 0 )
63                {
64                        $this->external = $external;
65                        if (!function_exists('ldap_search'))
66                        {
67                                exit('PHP LDAP support Unavailable!');
68                        }
69                       
70                        $this->ldap = CreateObject('contactcenter.bo_ldap_manager');
71                       
72                        if ($this->external)
73                        {
74                                $all_src = $this->ldap->get_external_ldap_sources();
75                        }
76                        else
77                        {
78                                $all_src = $this->ldap->get_all_ldap_sources();
79                        }
80
81                        if (!$all_src[$id_source] or !$context)
82                        {
83                                exit('Unavailable LDAP source.');
84                        }
85
86                        $this->src_info = $all_src[$id_source];
87                        $this->src_info['context'] = $context;
88
89                        if ($this->external)
90                        {
91                                $this->trans_table = $this->ldap->get_external_ldap_fields_association($id_source);
92                        }
93                        else
94                        {       
95                                $this->trans_table = $this->ldap->get_ldap_fields_association($id_source);
96                        }
97                }
98               
99                /*
100               
101                        @function find
102                        @abstract Searches the LDAP directory for the specified fields with
103                                the specified rules and retuns an array containing all the DNs
104                                that matches the rules.
105                        @author Raphael Derosso Pereira
106                       
107                        @param array $what The fields to be taken
108                        @param array $rules The rules to be match. See class.abo_catalog.inc.php
109                                for reference
110                        @param array $other Other parameters:
111                                $return = array(
112                                        'limit'  => (integer),
113                                        'offset' => (integer) [NOT IMPLEMENTED]
114                                )
115               
116                */
117                function find($what, $rules=false, $other=false)
118                {
119                        $restric_fields = $this->get_restrictions_without_branch($rules);
120                       
121                        $trans_f = $this->translate_fields($what, $restric_fields);
122                       
123                        foreach($trans_f as $orig => $field_a)
124                        {
125                                foreach($field_a as $field)
126                                {
127                                        $fields[] = $field;
128                                }
129                        }
130                       
131                        $fields = array_unique($fields);
132                       
133                        $filter = $this->process_restrictions($rules, $trans_f);
134                        // Find objects where 'mail' attribute is not null.
135                        $filter = "(&".$filter."(mail=*))";
136                        if("ou" === strtolower(substr($this->src_info['context'], 0, 2)) ||
137                                (trim($rules[0]['value']) == "phpgwAccount"))   
138                        {                       
139                                $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'], $this->src_info['acc'], $this->src_info['pw'], true);
140                                $result_r = ldap_search($ldap , $this->src_info['context'], $filter, $fields, 0, $this->src_info['max_results']);
141                        }
142                        else
143                        {                               
144                                return false;
145                        }
146                       
147
148                        if (!$result_r)
149                        {
150                                return false;
151                        }
152                       
153                        if ($other['order'])
154                        {
155                                $sort_f = array($other['order']);
156                                $ldap_sort_by = $this->translate_fields($sort_f, $restric_fields);
157                        }
158
159                        if ($ldap_sort_by)
160                        {
161                                if (!ldap_sort($ldap, $result_r, $ldap_sort_by[$other['order']][0]))
162                                {
163                                        return false;
164                                }
165                        }
166                       
167                        $result_u = ldap_get_entries($ldap, $result_r);
168                       
169                        $i = 0;
170                        foreach ($result_u as $index => $result_p)
171                        {
172                                if ($index === 'count' or $index === 'dn' or (!$this->external and $result_p['phpgwaccountvisible'][0] == '-1'))
173                                {
174                                        continue;
175                                }
176                               
177                                foreach ($trans_f as $orig => $trans)
178                                {
179                                        $orig = substr($orig, strrpos($orig, '.')+1, strlen($orig));
180                                        foreach ($trans as $f)
181                                        {
182                                                if ($f === 'dn')
183                                                {
184                                                        $return[$i][$orig] = $result_p['dn'];
185                                                }
186                                                else if ($result_p[$f][0])
187                                                {
188                                                        $return[$i][$orig] = $result_p[$f][0];
189                                                }
190                                        }
191                                }
192                                $i++;
193                        }
194                       
195                        return $return;
196                }
197               
198                /*
199               
200                        @function translate_fields
201                        @abstract Return the LDAP objectClass fields that corresponds to the
202                                specified parameter fields
203                        @author Raphael Derosso Pereira
204                       
205                        @param array $fields The fields in the standard ContactCenter format
206                        @param array $rules The rules
207               
208                */
209                function translate_fields ( $fields, &$restric_fields )
210                {
211                        $return = array();
212                       
213                        $i = 0;
214                        foreach ($fields as $field)
215                        {
216                                if (!array_key_exists($field,$this->trans_table) or !$this->trans_table[$field])
217                                {
218                                        continue;
219                                }
220                               
221                                if (!is_array($this->trans_table[$field]))
222                                {
223                                        $reference = $this->trans_table[$field];
224                                       
225                                        reset($restric_fields);
226                                        while(list(,$field_r) = each($restric_fields))
227                                        {
228                                                if ($field_r['field'] === $reference and array_key_exists($field_r['value'], $this->trans_table[$reference]))
229                                                {
230                                                        array_push($return[$field], $this->trans_table[$reference][$field_r['value']]);
231                                                }
232                                        }
233                                }
234                                else
235                                {
236                                        if (!is_array($return[$field]))
237                                        {
238                                                $return[$field] = $this->trans_table[$field];
239                                        }
240                                        else
241                                        {
242                                                array_push($return[$field], $this->trans_table[$field]);
243                                        }
244                                }
245                        }
246                       
247                        if (count($return))
248                        {
249                                return $return;
250                        }
251                       
252                        return false;
253                }
254               
255                /*
256               
257                        @function process_restrictions
258                        @abstract Returns a LDAP filter string that corresponds to the
259                                specified restriction rules
260                        @author Raphael Derosso Pereira
261                       
262                        @param string $rules The restriction rules
263               
264                */
265                function process_restrictions( $rules, &$trans_table, $join_type='&' )
266                {
267                        if (!is_array($rules) or !count($rules))
268                        {
269                                return null;
270                        }
271                       
272                        foreach($rules as $rule_i => $rule)
273                        {
274                                $t = array();
275                                switch($rule['type'])
276                                {
277                                        case 'branch':
278                                                switch(strtoupper($rule['value']))
279                                                {
280                                                        case 'OR':
281                                                                $join = '|';
282                                                                break;
283                                                               
284                                                        case 'AND':
285                                                                $join = '&';
286                                                                break;
287                                                               
288                                                        case 'NOT':
289                                                                $join = '!';
290                                                                break;
291                                                               
292                                                        default:
293                                                                $join = $join_type;
294                                                }
295                                                $return_t[] = $this->process_restrictions($rule['sub_branch'], $trans_table, $join);
296                                                break;
297                                               
298                                        case '=':
299                                                if (array_key_exists($rule['field'], $trans_table))
300                                                {
301                                                        foreach($trans_table[$rule['field']] as $field)
302                                                        {
303                                                                $t[] = '('.$field.'='.$rule['value'].')';
304                                                        }
305                                                        $return_t[] = '(|'.implode(' ',$t).')';
306                                                }
307                                                break;
308                                       
309                                        case '!=':     
310                                                if (array_key_exists($rule['field'], $trans_table))
311                                                {
312                                                        foreach($trans_table[$rule['field']] as $field)
313                                                        {
314                                                                $t[] = '(!('.$field.'='.$rule['value'].'))';
315                                                        }
316                                                        $return_t[] = '(&'.implode(' ',$t).')';
317                                                }
318                                                break;
319                                       
320                                        case '<=':
321                                        case '<':
322                                                if (array_key_exists($rule['field'], $trans_table))
323                                                {
324                                                        foreach($trans_table[$rule['field']] as $field)
325                                                        {
326                                                                $t[] = '('.$field.'<='.$rule['value'].')';
327                                                        }
328                                                        $return_t[] = '(|'.implode(' ',$t).')';
329                                                }
330                                                break;
331                                       
332                                        case '>':
333                                        case '>=':
334                                                if (array_key_exists($rule['field'], $trans_table))
335                                                {
336                                                        foreach($trans_table[$rule['field']] as $field)
337                                                        {
338                                                                $t[] = '('.$field.'>='.$rule['value'].')';
339                                                        }
340                                                        $return_t[] = '(|'.implode(' ',$t).')';
341                                                }
342                                                break;
343                                               
344                                        case 'NULL':
345                                                if (array_key_exists($rule['field'], $trans_table))
346                                                {
347                                                        foreach($trans_table[$rule['field']] as $field)
348                                                        {
349                                                                $t[] = '(!('.$field.'=*'.'))';
350                                                        }
351                                                        $return_t[] = '(&'.implode(' ',$t).')';
352                                                }
353                                                break;
354                                       
355                                        case 'IN':
356                                                if (array_key_exists($rule['field'], $trans_table))
357                                                {
358                                                        foreach($trans_table[$rule['field']] as $field)
359                                                        {
360                                                                foreach($rule['value'] as $value)
361                                                                {
362                                                                        $t[] = '('.$field.'='.$value.')';
363                                                                }
364                                                        }
365                                                        $return_t[] = '(|'.implode(' ',$t).')';
366                                                }
367                                                break;
368
369                                        case 'iLIKE':
370/*                                              if (array_key_exists($rule['field'], $trans_table))
371                                                {
372                                                        $value_1 = strtoupper(str_replace('%', '*', $rule['value']));
373                                                        $value_2 = strtolower($value_1);
374                                                       
375                                                        foreach($trans_table[$rule['field']] as $field)
376                                                        {
377                                                                $t[] = '('.$field.'='.$value_1.')';
378                                                                $t[] = '('.$field.'='.$value_2.')';
379                                                        }
380                                                        $return_t[] = '(|'.implode(' ',$t).')';
381                                                }
382                                                break;
383                                               
384*/                                      case 'LIKE':
385                                                if (array_key_exists($rule['field'], $trans_table))
386                                                {
387                                                        $value = str_replace('%', '*', $rule['value']);
388                                                       
389                                                        foreach($trans_table[$rule['field']] as $field)
390                                                        {
391                                                                $t[] = '('.$field.'='.$value.')';
392                                                        }
393                                                        $return_t[] = '(|'.implode(' ',$t).')';
394                                                }
395                                                break;
396                                               
397                                        case 'NOT NULL':
398                                                if (array_key_exists($rule['field'], $trans_table))
399                                                {
400                                                        foreach($trans_table[$rule['field']] as $field)
401                                                        {
402                                                                $t[] = '('.$field.'=*'.')';
403                                                        }
404                                                        $return_t[] = '(|'.implode(' ',$t).')';
405                                                }
406                                                break;
407                                       
408                                        case 'NOT IN':
409                                                if (array_key_exists($rule['field'], $trans_table))
410                                                {
411                                                        foreach($trans_table[$rule['field']] as $field)
412                                                        {
413                                                                foreach($rule['value'] as $value)
414                                                                {
415                                                                        $t[] = '('.$field.'='.$value.')';
416                                                                }
417                                                        }
418                                                        $return_t[] = '(!(|'.implode('',$t).'))';
419                                                }
420                                                break;
421
422                                        case 'NOT iLIKE':
423                                                if (array_key_exists($rule['field'], $trans_table))
424                                                {
425                                                        $value_1 = strtoupper(str_replace('%', '*', $rule['value']));
426                                                        $value_2 = strtolower($value_1);
427                                                       
428                                                        foreach($trans_table[$rule['field']] as $field)
429                                                        {
430                                                                $t[] = '('.$field.'='.$value_1.')';
431                                                                $t[] = '('.$field.'='.$value_2.')';
432                                                        }
433                                                        $return_t[] = '(!(|'.implode(' ',$t).'))';
434                                                }
435                                                break;
436
437                                        case 'NOT LIKE':
438                                                if (array_key_exists($rule['field'], $trans_table))
439                                                {
440                                                        $value = str_replace('%', '*', $rule['value']);
441                                                       
442                                                        foreach($trans_table[$rule['field']] as $field)
443                                                        {
444                                                                $t[] = '('.$field.'='.$value.')';
445                                                        }
446                                                        $return_t[] = '(!(|'.implode(' ',$t).'))';
447                                                }
448                                                break;
449                                }
450                        }
451                       
452                        if (count($return_t))
453                        {
454                                $return = '('.$join_type;
455                                foreach ($return_t as $return_p)
456                                {
457                                        $return .= $return_p;
458                                }
459                                $return .= ')';
460                        }
461                        else
462                        {
463                                $return = null;
464                        }
465                        return $return;
466                }
467
468                /*!
469               
470                        @function get_restrictions_without_branch
471                        @abstract Returns an array containing the restrictions ignoring the
472                                branches
473                        @author Raphael Derosso Pereira
474                       
475                        @param array $restrictions The restrictions
476               
477                */
478                function get_restrictions_without_branch(&$restrictions)
479                {
480                        if (!is_array($restrictions))
481                        {
482                                return null;
483                        }
484                       
485                        $fields = array();
486                       
487                        foreach ($restrictions as $restrict_data)
488                        {
489                                switch($restrict_data['type'])
490                                {
491                                        case 'branch':
492                                                $fields = array_merge($fields, $this->get_restrictions_without_branch($restrict_data['sub_branch']));
493                                                break;
494                                               
495                                        case '=':
496                                        case '!=':     
497                                        case '<=':
498                                        case '<':
499                                        case '>':
500                                        case '>=':
501                                        case 'NULL':
502                                        case 'IN':
503                                        case 'LIKE':
504                                        case 'iLIKE':
505                                        case 'NOT NULL':
506                                        case 'NOT IN':
507                                        case 'NOT LIKE':
508                                        case 'NOT iLIKE':
509                                                array_push($fields, $restrict_data);
510                                                break;
511                                               
512                                        default:
513                                                exit('Error in '.__FILE__.' on '.__LINE__.'<br>The restriction type passed was: '.$restrict_data['type']);                                     
514                                }
515                        }
516                       
517                        return $fields;
518                }
519               
520               
521                /*********************************************************************\
522                 *                        Methods to Get Data                        *
523                \*********************************************************************/
524               
525       
526                /*!
527               
528                 @function get_single_entry
529                 @abstract Returns all information requested about one contact
530                 @author Raphael Derosso Pereira
531                     
532                 @param integer $id_contact The contact ID
533                 @param array $fields The array returned by get_fields with true
534                        on the fields to be taken.
535                       
536                */
537                function get_single_entry ( $id_contact, $fields )
538                {
539                        if (!is_array($fields))
540                        {
541                                if (is_object($GLOBALS['phpgw']->log))
542                                {
543                                        $GLOBALS['phpgw']->log->message(array(
544                                                'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.',
545                                                'line' => __LINE__,
546                                                'file' => __FILE__));
547                                       
548                                        $GLOBALS['phpgw']->log->commit();
549                                }
550                                else
551                                {
552                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
553                                }
554                        }
555                       
556                        $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true);
557                       
558                        if (!$ldap)
559                        {
560                                return false;
561                        }
562                        $id_contact = preg_replace("/dc=(.*)/i",$this->src_info['dn'],$id_contact);
563                        $resource = @ldap_read($ldap, $id_contact, 'objectClass='.$this->src_info['obj']);
564                        $n_entries = @ldap_count_entries($ldap, $resource);
565                        if ( $n_entries > 1 or $n_entries < 1)
566                        {
567                                return false;
568                        }
569                       
570                        $first_entry = ldap_first_entry($ldap, $resource);
571                        $contact = ldap_get_attributes($ldap,$first_entry);
572                        if($contact['jpegPhoto']){     
573                                $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $first_entry, "jpegPhoto");
574                        }
575
576//                      print_r($contact);
577                       
578                //      $contact_data = $this->fields;
579                       
580                        foreach($fields as $field => $trueness)
581                        {
582                                if (!$trueness)
583                                {
584                                        //unset($contact_data[$field]);
585                                        continue;
586                                }
587                               
588                                switch ($field)
589                                {
590                                        case 'companies':
591                                                unset($l_fields);
592                                                $l_fields['company_name']  = $this->trans_table['contact.company.company_name'];
593                                                $l_fields['title']         = $this->trans_table['contact.business_info.title'];
594                                                $l_fields['department']    = $this->trans_table['contact.business_info.department'];
595                                                $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes'];
596                                               
597                                                $contact_data['companies'] = array();
598                                                foreach($l_fields as $l_field => $l_value)
599                                                {
600                                                        if (!( $contact[$l_value[0]][0]))
601                                                        {
602                                                                continue;
603                                                        }
604                                                       
605                                                        $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
606                                                }
607                                               
608                                                if (!(count($contact_data['companies'])))
609                                                {
610                                                        unset($contact_data['companies']);
611                                                }
612                                                break;
613                                       
614                                        case 'relations':
615                                                unset($l_fields);
616                                                if (!$this->trans_table['contact.contact_related.names_ordered'])
617                                                {
618                                                        unset($contact_data['relations']);
619                                                }
620                                               
621                                                $contact_data['relations'] = array();
622                                                if (!is_array($this->trans_table['contact.contact_related.names_ordered']))
623                                                {
624                                                        if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']]))
625                                                        {
626                                                                continue;
627                                                        }
628                                                       
629                                                        $i = 1;
630                                                        foreach($trans as $l_type => $l_type_fields)
631                                                        {
632                                                                if (!($contact[$l_type_fields[0]][0]))
633                                                                {
634                                                                        continue;
635                                                                }
636                                                               
637                                                                $contact_data['relations']['relation'.$i]['type'] = $l_type;
638                                                                $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]);
639                                                                $i++;
640                                                        }
641                                                }
642                                               
643                                                if (!(count($contact_data['relations'])))
644                                                {
645                                                        unset($contact_data['relations']);
646                                                }
647                                                break;
648                                       
649                                        case 'addresses':
650                                                unset($l_fields);
651                                                $l_fields['address1'] = $this->trans_table['contact.address.address1'];
652                                                $l_fields['address2'] = $this->trans_table['contact.address.address2'];
653                                                $l_fields['complement'] = $this->trans_table['contact.address.complement'];
654                                                $l_fields['address_other'] = $this->trans_table['contact.address.address_other'];
655                                                $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code'];
656                                                $l_fields['po_box'] = $this->trans_table['contact.address.po_box'];
657                                                $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city'];
658                                                $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name'];
659                                                $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone'];
660                                                $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location'];
661                                                $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state'];
662                                                $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name'];
663                                                $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol'];
664                                                $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country'];
665                                                $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name'];
666                                                $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default'];
667
668                                                $contact_data['addresses'] = array();
669                                                foreach($l_fields as $l_field => $l_value)
670                                                {
671                                                        if (!is_array($l_value))
672                                                        {
673                                                                if (!($trans = $this->trans_table[$l_value]))
674                                                                {
675                                                                        continue;
676                                                                }
677                                                               
678                                                                $i = 1;
679                                                                foreach($trans as $l_type => $l_type_fields)
680                                                                {
681                                                                        if (!($contact[$l_type_fields[0]][0]))
682                                                                        {
683                                                                                continue;
684                                                                        }
685                                                                       
686                                                                        $contact_data['addresses']['address'.$i]['type'] = $l_type;
687                                                                        $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
688                                                                        $i++;
689                                                                }
690                                                        }
691                                                        else
692                                                        {
693                                                                $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
694                                                        }
695                                                }
696                                               
697                                                if (!(count($contact_data['addresses'])))
698                                                {
699                                                        unset($contact_data['addresses']);
700                                                }
701                                                break;
702                                       
703                                        case 'connections':
704                            $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences');
705                            if (!is_array($preferences))
706                            {
707                                                        $preferences['personCardEmail'] = 1;
708                                                        $preferences['personCardPhone'] = 2;
709                                                }
710                                                unset($l_fields);
711                                                $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name'];
712                                                $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value'];
713
714                                                $contact_data['connections'] = array();
715                                                foreach($l_fields as $l_field => $l_value)
716                                                {
717                                                        if (!is_array($l_value))
718                                                        {
719                                                                if (!($trans = $this->trans_table[$l_value]))
720                                                                {
721                                                                        continue;
722                                                                }
723                                                               
724                                                                $i = 1;
725                                                                foreach($trans as $l_type => $l_type_fields)
726                                                                {
727                                                                        if (!($contact[$l_type_fields[0]][0]))
728                                                                        {
729                                                                                continue;
730                                                                        }
731                                                                       
732                                                                        switch ($l_type)
733                                                                        {
734                                                                                case 'email':
735                                                                                $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail'];
736                                                                                break;
737
738                                                                                default:
739                                                                                $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone'];
740                                                                        }
741                                                                        $contact_data['connections']['connection'.$i]['type'] = $l_type;
742                                                                        $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
743                                                                        $i++;
744                                                                }
745                                                        }
746                                                        else
747                                                        {
748                                                                $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
749                                                        }
750                                                }
751                                               
752                                                if (!(count($contact_data['connections'])))
753                                                {
754                                                        unset($contact_data['connections']);
755                                                }
756                                                break;
757                                       
758                                        case 'prefix':
759                                                unset($l_fields);
760                                                $l_fields = $this->trans_table['contact.prefixes.prefix'];
761                                                if (!$l_fields or !$contact[$l_fields[0]][0])
762                                                {
763                                                        unset($contact_data['prefix']);
764                                                        continue;
765                                                }
766                                               
767                                                $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]);
768                                                break;
769                                               
770                                        case 'suffix':
771                                                unset($l_fields);
772                                                $l_fields = $this->trans_table['contact.suffixes.suffix'];
773                                                if (!$l_fields or !$contact[$l_fields[0]][0])
774                                                {
775                                                        unset($contact_data['suffix']);
776                                                        continue;
777                                                }
778                                               
779                                                $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]);
780                                                break;
781                                               
782                                        case 'status':
783                                                unset($l_fields);
784                                                $l_fields = $this->trans_table['contact.status.status_name'];
785                                                if (!$l_fields or !$contact[$l_fields[0]][0])
786                                                {
787                                                        unset($contact_data['status']);
788                                                        continue;
789                                                }
790                                               
791                                                $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]);
792                                                break;
793                                               
794                                                case 'photo':
795                                                unset($l_fields);
796                                                $l_fields = $this->trans_table['contact.photo'];
797                                                if (!$l_fields or !$contact[$l_fields[0]][0])
798                                                {
799                                                        unset($contact_data['photo']);
800                                                        continue;
801                                                }
802                                               
803                                                $contact_data['photo'] = $contact[$l_fields[0]][0];
804                                                break;                                                                                 
805
806                                        default:
807                                                unset($l_fields);
808                                                $l_fields = $this->trans_table['contact.'.$field];
809                                                if (!$l_fields or !$contact[$l_fields[0]][0])
810                                                {
811                                                        unset($contact_data[$field]);
812                                                        continue;
813                                                }
814                                               
815                                                if(count($contact[$l_fields[0]]) > 1)
816                                                {
817                                                        $tmp = array();
818                                                        foreach ($contact[$l_fields[0]] as $i => $j)
819                                                        {
820                                                                $tmp["$i"] = utf8_decode($j);
821                                                        }
822                                                        //$contact_data[$field] = $contact[$l_fields[0]];
823                                                        $contact_data[$field] = $tmp;
824                                                }
825                                                else
826                                                        $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]);
827
828                                                break;
829                                }
830                        }
831                       
832                        if (!is_array($contact_data))
833                        {
834                                return false;
835                        }
836                       
837                        return $contact_data;
838                }
839                //SERPRO
840                /*!
841
842                 @function get_all_entries
843                 @abstract Returns all information requested about a bunch of contacts, usually a page
844                 @author Raphael Derosso Pereira
845                 @author Mário César Kolling
846
847                 @param string $filter Filter (returned by generate_filter).
848                 @param array $fields The array returned by get_fields with true
849                        on the fields to be taken.
850
851                */
852                function get_all_entries($filter, $fields)
853                {
854                        if (!is_array($fields))
855                        {
856                                if (is_object($GLOBALS['phpgw']->log))
857                                {
858                                        $GLOBALS['phpgw']->log->message(array(
859                                                'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.',
860                                                'line' => __LINE__,
861                                                'file' => __FILE__));
862
863                                        $GLOBALS['phpgw']->log->commit();
864                                }
865                                else
866                                {
867                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
868                                }
869                        }
870
871                        $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true);
872
873                        if (!$ldap)
874                        {
875                                return false;
876                        }
877
878                        $resource = @ldap_search($ldap, $this->src_info['dn'], $filter);
879                        $n_entries = @ldap_count_entries($ldap, $resource);
880
881                        ldap_sort($ldap, $resource, 'cn');
882
883                        if ( $n_entries < 1)
884                        {
885                                return false;
886                        }
887
888                        $contacts = array();
889
890                        for ($entry = ldap_first_entry($ldap, $resource);
891                                 $entry != false;
892                                 $entry = ldap_next_entry($ldap, $entry))
893                        {
894                                $contact = ldap_get_attributes($ldap,$entry);
895                                if($contact['jpegPhoto']){
896                                        $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $entry, "jpegPhoto");
897                                }
898
899                                foreach($fields as $field => $trueness)
900                                {
901                                        if (!$trueness)
902                                        {
903                                                //unset($contact_data[$field]);
904                                                continue;
905                                        }
906
907                                        switch ($field)
908                                        {
909                                                case 'companies':
910                                                        unset($l_fields);
911                                                        $l_fields['company_name']  = $this->trans_table['contact.company.company_name'];
912                                                        $l_fields['title']         = $this->trans_table['contact.business_info.title'];
913                                                        $l_fields['department']    = $this->trans_table['contact.business_info.department'];
914                                                        $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes'];
915
916                                                        $contact_data['companies'] = array();
917                                                        foreach($l_fields as $l_field => $l_value)
918                                                        {
919                                                                if (!( $contact[$l_value[0]][0]))
920                                                                {
921                                                                        continue;
922                                                                }
923
924                                                                $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
925                                                        }
926
927                                                        if (!(count($contact_data['companies'])))
928                                                        {
929                                                                unset($contact_data['companies']);
930                                                        }
931                                                        break;
932
933                                                case 'relations':
934                                                        unset($l_fields);
935                                                        if (!$this->trans_table['contact.contact_related.names_ordered'])
936                                                        {
937                                                                unset($contact_data['relations']);
938                                                        }
939
940                                                        $contact_data['relations'] = array();
941                                                        if (!is_array($this->trans_table['contact.contact_related.names_ordered']))
942                                                        {
943                                                                if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']]))
944                                                                {
945                                                                        continue;
946                                                                }
947
948                                                                $i = 1;
949                                                                foreach($trans as $l_type => $l_type_fields)
950                                                                {
951                                                                        if (!($contact[$l_type_fields[0]][0]))
952                                                                        {
953                                                                                continue;
954                                                                        }
955
956                                                                        $contact_data['relations']['relation'.$i]['type'] = $l_type;
957                                                                        $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]);
958                                                                        $i++;
959                                                                }
960                                                        }
961
962                                                        if (!(count($contact_data['relations'])))
963                                                        {
964                                                                unset($contact_data['relations']);
965                                                        }
966                                                        break;
967
968                                                case 'addresses':
969                                                        unset($l_fields);
970                                                        $l_fields['address1'] = $this->trans_table['contact.address.address1'];
971                                                        $l_fields['address2'] = $this->trans_table['contact.address.address2'];
972                                                        $l_fields['complement'] = $this->trans_table['contact.address.complement'];
973                                                        $l_fields['address_other'] = $this->trans_table['contact.address.address_other'];
974                                                        $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code'];
975                                                        $l_fields['po_box'] = $this->trans_table['contact.address.po_box'];
976                                                        $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city'];
977                                                        $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name'];
978                                                        $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone'];
979                                                        $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location'];
980                                                        $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state'];
981                                                        $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name'];
982                                                        $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol'];
983                                                        $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country'];
984                                                        $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name'];
985                                                        $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default'];
986
987                                                        $contact_data['addresses'] = array();
988                                                        foreach($l_fields as $l_field => $l_value)
989                                                        {
990                                                                if (!is_array($l_value))
991                                                                {
992                                                                        if (!($trans = $this->trans_table[$l_value]))
993                                                                        {
994                                                                                continue;
995                                                                        }
996
997                                                                        $i = 1;
998                                                                        foreach($trans as $l_type => $l_type_fields)
999                                                                        {
1000                                                                                if (!($contact[$l_type_fields[0]][0]))
1001                                                                                {
1002                                                                                        continue;
1003                                                                                }
1004
1005                                                                                $contact_data['addresses']['address'.$i]['type'] = $l_type;
1006                                                                                $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
1007                                                                                $i++;
1008                                                                        }
1009                                                                }
1010                                                                else
1011                                                                {
1012                                                                        $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
1013                                                                }
1014                                                        }
1015
1016                                                        if (!(count($contact_data['addresses'])))
1017                                                        {
1018                                                                unset($contact_data['addresses']);
1019                                                        }
1020                                                        break;
1021
1022                                                case 'connections':
1023                                    $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences');
1024                                    if (!is_array($preferences))
1025                                    {
1026                                                                $preferences['personCardEmail'] = 1;
1027                                                                $preferences['personCardPhone'] = 2;
1028                                                        }
1029                                                        unset($l_fields);
1030                                                        $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name'];
1031                                                        $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value'];
1032
1033                                                        $contact_data['connections'] = array();
1034                                                        foreach($l_fields as $l_field => $l_value)
1035                                                        {
1036                                                                if (!is_array($l_value))
1037                                                                {
1038                                                                        if (!($trans = $this->trans_table[$l_value]))
1039                                                                        {
1040                                                                                continue;
1041                                                                        }
1042
1043                                                                        $i = 1;
1044                                                                        foreach($trans as $l_type => $l_type_fields)
1045                                                                        {
1046                                                                                if (!($contact[$l_type_fields[0]][0]))
1047                                                                                {
1048                                                                                        continue;
1049                                                                                }
1050
1051                                                                                switch ($l_type)
1052                                                                                {
1053                                                                                        case 'email':
1054                                                                                        $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail'];
1055                                                                                        break;
1056
1057                                                                                        default:
1058                                                                                        $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone'];
1059                                                                                }
1060                                                                                $contact_data['connections']['connection'.$i]['type'] = $l_type;
1061                                                                                $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]);
1062                                                                                $i++;
1063                                                                        }
1064                                                                }
1065                                                                else
1066                                                                {
1067                                                                        $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]);
1068                                                                }
1069                                                        }
1070
1071                                                        if (!(count($contact_data['connections'])))
1072                                                        {
1073                                                                unset($contact_data['connections']);
1074                                                        }
1075                                                        break;
1076
1077                                                case 'prefix':
1078                                                        unset($l_fields);
1079                                                        $l_fields = $this->trans_table['contact.prefixes.prefix'];
1080                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1081                                                        {
1082                                                                unset($contact_data['prefix']);
1083                                                                continue;
1084                                                        }
1085
1086                                                        $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]);
1087                                                        break;
1088
1089                                                case 'suffix':
1090                                                        unset($l_fields);
1091                                                        $l_fields = $this->trans_table['contact.suffixes.suffix'];
1092                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1093                                                        {
1094                                                                unset($contact_data['suffix']);
1095                                                                continue;
1096                                                        }
1097
1098                                                        $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]);
1099                                                        break;
1100
1101                                                case 'status':
1102                                                        unset($l_fields);
1103                                                        $l_fields = $this->trans_table['contact.status.status_name'];
1104                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1105                                                        {
1106                                                                unset($contact_data['status']);
1107                                                                continue;
1108                                                        }
1109
1110                                                        $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]);
1111                                                        break;
1112
1113                                                        case 'photo':
1114                                                        unset($l_fields);
1115                                                        $l_fields = $this->trans_table['contact.photo'];
1116                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1117                                                        {
1118                                                                unset($contact_data['photo']);
1119                                                                continue;
1120                                                        }
1121
1122                                                        $contact_data['photo'] = $contact[$l_fields[0]][0];
1123                                                        break;
1124
1125                                                default:
1126                                                        unset($l_fields);
1127                                                        $l_fields = $this->trans_table['contact.'.$field];
1128                                                        if (!$l_fields or !$contact[$l_fields[0]][0])
1129                                                        {
1130                                                                unset($contact_data[$field]);
1131                                                                continue;
1132                                                        }
1133
1134                                                        if(count($contact[$l_fields[0]]) > 1)
1135                                                        {
1136                                                                $tmp = array();
1137                                                                foreach ($contact[$l_fields[0]] as $i => $j)
1138                                                                {
1139                                                                        $tmp["$i"] = utf8_decode($j);
1140                                                                }
1141                                                                //$contact_data[$field] = $contact[$l_fields[0]];
1142                                                                $contact_data[$field] = $tmp;
1143                                                        }
1144                                                        else
1145                                                                $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]);
1146
1147                                                        break;
1148
1149                                        }
1150                                }
1151
1152                                if (is_array($contact_data))
1153                                {
1154                                        $contacts[ldap_get_dn($ldap, $entry)] = $contact_data;
1155                                }
1156
1157                        }
1158
1159                        return $contacts;
1160                }
1161               
1162                function get_multiple_entries ( $id_contacts, $fields, $other_data = false )
1163                {
1164                        if (!is_array($id_contacts) or !is_array($fields) or ($other_data != false and !is_array($other_data)))
1165                        {
1166                                if (is_object($GLOBALS['phpgw']->log))
1167                                {
1168                                        $GLOBALS['phpgw']->log->message(array(
1169                                                'text' => 'F-BadcontactcenterParam, wrong get_multiple_entry parameter type.',
1170                                                'line' => __LINE__,
1171                                                'file' => __FILE__));
1172                                       
1173                                        $GLOBALS['phpgw']->log->commit();
1174                                }
1175                                else {
1176                                        exit('Argument Error on: <br>File:'.__FILE__.'<br>Line:'.__LINE__.'<br>');
1177                                }
1178                        }
1179                         
1180                        foreach ($id_contacts as $id)
1181                        {
1182                                $contacts[$id] = $this->get_single_entry($id,$fields);
1183                        }
1184                       
1185                        return $contacts;
1186
1187                        // SERPRO
1188                                               
1189                        /*$contacts = array();
1190       
1191                        if ($other_data)
1192                        {
1193                                //TODO
1194                        }
1195
1196                        $filter = $this->generate_filter($id_contacts);
1197
1198                        //$teste = $this->get_all_entries($filter, $fields);
1199
1200                        return $this->get_all_entries($filter, $fields);*/
1201                       
1202                }
1203
1204        // CELEPAR
1205                function generate_filter($id_contacts)
1206                {
1207                        if (($size = count($id_contacts)))
1208                        {
1209                                $contacts[$id] = $this->get_single_entry($id,$fields);
1210                        }
1211                       
1212                        return $contacts;
1213                }
1214               
1215                // SERPRO
1216                /*
1217                function generate_filter($id_contacts)
1218                {
1219                        if (($size = count($id_contacts)))
1220                        {
1221                                $filter = '(&(objectClass='.$this->src_info['obj'] .  ')(|';
1222                                for ($i = 0; $i < $size; $i++)
1223                                {
1224
1225                                        //
1226                                        //  Não utiliza mais a função ldap_explode, usa a expressão regular a seguir para pegar o primeiro
1227                                        //  componente da dn
1228                                        //
1229                                        preg_match('/^(\w*=[^,]*),.*$/', $id_contacts[$i], $cn);
1230
1231                                //
1232                                // Adicionados os str_replace para adicionar caracteres de escape em frente aos caracteres '(' e ')',
1233                                // posteriormente poderá ser necessário substituir por uma expressão regular mais genérica.
1234                                //
1235
1236                                        if ($cn[1])
1237                                        {
1238                                                //
1239                                                // Esta operação resolve o problema causado pela conversão de caracteres acentuados realizada
1240                                                // pela função ldap_explode_dn(). Talvez seja necessário utilizar esta tradução em outros lugares,
1241                                                // neste caso é mais apropriado colocar dentro de uma função.
1242                                                //
1243                                                //foreach($cn as $key=>$value){
1244                                        //      $cn[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
1245                                        //}
1246
1247                                                $filter .= '(' . str_replace(')', '\)', str_replace('(','\(',$cn[1])) . ')';
1248                                        }
1249                                }
1250                                $filter .= '))';
1251                        }
1252
1253                        return $filter;
1254
1255                }
1256                */
1257
1258                function get_all_entries_ids ()
1259                {
1260                        $search_fields = array('contact.id_contact', 'contact.names_ordered');
1261                        $search_rules  = array(
1262                                0 => array(
1263                                        'field' => 'contact.names_ordered',
1264                                        'type'  => 'LIKE',
1265                                        'value' => '%'
1266                                )
1267                        );
1268                        $search_other  = array('order' => 'contact.names_ordered');
1269
1270                        $result_i = $this->find($search_fields, $search_rules, $search_other);
1271
1272                        if (is_array($result_i) and count($result_i))
1273                        {
1274                                $result = array();
1275                                foreach($result_i as $result_part)
1276                                {
1277                                        $result[] = $result_part['id_contact'];
1278                                }
1279
1280                                return $result;
1281                        }
1282
1283                        return null;
1284                }
1285               
1286                function get_relations ($id_contact,$extra=false)
1287                {
1288                }
1289               
1290                function get_addresses ( $id_contact,$extra=false )
1291                {
1292                }
1293               
1294                function get_connections ( $id_contact,$extra=false )
1295                {
1296                }
1297               
1298                function get_companies ( $id_contact, $extra=false )
1299                {
1300                }
1301               
1302                function get_all_prefixes (  )
1303                {
1304                }
1305               
1306                function get_all_suffixes (  )
1307                {
1308                }
1309               
1310                function get_all_status (  )
1311                {
1312                }
1313               
1314                function get_all_relations_types (  )
1315                {
1316                }
1317               
1318                function get_all_addresses_types (  )
1319                {
1320                }
1321               
1322                function get_all_connections_types (  )
1323                {
1324                }
1325               
1326                function get_vcard ( $id_contact )
1327                {
1328                }
1329               
1330               
1331               
1332               
1333                function get_global_tree ( $root )
1334                {
1335                }
1336       
1337                function get_actual_brach (  )
1338                {
1339                }
1340       
1341                function set_actual_branch ( $branch )
1342                {
1343                }
1344        }
1345?>
Note: See TracBrowser for help on using the repository browser.