source: companies/serpro/contactcenter/inc/class.bo_global_ldap_catalog.inc.php @ 903

Revision 903, 36.4 KB checked in by niltonneto, 15 years ago (diff)

Importacao inicial do Expresso do Serpro

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