source: branches/2.0/contactcenter/inc/class.bo_global_ldap_catalog.inc.php @ 3210

Revision 3210, 35.8 KB checked in by niltonneto, 14 years ago (diff)

Ticket #1185 - Corrigido erro ao listar OU com muitos objetos dentro do Catálogo Geral.

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