* * ------------------------------------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \***************************************************************************/ /* This class is responsible for manipulating the Global LDAP Contact Manager */ include_once('class.abo_catalog.inc.php'); class bo_global_ldap_catalog extends abo_catalog { var $ldap; var $src_info; var $trans_table; // used to determine if a catalog is external var $external; var $fields = array( 'id_contact' => true, 'status' => true, 'photo' => true, 'alias' => true, 'prefix' => true, 'given_names' => true, 'family_names' => true, 'account_type' => true, 'names_ordered' => true, 'suffix' => true, 'birthdate' => true, 'sex' => true, 'pgp_key' => true, 'notes' => true, /* Array fields */ 'companies' => true, 'relations' => true, 'addresses' => true, 'connections' => true ); /* @function global_ldap_catalog @abstract Constructor @author Raphael Derosso Pereira @author Mário César Kolling (external catalogs) @param integer $id_source The ID of the LDAP source @param string $context Ldap bind DN @param integer $external 0 = internal catalog, 1 = external catalog */ function bo_global_ldap_catalog ( $id_source, $context, $external = 0 ) { $this->external = $external; if (!function_exists('ldap_search')) { exit('PHP LDAP support Unavailable!'); } $this->ldap = CreateObject('contactcenter.bo_ldap_manager'); if ($this->external) { $all_src = $this->ldap->get_external_ldap_sources(); } else { $all_src = $this->ldap->get_all_ldap_sources(); } if (!$all_src[$id_source] or !$context) { exit('Unavailable LDAP source.'); } $this->src_info = $all_src[$id_source]; $this->src_info['context'] = $context; if ($this->external) { $this->trans_table = $this->ldap->get_external_ldap_fields_association($id_source); } else { $this->trans_table = $this->ldap->get_ldap_fields_association($id_source); } } /* @function find @abstract Searches the LDAP directory for the specified fields with the specified rules and retuns an array containing all the DNs that matches the rules. @author Raphael Derosso Pereira @param array $what The fields to be taken @param array $rules The rules to be match. See class.abo_catalog.inc.php for reference @param array $other Other parameters: $return = array( 'limit' => (integer), 'offset' => (integer) [NOT IMPLEMENTED] ) */ function find($what, $rules=false, $other=false, $recursive=false) { $restric_fields = $this->get_restrictions_without_branch($rules); $trans_f = $this->translate_fields($what, $restric_fields); foreach($trans_f as $orig => $field_a) { foreach($field_a as $field) { $fields[] = $field; } } $fields = array_unique($fields); $filter = $this->process_restrictions($rules, $trans_f); // Find objects where 'mail' attribute is not null. $filter = "(&".$filter."(mail=*))"; if("ou" === strtolower(substr($this->src_info['context'], 0, 2)) || (trim($rules[0]['value']) == "phpgwAccount")) { $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'], $this->src_info['acc'], $this->src_info['pw'], true); $result_r = $recursive ? ldap_search($ldap , $this->src_info['context'], $filter, $fields, 0, $this->src_info['max_results']) : ldap_list($ldap , $this->src_info['context'], $filter, $fields, 0, $this->src_info['max_results']); } else { return false; } if (!$result_r) { return false; } if ($other['order']) { $sort_f = array($other['order']); $ldap_sort_by = $this->translate_fields($sort_f, $restric_fields); } if ($ldap_sort_by) { if (!ldap_sort($ldap, $result_r, $ldap_sort_by[$other['order']][0])) { return false; } } $result_u = ldap_get_entries($ldap, $result_r); // No entries found. if(!$result_u) return true; $i = 0; foreach ($result_u as $index => $result_p) { if ($index === 'count' or $index === 'dn' or (!$this->external and $result_p['phpgwaccountvisible'][0] == '-1')) { continue; } foreach ($trans_f as $orig => $trans) { $orig = substr($orig, strrpos($orig, '.')+1, strlen($orig)); foreach ($trans as $f) { if ($f === 'dn') { $return[$i][$orig] = $result_p['dn']; } else if ($result_p[$f][0]) { $return[$i][$orig] = $result_p[$f][0]; } } } $i++; } usort($return, array($this, "compareObjects")); return $return; } // Compare function for usort. function compareObjects($a, $b) { return strnatcasecmp($a['names_ordered'], $b['names_ordered']); } /* @function translate_fields @abstract Return the LDAP objectClass fields that corresponds to the specified parameter fields @author Raphael Derosso Pereira @param array $fields The fields in the standard ContactCenter format @param array $rules The rules */ function translate_fields ( $fields, &$restric_fields ) { $return = array(); $i = 0; foreach ($fields as $field) { if (!array_key_exists($field,$this->trans_table) or !$this->trans_table[$field]) { continue; } if (!is_array($this->trans_table[$field])) { $reference = $this->trans_table[$field]; reset($restric_fields); while(list(,$field_r) = each($restric_fields)) { if ($field_r['field'] === $reference and array_key_exists($field_r['value'], $this->trans_table[$reference])) { array_push($return[$field], $this->trans_table[$reference][$field_r['value']]); } } } else { if (!is_array($return[$field])) { $return[$field] = $this->trans_table[$field]; } else { array_push($return[$field], $this->trans_table[$field]); } } } if (count($return)) { return $return; } return false; } /* @function process_restrictions @abstract Returns a LDAP filter string that corresponds to the specified restriction rules @author Raphael Derosso Pereira @param string $rules The restriction rules */ function process_restrictions( $rules, &$trans_table, $join_type='&' ) { if (!is_array($rules) or !count($rules)) { return null; } foreach($rules as $rule_i => $rule) { $t = array(); switch($rule['type']) { case 'branch': switch(strtoupper($rule['value'])) { case 'OR': $join = '|'; break; case 'AND': $join = '&'; break; case 'NOT': $join = '!'; break; default: $join = $join_type; } $return_t[] = $this->process_restrictions($rule['sub_branch'], $trans_table, $join); break; case '=': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'='.$rule['value'].')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; case '!=': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '(!('.$field.'='.$rule['value'].'))'; } $return_t[] = '(&'.implode(' ',$t).')'; } break; case '<=': case '<': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'<='.$rule['value'].')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; case '>': case '>=': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'>='.$rule['value'].')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; case 'NULL': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '(!('.$field.'=*'.'))'; } $return_t[] = '(&'.implode(' ',$t).')'; } break; case 'IN': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { foreach($rule['value'] as $value) { $t[] = '('.$field.'='.$value.')'; } } $return_t[] = '(|'.implode(' ',$t).')'; } break; case 'iLIKE': /* if (array_key_exists($rule['field'], $trans_table)) { $value_1 = strtoupper(str_replace('%', '*', $rule['value'])); $value_2 = strtolower($value_1); foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'='.$value_1.')'; $t[] = '('.$field.'='.$value_2.')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; */ case 'LIKE': if (array_key_exists($rule['field'], $trans_table)) { $value = str_replace('%', '*', $rule['value']); foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'='.$value.')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; case 'NOT NULL': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'=*'.')'; } $return_t[] = '(|'.implode(' ',$t).')'; } break; case 'NOT IN': if (array_key_exists($rule['field'], $trans_table)) { foreach($trans_table[$rule['field']] as $field) { foreach($rule['value'] as $value) { $t[] = '('.$field.'='.$value.')'; } } $return_t[] = '(!(|'.implode('',$t).'))'; } break; case 'NOT iLIKE': if (array_key_exists($rule['field'], $trans_table)) { $value_1 = strtoupper(str_replace('%', '*', $rule['value'])); $value_2 = strtolower($value_1); foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'='.$value_1.')'; $t[] = '('.$field.'='.$value_2.')'; } $return_t[] = '(!(|'.implode(' ',$t).'))'; } break; case 'NOT LIKE': if (array_key_exists($rule['field'], $trans_table)) { $value = str_replace('%', '*', $rule['value']); foreach($trans_table[$rule['field']] as $field) { $t[] = '('.$field.'='.$value.')'; } $return_t[] = '(!(|'.implode(' ',$t).'))'; } break; } } if (count($return_t)) { $return = '('.$join_type; foreach ($return_t as $return_p) { $return .= $return_p; } $return .= ')'; } else { $return = null; } return $return; } /*! @function get_restrictions_without_branch @abstract Returns an array containing the restrictions ignoring the branches @author Raphael Derosso Pereira @param array $restrictions The restrictions */ function get_restrictions_without_branch(&$restrictions) { if (!is_array($restrictions)) { return null; } $fields = array(); foreach ($restrictions as $restrict_data) { switch($restrict_data['type']) { case 'branch': $fields = array_merge($fields, $this->get_restrictions_without_branch($restrict_data['sub_branch'])); break; case '=': case '!=': case '<=': case '<': case '>': case '>=': case 'NULL': case 'IN': case 'LIKE': case 'iLIKE': case 'NOT NULL': case 'NOT IN': case 'NOT LIKE': case 'NOT iLIKE': array_push($fields, $restrict_data); break; default: exit('Error in '.__FILE__.' on '.__LINE__.'
The restriction type passed was: '.$restrict_data['type']); } } return $fields; } /*********************************************************************\ * Methods to Get Data * \*********************************************************************/ /*! @function get_single_entry @abstract Returns all information requested about one contact @author Raphael Derosso Pereira @param integer $id_contact The contact ID @param array $fields The array returned by get_fields with true on the fields to be taken. */ function get_single_entry ( $id_contact, $fields, $external=false ) { if (!is_array($fields)) { if (is_object($GLOBALS['phpgw']->log)) { $GLOBALS['phpgw']->log->message(array( 'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.', 'line' => __LINE__, 'file' => __FILE__)); $GLOBALS['phpgw']->log->commit(); } else { exit('Argument Error on:
File:'.__FILE__.'
Line:'.__LINE__.'
'); } } $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true); if (!$ldap) { return false; } if(!$external) $id_contact = preg_replace("/dc=(.*)/i",$this->src_info['dn'],$id_contact); $resource = @ldap_read($ldap, $id_contact, 'objectClass='.$this->src_info['obj']); $n_entries = @ldap_count_entries($ldap, $resource); if ( $n_entries > 1 or $n_entries < 1) { return false; } $first_entry = ldap_first_entry($ldap, $resource); $contact = ldap_get_attributes($ldap,$first_entry); if($contact['jpegPhoto']){ $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $first_entry, "jpegPhoto"); } // $contact_data = $this->fields; foreach($fields as $field => $trueness) { if (!$trueness) { //unset($contact_data[$field]); continue; } switch ($field) { case 'companies': unset($l_fields); $l_fields['company_name'] = $this->trans_table['contact.company.company_name']; $l_fields['title'] = $this->trans_table['contact.business_info.title']; $l_fields['department'] = $this->trans_table['contact.business_info.department']; $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes']; $contact_data['companies'] = array(); foreach($l_fields as $l_field => $l_value) { if (!( $contact[$l_value[0]][0])) { continue; } $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } if (!(count($contact_data['companies']))) { unset($contact_data['companies']); } break; case 'relations': unset($l_fields); if (!$this->trans_table['contact.contact_related.names_ordered']) { unset($contact_data['relations']); } $contact_data['relations'] = array(); if (!is_array($this->trans_table['contact.contact_related.names_ordered'])) { if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } $contact_data['relations']['relation'.$i]['type'] = $l_type; $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } if (!(count($contact_data['relations']))) { unset($contact_data['relations']); } break; case 'addresses': unset($l_fields); $l_fields['address1'] = $this->trans_table['contact.address.address1']; $l_fields['address2'] = $this->trans_table['contact.address.address2']; $l_fields['complement'] = $this->trans_table['contact.address.complement']; $l_fields['address_other'] = $this->trans_table['contact.address.address_other']; $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code']; $l_fields['po_box'] = $this->trans_table['contact.address.po_box']; $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city']; $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name']; $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone']; $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location']; $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state']; $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name']; $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol']; $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country']; $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name']; $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default']; $contact_data['addresses'] = array(); foreach($l_fields as $l_field => $l_value) { if (!is_array($l_value)) { if (!($trans = $this->trans_table[$l_value])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } $contact_data['addresses']['address'.$i]['type'] = $l_type; $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } else { $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } } if (!(count($contact_data['addresses']))) { unset($contact_data['addresses']); } break; case 'connections': $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences'); if (!is_array($preferences)) { $preferences['personCardEmail'] = 1; $preferences['personCardPhone'] = 2; } unset($l_fields); $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name']; $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value']; $contact_data['connections'] = array(); foreach($l_fields as $l_field => $l_value) { if (!is_array($l_value)) { if (!($trans = $this->trans_table[$l_value])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } switch ($l_type) { case 'email': $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail']; break; default: $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone']; } $contact_data['connections']['connection'.$i]['type'] = $l_type; $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } else { $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } } if (!(count($contact_data['connections']))) { unset($contact_data['connections']); } break; case 'prefix': unset($l_fields); $l_fields = $this->trans_table['contact.prefixes.prefix']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['prefix']); continue; } $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'suffix': unset($l_fields); $l_fields = $this->trans_table['contact.suffixes.suffix']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['suffix']); continue; } $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'status': unset($l_fields); $l_fields = $this->trans_table['contact.status.status_name']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['status']); continue; } $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'photo': unset($l_fields); $l_fields = $this->trans_table['contact.photo']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['photo']); continue; } $contact_data['photo'] = $contact[$l_fields[0]][0]; break; default: unset($l_fields); $l_fields = $this->trans_table['contact.'.$field]; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data[$field]); continue; } if(count($contact[$l_fields[0]]) > 1) { $tmp = array(); foreach ($contact[$l_fields[0]] as $i => $j) { $tmp["$i"] = utf8_decode($j); } //$contact_data[$field] = $contact[$l_fields[0]]; $contact_data[$field] = $tmp; } else $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]); break; } } if (!is_array($contact_data)) { return false; } return $contact_data; } //SERPRO /*! @function get_all_entries @abstract Returns all information requested about a bunch of contacts, usually a page @author Raphael Derosso Pereira @author Mário César Kolling @param string $filter Filter (returned by generate_filter). @param array $fields The array returned by get_fields with true on the fields to be taken. */ function get_all_entries($filter, $fields) { if (!is_array($fields)) { if (is_object($GLOBALS['phpgw']->log)) { $GLOBALS['phpgw']->log->message(array( 'text' => 'F-BadcontactcenterParam, wrong get_single_entry parameters type.', 'line' => __LINE__, 'file' => __FILE__)); $GLOBALS['phpgw']->log->commit(); } else { exit('Argument Error on:
File:'.__FILE__.'
Line:'.__LINE__.'
'); } } $ldap = $GLOBALS['phpgw']->common->ldapConnect($this->src_info['host'],$this->src_info['acc'],$this->src_info['pw'],true); if (!$ldap) { return false; } $resource = @ldap_search($ldap, $this->src_info['dn'], $filter); $n_entries = @ldap_count_entries($ldap, $resource); ldap_sort($ldap, $resource, 'cn'); if ( $n_entries < 1) { return false; } $contacts = array(); for ($entry = ldap_first_entry($ldap, $resource); $entry != false; $entry = ldap_next_entry($ldap, $entry)) { $contact = ldap_get_attributes($ldap,$entry); if($contact['jpegPhoto']){ $contact['jpegPhoto'] = ldap_get_values_len ($ldap, $entry, "jpegPhoto"); } foreach($fields as $field => $trueness) { if (!$trueness) { //unset($contact_data[$field]); continue; } switch ($field) { case 'companies': unset($l_fields); $l_fields['company_name'] = $this->trans_table['contact.company.company_name']; $l_fields['title'] = $this->trans_table['contact.business_info.title']; $l_fields['department'] = $this->trans_table['contact.business_info.department']; $l_fields['company_notes'] = $this->trans_table['contact.company.company_notes']; $contact_data['companies'] = array(); foreach($l_fields as $l_field => $l_value) { if (!( $contact[$l_value[0]][0])) { continue; } $contact_data['companies']['company1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } if (!(count($contact_data['companies']))) { unset($contact_data['companies']); } break; case 'relations': unset($l_fields); if (!$this->trans_table['contact.contact_related.names_ordered']) { unset($contact_data['relations']); } $contact_data['relations'] = array(); if (!is_array($this->trans_table['contact.contact_related.names_ordered'])) { if (!($trans = $this->trans_table[$this->trans_table['contact.contact_related.names_ordered']])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } $contact_data['relations']['relation'.$i]['type'] = $l_type; $contact_data['relations']['relation'.$i]['names_ordered'] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } if (!(count($contact_data['relations']))) { unset($contact_data['relations']); } break; case 'addresses': unset($l_fields); $l_fields['address1'] = $this->trans_table['contact.address.address1']; $l_fields['address2'] = $this->trans_table['contact.address.address2']; $l_fields['complement'] = $this->trans_table['contact.address.complement']; $l_fields['address_other'] = $this->trans_table['contact.address.address_other']; $l_fields['postal_code'] = $this->trans_table['contact.address.postal_code']; $l_fields['po_box'] = $this->trans_table['contact.address.po_box']; $l_fields['id_city'] = $this->trans_table['contact.address.city.id_city']; $l_fields['city_name'] = $this->trans_table['contact.address.city.city_name']; $l_fields['city_timezone'] = $this->trans_table['contact.address.city.city_timezone']; $l_fields['city_geo_location'] = $this->trans_table['contact.address.city.city_geo_location']; $l_fields['id_state'] = $this->trans_table['contact.address.city.state.id_state']; $l_fields['state_name'] = $this->trans_table['contact.address.city.state.state_name']; $l_fields['state_symbol'] = $this->trans_table['contact.address.city.state.state_symbol']; $l_fields['id_country'] = $this->trans_table['contact.address.city.country.id_country']; $l_fields['country_name'] = $this->trans_table['contact.address.city.country.country_name']; $l_fields['address_is_default'] = $this->trans_table['contact.address.address_is_default']; $contact_data['addresses'] = array(); foreach($l_fields as $l_field => $l_value) { if (!is_array($l_value)) { if (!($trans = $this->trans_table[$l_value])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } $contact_data['addresses']['address'.$i]['type'] = $l_type; $contact_data['addresses']['address'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } else { $contact_data['addresses']['address1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } } if (!(count($contact_data['addresses']))) { unset($contact_data['addresses']); } break; case 'connections': $preferences = ExecMethod('contactcenter.ui_preferences.get_preferences'); if (!is_array($preferences)) { $preferences['personCardEmail'] = 1; $preferences['personCardPhone'] = 2; } unset($l_fields); $l_fields['connection_name'] = $this->trans_table['contact.connection.connection_name']; $l_fields['connection_value'] = $this->trans_table['contact.connection.connection_value']; $contact_data['connections'] = array(); foreach($l_fields as $l_field => $l_value) { if (!is_array($l_value)) { if (!($trans = $this->trans_table[$l_value])) { continue; } $i = 1; foreach($trans as $l_type => $l_type_fields) { if (!($contact[$l_type_fields[0]][0])) { continue; } switch ($l_type) { case 'email': $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardEmail']; break; default: $contact_data['connections']['connection'.$i]['id_type'] = $preferences['personCardPhone']; } $contact_data['connections']['connection'.$i]['type'] = $l_type; $contact_data['connections']['connection'.$i][$l_field] = utf8_decode($contact[$l_type_fields[0]][0]); $i++; } } else { $contact_data['connections']['connection1'][$l_field] = utf8_decode($contact[$l_value[0]][0]); } } if (!(count($contact_data['connections']))) { unset($contact_data['connections']); } break; case 'prefix': unset($l_fields); $l_fields = $this->trans_table['contact.prefixes.prefix']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['prefix']); continue; } $contact_data['prefix'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'suffix': unset($l_fields); $l_fields = $this->trans_table['contact.suffixes.suffix']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['suffix']); continue; } $contact_data['suffix'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'status': unset($l_fields); $l_fields = $this->trans_table['contact.status.status_name']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['status']); continue; } $contact_data['status'] = utf8_decode($contact[$l_fields[0]][0]); break; case 'photo': unset($l_fields); $l_fields = $this->trans_table['contact.photo']; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data['photo']); continue; } $contact_data['photo'] = $contact[$l_fields[0]][0]; break; default: unset($l_fields); $l_fields = $this->trans_table['contact.'.$field]; if (!$l_fields or !$contact[$l_fields[0]][0]) { unset($contact_data[$field]); continue; } if(count($contact[$l_fields[0]]) > 1) { $tmp = array(); foreach ($contact[$l_fields[0]] as $i => $j) { $tmp["$i"] = utf8_decode($j); } //$contact_data[$field] = $contact[$l_fields[0]]; $contact_data[$field] = $tmp; } else $contact_data[$field] = utf8_decode($contact[$l_fields[0]][0]); break; } } if (is_array($contact_data)) { $contacts[ldap_get_dn($ldap, $entry)] = $contact_data; } } return $contacts; } function get_multiple_entries ( $id_contacts, $fields, $other_data = false, $external=false ) { if (!is_array($id_contacts) or !is_array($fields) or ($other_data != false and !is_array($other_data))) { if (is_object($GLOBALS['phpgw']->log)) { $GLOBALS['phpgw']->log->message(array( 'text' => 'F-BadcontactcenterParam, wrong get_multiple_entry parameter type.', 'line' => __LINE__, 'file' => __FILE__)); $GLOBALS['phpgw']->log->commit(); } else { exit('Argument Error on:
File:'.__FILE__.'
Line:'.__LINE__.'
'); } } foreach ($id_contacts as $id) { $contacts[$id] = $this->get_single_entry($id,$fields,$external); } return $contacts; // SERPRO /*$contacts = array(); if ($other_data) { //TODO } $filter = $this->generate_filter($id_contacts); //$teste = $this->get_all_entries($filter, $fields); return $this->get_all_entries($filter, $fields);*/ } // CELEPAR function generate_filter($id_contacts) { if (($size = count($id_contacts))) { $contacts[$id] = $this->get_single_entry($id,$fields); } return $contacts; } // SERPRO /* function generate_filter($id_contacts) { if (($size = count($id_contacts))) { $filter = '(&(objectClass='.$this->src_info['obj'] . ')(|'; for ($i = 0; $i < $size; $i++) { // // Não utiliza mais a função ldap_explode, usa a expressão regular a seguir para pegar o primeiro // componente da dn // preg_match('/^(\w*=[^,]*),.*$/', $id_contacts[$i], $cn); // // Adicionados os str_replace para adicionar caracteres de escape em frente aos caracteres '(' e ')', // posteriormente poderá ser necessário substituir por uma expressão regular mais genérica. // if ($cn[1]) { // // Esta operação resolve o problema causado pela conversão de caracteres acentuados realizada // pela função ldap_explode_dn(). Talvez seja necessário utilizar esta tradução em outros lugares, // neste caso é mais apropriado colocar dentro de uma função. // //foreach($cn as $key=>$value){ // $cn[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value); //} $filter .= '(' . str_replace(')', '\)', str_replace('(','\(',$cn[1])) . ')'; } } $filter .= '))'; } return $filter; } */ function get_all_entries_ids () { $search_fields = array('contact.id_contact', 'contact.names_ordered'); $search_rules = array( 0 => array( 'field' => 'contact.names_ordered', 'type' => 'LIKE', 'value' => '%' ) ); $search_other = array('order' => 'contact.names_ordered'); $result_i = $this->find($search_fields, $search_rules, $search_other); if (is_array($result_i) and count($result_i)) { $result = array(); foreach($result_i as $result_part) { $result[] = $result_part['id_contact']; } return $result; } return null; } function get_relations ($id_contact,$extra=false) { } function get_addresses ( $id_contact,$extra=false ) { } function get_connections ( $id_contact,$extra=false ) { } function get_companies ( $id_contact, $extra=false ) { } function get_all_prefixes ( ) { } function get_all_suffixes ( ) { } function get_all_status ( ) { } function get_all_relations_types ( ) { } function get_all_addresses_types ( ) { } function get_all_connections_types ( ) { } function get_vcard ( $id_contact ) { } function get_global_tree ( $root ) { } function get_actual_brach ( ) { } function set_actual_branch ( $branch ) { } } ?>