* * View and manipulate contact records using LDAP * * -------------------------------------------------------------------------* * This library is part of the phpGroupWare API * * http://www.phpgroupware.org/api * * ------------------------------------------------------------------------ * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 2.1 of the License, * * or any later version. * * This library is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \**************************************************************************/ /* $Id$ */ /*! @class contacts @abstract Contact List System @discussion Author: jengo/Milosch
This class provides a contact database scheme.
It attempts to be based on the vcard 2.1 standard, with mods as needed to make for more reasonable sql storage.
The LDAP schema used here may require installation of schema files available in the phpgwapi/doc/ldap dir. Please see the README file there. Syntax: CreateObject('phpgwapi.contacts');
Example1: $contacts = CreateObject('phpgwapi.contacts'); */ class contacts_ { var $db; var $ldap; var $nextid; var $std_table=''; var $ext_table='phpgw_addressbook_extra'; var $account_id; var $stock_contact_fields; // This is an array of almost the fields in the phpgw_addressbook table var $non_contact_fields; // Here are the rest: d,owner,access,lid,tid,cat_id var $email_types; // VCard email type array var $total_records; // This will contain numrows for data retrieved var $grants; // This holds all of the users that have granted access to there entrys function contacts_() { global $phpgw, $phpgw_info; $this->db = $phpgw->db; $this->ldap = $phpgw->common->ldapConnect( $phpgw_info['server']['ldap_contact_host'], $phpgw_info['server']['ldap_contact_dn'], $phpgw_info['server']['ldap_contact_pw'] ); $this->account_id = $phpgw_info['user']['account_id']; $this->grants = $phpgw->acl->get_grants('addressbook'); // The left side are the array elements used throughout phpgw, right side are the ldap attributes $this->stock_contact_fields = array( 'fn' => 'cn', // 'prefix given middle family suffix' 'n_given' => 'givenname', // firstname 'n_family' => 'sn', // lastname 'n_middle' => 'phpgwmiddlename', 'n_prefix' => 'phpgwprefix', 'n_suffix' => 'phpgwsuffix', 'sound' => 'phpgwaudio', 'bday' => 'phpgwbirthday', 'note' => 'description', 'tz' => 'phpgwtz', 'geo' => 'phpgwgeo', 'url' => 'phpgwurl', 'pubkey' => 'phpgwpublickey', 'org_name' => 'o', // company 'org_unit' => 'ou', // division 'title' => 'title', 'adr_one_street' => 'street', 'adr_one_locality' => 'l', 'adr_one_region' => 'st', 'adr_one_postalcode' => 'postalcode', 'adr_one_countryname' => 'co', 'adr_one_type' => 'phpgwadronetype', // address is domestic/intl/postal/parcel/work/home 'label' => 'phpgwaddresslabel', // address label 'adr_two_street' => 'phpgwadrtwostreet', 'adr_two_locality' => 'phpgwadrtwolocality', 'adr_two_region' => 'phpgwadrtworegion', 'adr_two_postalcode' => 'phpgwadrtwopostalcode', 'adr_two_countryname' => 'phpgwadrtwocountryname', 'adr_two_type' => 'phpgwadrtwotype', // address is domestic/intl/postal/parcel/work/home 'tel_work' => 'telephonenumber', 'tel_home' => 'homephone', 'tel_voice' => 'phpgwvoicetelephonenumber', 'tel_fax' => 'facsimiletelephonenumber', 'tel_msg' => 'phpgwmsgtelephonenumber', 'tel_cell' => 'phpgwcelltelephonenumber', 'tel_pager' => 'phpgwpagertelephonenumber', 'tel_bbs' => 'phpgwbbstelephonenumber', 'tel_modem' => 'phpgwmodemtelephonenumber', 'tel_car' => 'phpgwmobiletelephonenumber', 'tel_isdn' => 'phpgwisdnphonenumber', 'tel_video' => 'phpgwvideophonenumber', 'tel_prefer' => 'phpgwpreferphone', // home, work, voice, etc 'email' => 'mail', 'email_type' => 'phpgwmailtype', //'INTERNET','CompuServe',etc... 'email_home' => 'phpgwmailhome', 'email_home_type' => 'phpgwmailhometype' //'INTERNET','CompuServe',etc... ); $this->non_contact_fields = array( 'id' => 'uidnumber', 'lid' => 'uid', 'tid' => 'phpgwcontacttypeid', 'cat_id' => 'phpgwcontactcatid', 'access' => 'phpgwcontactaccess', 'owner' => 'phpgwcontactowner' ); /* Used to flag an address as being: domestic OR international(default) parcel(default) postal(default) work(default) OR home */ $this->adr_types = array( 'dom' => lang('Domestic'), 'intl' => lang('International'), 'parcel' => lang('Parcel'), 'postal' => lang('Postal') ); // Used to set preferphone field $this->tel_types = array( 'work' => 'work', 'home' => 'home', 'voice' => 'voice', 'fax' => 'fax', 'msg' => 'msg', 'cell' => 'cell', 'pager' => 'pager', 'bbs' => 'bbs', 'modem' => 'modem', 'car' => 'car', 'isdn' => 'isdn', 'video' => 'video' ); // Used to set mail_type fields $this->email_types = array( 'INTERNET' => 'INTERNET', 'CompuServe' => 'CompuServe', 'AOL' => 'AOL', 'Prodigy' => 'Prodigy', 'eWorld' => 'eWorld', 'AppleLink' => 'AppleLink', 'AppleTalk' => 'AppleTalk', 'PowerShare' => 'PowerShare', 'IBMMail' => 'IBMMail', 'ATTMail' => 'ATTMail', 'MCIMail' => 'MCIMail', 'X.400' => 'X.400', 'TLX' => 'TLX' ); } // send this the id and whatever fields you want to see function read_single_entry($id,$fields = '') { global $phpgw_info; if (!$fields || empty($fields)) { $fields = $this->stock_contact_fields; } list($stock_fields,$stock_fieldnames,$extra_fields) = $this->split_stock_and_extras($fields); if (count($stock_fieldnames)) { $t_fields = "," . implode(",",$stock_fieldnames); if ($t_fields == ",") { unset($t_fields); } } $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'uidnumber='.$id); $ldap_fields = ldap_get_entries($this->ldap, $sri); $return_fields[0]['id'] = $ldap_fields[0]['uidnumber'][0]; $return_fields[0]['lid'] = $ldap_fields[0]['uid'][0]; $return_fields[0]['tid'] = $ldap_fields[0]['phpgwcontacttypeid'][0]; $return_fields[0]['owner'] = $ldap_fields[0]['phpgwcontactowner'][0]; $return_fields[0]['access'] = $ldap_fields[0]['phpgwcontactaccess'][0]; $return_fields[0]['cat_id'] = $ldap_fields[0]['phpgwcontactcatid'][0]; if (gettype($stock_fieldnames) == 'array') { while(list($name,$value)=each($stock_fieldnames)) { $return_fields[0][$name] = $ldap_fields[0][$value][0]; } } // Setup address type fields if ($return_fields[0]['adr_one_type']) { $one_type = $return_fields[0]['adr_one_type']; reset($this->adr_types); while (list($name,$val) = each($this->adr_types)) { eval("if (strstr(\$one_type,\$name)) { \$return_fields[0][\"one_\$name\"] = \"on\"; }"); } } if ($return_fields[0]["adr_two_type"]) { $two_type = $return_fields[0]['adr_two_type']; reset($this->adr_types); while (list($name,$val) = each($this->adr_types)) { eval("if (strstr(\$two_type,\$name)) { \$return_fields[0][\"two_\$name\"] = \"on\"; }"); } } $this->db->query("select contact_name,contact_value from $this->ext_table where contact_id='" . $id . "'",__LINE__,__FILE__); while ($this->db->next_record()) { // If its not in the list to be returned, don't return it. // This is still quicker then 5(+) separate queries if ($extra_fields[$this->db->f('contact_name')]) { $return_fields[0][$this->db->f('contact_name')] = $this->db->f('contact_value'); } } return $return_fields; } function read_last_entry($fields = '') { global $phpgw_info; if (!$fields || empty($fields)) { $fields = $this->stock_contact_fields; } list($stock_fields,$stock_fieldnames,$extra_fields) = $this->split_stock_and_extras($fields); if (count($stock_fieldnames)) { $t_fields = "," . implode(",",$stock_fieldnames); if ($t_fields == ",") { unset($t_fields); } } $id = $this->nextid; if ($id == -1) { $id = 1; } $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'uidnumber='.$id); $ldap_fields = ldap_get_entries($this->ldap, $sri); $return_fields[0]['id'] = $ldap_fields[0]['uidnumber'][0]; $return_fields[0]['lid'] = $ldap_fields[0]['uid'][0]; $return_fields[0]['tid'] = $ldap_fields[0]['phpgwcontacttypeid'][0]; $return_fields[0]['owner'] = $ldap_fields[0]['phpgwcontactowner'][0]; $return_fields[0]['access'] = $ldap_fields[0]['phpgwcontactaccess'][0]; $return_fields[0]['cat_id'] = $ldap_fields[0]['phpgwcontactcatid'][0]; if (gettype($stock_fieldnames) == 'array') { while(list($name,$value)=each($stock_fieldnames)) { $return_fields[0][$name] = $ldap_fields[0][$value][0]; } } // Setup address type fields if ($return_fields[0]['adr_one_type']) { $one_type = $return_fields[0]['adr_one_type']; reset($this->adr_types); while (list($name,$val) = each($this->adr_types)) { eval("if (strstr(\$one_type,\$name)) { \$return_fields[0][\"one_\$name\"] = \"on\"; }"); } } if ($return_fields[0]['adr_two_type']) { $two_type = $return_fields[0]['adr_two_type']; reset($this->adr_types); while (list($name,$val) = each($this->adr_types)) { eval("if (strstr(\$two_type,\$name)) { \$return_fields[0][\"two_\$name\"] = \"on\"; }"); } } $this->db->query("select contact_name,contact_value from $this->ext_table where contact_id='" . $id . "'",__LINE__,__FILE__); while ($this->db->next_record()) { // If its not in the list to be returned, don't return it. // This is still quicker then 5(+) separate queries if ($extra_fields[$this->db->f('contact_name')]) { $return_fields[0][$this->db->f('contact_name')] = $this->db->f('contact_value'); } } return $return_fields; } // send this the range, query, sort, order and whatever fields you want to see // 'rights' and 'access' are unused at this time function read($start=0,$offset=0,$fields="",$query="",$filter="",$sort="",$order="") { global $phpgw,$phpgw_info; if (!$fields || empty($fields)) { $fields = $this->stock_contact_fields; } $DEBUG = 0; list($stock_fields,$stock_fieldnames,$extra_fields) = $this->split_stock_and_extras($fields); $filterfields = array(); // turn filter's a=b,c=d OR a=b into an array if ($filter) { if ($DEBUG) { echo "DEBUG - Inbound filter is: #".$filter."#"; } $filterarray = split(',',$filter); if ($filterarray[1]) { $i=0; for ($i=0;$iDEBUG - Filter strings: #".$this->non_contact_fields[$name]."# => #".$value."#"; } $filterfields[$this->non_contact_fields[$name]] = $value; } } } else { list($name,$value) = split('=',$filter); if ($DEBUG) { echo "
DEBUG - Filter strings: #".$this->non_contact_fields[$name]."# => #".$value."#"; } $filterfields = array($this->non_contact_fields[$name] => $value); } } else { $filterfields += array('phpgwcontacttypeid' => 'n'); if ($DEBUG) { echo "
DEBUG - Filter strings: #phpgwtypeid=n#"; } } if (is_array($this->grants)) { $filterfields += array('phpgwcontactaccess' => 'public'); $grants = $this->grants; while (list($user) = each($grants)) { if ($DEBUG) { echo "
DEBUG - Grant from owner: ".$user; } $filterfields += array('phpgwcontactowner' => $user); } } //if ($DEBUG) { // while(list($name,$value) = each($filterfields)) { // echo "
DEBUG - Filter strings: #".$name.",".$value."#"; // } //} if (!$sort) { $sort = "ASC"; } if (!$order) { $order = "n_family"; } if ($DEBUG && $order) { echo "
DEBUG - ORDER by $order"; } if ($query) { $ldap_fields = array(); $total = 0; // Query each field seperately instead of using ldap OR search. // It seems PHP cannot do this correctly. reset($stock_fieldnames); while (list($name,$value) = each($stock_fieldnames) ) { $lquery = $value.'=*'.$query.'*'; //echo $lquery; exit; $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], $lquery); // append the results $ldap_fields += ldap_get_entries($this->ldap, $sri); // add the # rows to our total $total = $total + ldap_count_entries($this->ldap, $sri); } if ($filterfields) { $ldap_fields = $this->filter_ldap($ldap_fields,$filterfields,$DEBUG); } //echo '
first total="'.$total.'"'; // Now, remove duplicate rows //if (floor(phpversion()) == 4) { // $tmp = array_unique($ldap_fields); // $ldap_fields = $tmp; // } else { $ldap_fields = $this->asortbyindex($ldap_fields,'uidnumber'); reset($ldap_fields); if (count($ldap_fields) > 0) { for ($a = 0; $a < count($ldap_fields); $a++) { if ($ldap_fields[$a]) { //echo '
comparing "'.$ldap_fields[$a]['uidnumber'][0] // .'" to "'.$ldap_fields[$a - 1]['uidnumber'][0].'"'; if (($ldap_fields[$a]['uidnumber'][0] <> $ldap_fields[$a - 1]['uidnumber'][0])) { $uniquearray[$a] = $ldap_fields[$a]; } else { //echo '
deleting "'.$ldap_fields[$a -1 ]['uidnumber'][0]; } } } $ldap_fields = $uniquearray; } // } // end version check $this->total_records = count($ldap_fields); //echo '
total="'.$this->total_records.'"'; } else { $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'phpgwcontactowner=*'); $ldap_fields = ldap_get_entries($this->ldap, $sri); $this->total_records = ldap_count_entries($this->ldap, $sri); if ($filterfields) { $ldap_fields = $this->filter_ldap($ldap_fields,$filterfields,$DEBUG); } } // Use shared sorting routines, based on sort and order if ($sort == 'ASC') { $ldap_fields = $this->asortbyindex($ldap_fields, $this->stock_contact_fields[$order]); } else { $ldap_fields = $this->arsortbyindex($ldap_fields, $this->stock_contact_fields[$order]); } // This logic allows you to limit rows, or not. // The export feature, for example, does not limit rows. // This way, it can retrieve all rows at once. if ($start && $offset) { $limit = $start + $offset;; } elseif ($start && !$offset) { $limit = $start; } elseif(!$start && !$offset) { $limit = $this->total_records; } else { #(!$start && $offset) { $start = 0; $limit = $offset; } //echo '('.$start.','.$limit.')'; @reset($ldap_fields); $j=0; for ($i=$start;$i<$limit;$i++) { if ($i<$this->total_records && $ldap_fields[$i]['uid'][0]) { //echo '
j:'.$j; //echo '
i:'.$i; // unique id, lid for group/account records, // type id (g/u) for groups/accounts, and // id of owner/parent for the record $return_fields[$j]['id'] = $ldap_fields[$i]['uidnumber'][0]; $return_fields[$j]['lid'] = $ldap_fields[$i]['uid'][0]; $return_fields[$j]['tid'] = $ldap_fields[$i]['phpgwcontacttypeid'][0]; $return_fields[$j]['owner'] = $ldap_fields[$i]['phpgwcontactowner'][0]; $return_fields[$j]['access'] = $ldap_fields[$i]['phpgwcontactaccess'][0]; $return_fields[$j]['cat_id'] = $ldap_fields[$i]['phpgwcontactcatId'][0]; //echo '
uidnumber: "'.$ldap_fields[$i]['uidnumber'][0].'"'; //echo '
tid: "'.$ldap_fields[$i]['phpgwcontacttypeid'][0].'"'; //echo '
owner: "'.$ldap_fields[$i]['phpgwcontactowner'][0].'"'; //echo '
access: "'.$ldap_fields[$i]['phpgwcontactaccess'][0].'"'; //echo '
catid: "'.$ldap_fields[$i]['phpgwcontactcatid'][0].'"'; if (gettype($stock_fieldnames) == 'array') { reset($stock_fieldnames); while (list($f_name,$f_value) = each($stock_fieldnames)) { $return_fields[$j][$f_name] = $ldap_fields[$i][$f_value][0]; } reset($stock_fieldnames); } $this->db->query("SELECT contact_name,contact_value FROM $this->ext_table WHERE contact_id='" . $ldap_fields[$i]['id'] . "'",__LINE__,__FILE__); while ($this->db->next_record()) { // If its not in the list to be returned, don't return it. // This is still quicker then 5(+) separate queries if ($extra_fields[$this->db->f('contact_name')]) { $return_fields[$j][$this->db->f('contact_name')] = $this->db->f('contact_value'); } } $j++; } } return $return_fields; } function add($owner,$fields,$access='private',$cat_id='0',$tid='n') { global $phpgw,$phpgw_info; if (!$phpgw_info['server']['ldap_contact_context']) { return False; } list($stock_fields,$stock_fieldnames,$extra_fields) = $this->split_stock_and_extras($fields); $free = 0; $this->nextid = $phpgw->common->last_id('contacts'); // Loop until we find a free id while (!$free) { $ldap_fields = ''; $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'uidnumber='.$this->nextid); $ldap_fields = ldap_get_entries($this->ldap, $sri); if ($ldap_fields[0]['dn'][0]) { $this->nextid = $phpgw->common->next_id('contacts'); } else { $free = True; } } $ldap_fields = ''; if (gettype($stock_fieldnames) == 'array') { while(list($name,$value)=each($stock_fieldnames)) { if ($stock_fields[$name] != '') { $ldap_fields[$value] = $stock_fields[$name]; } } } $time = gettimeofday(); $ldap_fields['uid'] = time().$time['usec'].':'.$ldap_fields['givenname']; $dn = 'uid=' . $ldap_fields['uid'].',' . $phpgw_info['server']['ldap_contact_context']; $ldap_fields['phpgwcontacttypeid'] = $tid; $ldap_fields['phpgwcontactowner'] = $owner; $ldap_fields['phpgwcontactaccess'] = $access; $ldap_fields['phpgwcontactcatid'] = $cat_id; $ldap_fields['uidnumber'] = $this->nextid; //$ldap_fields['objectclass'][0] = 'person'; $ldap_fields['objectclass'][0] = 'organizationalPerson'; $ldap_fields['objectclass'][1] = 'inetOrgPerson'; $ldap_fields['objectclass'][2] = 'phpgwContact'; /* @reset($ldap_fields); while (list($name,$value) = each($ldap_fields) ) { if ($value) { echo '
fieldname ="'.$name.'", value ="'.$value.'"'; } } exit; */ $err = ldap_add($this->ldap, $dn, $ldap_fields); //$this->db->unlock(); if (count($extra_fields)) { while (list($name,$value) = each($extra_fields)) { $this->db->query("insert into $this->ext_table values ('".$this->nextid."','" . $this->account_id . "','" . addslashes($name) . "','" . addslashes($value) . "')",__LINE__,__FILE__); } } } function field_exists($id,$field_name) { $this->db->query("select count(*) from $this->ext_table where contact_id='$id' and contact_name='" . addslashes($field_name) . "'",__LINE__,__FILE__); $this->db->next_record(); return $this->db->f(0); } function add_single_extra_field($id,$owner,$field_name,$field_value) { $this->db->query("insert into $this->ext_table values ($id,'$owner','" . addslashes($field_name) . "','" . addslashes($field_value) . "')",__LINE__,__FILE__); } function delete_single_extra_field($id,$field_name) { $this->db->query("delete from $this->ext_table where contact_id='$id' and contact_name='" . addslashes($field_name) . "'",__LINE__,__FILE__); } function update($id,$owner,$fields,$access='private',$cat_id='0',$tid='n') { global $phpgw_info; $nonfields = $this->non_contact_fields; if (!$phpgw_info['server']['ldap_contact_context']) { return False; } // First make sure that id number exists $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'uidnumber='.$id); $ldap_fields = ldap_get_entries($this->ldap, $sri); if ($ldap_fields[0]['dn']) { $dn = $ldap_fields[0]['dn']; list($stock_fields,$stock_fieldnames,$extra_fields) = $this->split_stock_and_extras($fields); if (gettype($stock_fieldnames) == 'array') { // Check each value, add our extra attributes if they are missing, and // otherwise fix the entry while we can. // // Verify uidnumber $stock_fields['id'] = $id; if (empty($ldap_fields[0]['uidnumber'])) { $err = ldap_modify($this->ldap,$dn,array('uidnumber' => $stock_fields['uidnumber'])); } elseif (!$ldap_fields[0]['uidnumber']) { $err = ldap_mod_add($this->ldap,$dn,array('uidnumber' => $stock_fields['uidnumber'])); } // Verify uid $uids = split(',',$dn); $stock_fields['lid'] = $uids[0]; if (empty($ldap_fields[0]['uid'])) { $err = ldap_modify($this->ldap,$dn,array('uid' => $stock_fields['lid'])); } elseif (!$ldap_fields[0]['uid']) { $err = ldap_mod_add($this->ldap,$dn,array('uid' => $stock_fields['lid'])); } // Verify objectclasses are there if (empty($ldap_fields[0]['objectclass'])) { //$stock_fields['objectclass'][0] = 'person'; $stock_fields['objectclass'][0] = 'organizationalPerson'; $stock_fields['objectclass'][1] = 'inetOrgPerson'; $stock_fields['objectclass'][2] = 'phpgwContact'; $err = ldap_modify($this->ldap,$dn,array('objectclass' => $stock_fields['objectclass'])); } elseif (!$ldap_fields[0]['objectclass']) { //$stock_fields['objectclass'][0] = 'person'; $stock_fields['objectclass'][0] = 'organizationalPerson'; $stock_fields['objectclass'][1] = 'inetOrgPerson'; $stock_fields['objectclass'][2] = 'phpgwContact'; $err = ldap_mod_add($this->ldap,$dn,array('objectclass' => $stock_fields['objectclass'])); } // Verify owner $stock_fields['owner'] = $owner; if (empty($ldap_fields[0]['phpgwcontactowner'])) { $err = ldap_modify($this->ldap,$dn,array('phpgwcontactowner' => $stock_fields['owner'])); } elseif (!$ldap_fields[0]['phpgwcontactowner']) { $err = ldap_mod_add($this->ldap,$dn,array('phpgwcontactowner' => $stock_fields['owner'])); } // Verify access $stock_fields['access'] = $access; if (empty($ldap_fields[0]['phpgwcontactaccess'])) { $err = ldap_modify($this->ldap,$dn,array('phpgwcontactaccess' => $stock_fields['access'])); } elseif (!$ldap_fields[0]['phpgwcontactaccess']) { $err = ldap_mod_add($this->ldap,$dn,array('phpgwcontactaccess' => $stock_fields['access'])); } // Verify cat_id $stock_fields['cat_id'] = $cat_id; if (empty($ldap_fields[0]['phpgwcontactcatid'])) { $err = ldap_modify($this->ldap,$dn,array('phpgwcontactcatid' => $stock_fields['cat_id'])); } elseif (!$ldap_fields[0]['phpgwcontactcatid']) { $err = ldap_mod_add($this->ldap,$dn,array('phpgwcontactcatid' => $stock_fields['cat_id'])); } // Verify tid $stock_fields['tid'] = $tid; if (empty($ldap_fields[0]['phpgwcontacttypeid'])) { $err = ldap_modify($this->ldap,$dn,array('phpgwcontacttypeid' => $stock_fields['tid'])); } elseif (!$ldap_fields[0]['phpgwcontacttypeid']) { $err = ldap_mod_add($this->ldap,$dn,array('phpgwcontacttypeid' => $stock_fields['tid'])); } // OK, just mod the data already $allfields = $stock_fieldnames + $nonfields; while ( list($fname,$fvalue) = each($allfields) ) { //if ($ldap_fields[0][$fvalue]) if ($ldap_fields[0][$fvalue] && $stock_fields[$fname] && $ldap_fields[0][$fvalue][0] != $stock_fields[$fname] ) { //echo "
".$fname." => ".$fvalue." was there"; $err = ldap_modify($this->ldap,$dn,array($fvalue => $stock_fields[$fname])); } //elseif (!$ldap_fields[0][$fvalue]) elseif (!$ldap_fields[0][$fvalue] && $stock_fields[$fname]) { //echo "
".$fname." not there - '".$fvalue."'"; $err = ldap_mod_add($this->ldap,$dn,array($fvalue => $stock_fields[$fname])); } elseif ($ldap_fields[0][$fvalue] && !$stock_fields[$fname]) { //echo "
".$fname." gone... deleting - '".$fvalue."'"; // NOTE: we use the ldap_fields because we need to send the // _ORIGINAL_ contents as the value. see: // http://www.php.net/manual/en/function.ldap-mod-del.php $err = ldap_mod_del($this->ldap,$dn,array($fvalue => $ldap_fields[0][$fvalue][0])); } // Else we have nothing to do. } } while (list($x_name,$x_value) = each($extra_fields)) { if ($this->field_exists($id,$x_name)) { if (! $x_value) { $this->delete_single_extra_field($id,$x_name); } else { $this->db->query("update $this->ext_table set contact_value='" . addslashes($x_value) . "',contact_owner='$owner' where contact_name='" . addslashes($x_name) . "' and contact_id='$id'",__LINE__,__FILE__); } } else { $this->add_single_extra_field($id,$owner,$x_name,$x_value); } } } else { return False; } } // Used by admin to change ownership on account delete function change_owner($old_owner='',$new_owner='') { if (!($new_owner && $old_owner)) { return False; } $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'phpgwcontactowner='.$old_owner); $ldap_fields = ldap_get_entries($this->ldap, $sri); $entry = ""; while (list($null,$entry) = each($ldap_fields)) { $err = ldap_modify($this->ldap,$dn,array('phpgwcontactowner' => $new_owner)); } $this->db->query("update $this->ext_table set contact_owner='$new_owner' WHERE contact_owner=$owner",__LINE__,__FILE__); return; } // This is where the real work of delete() is done, shared class file contains calling function function delete_($id) { global $phpgw_info; if (!$phpgw_info['server']['ldap_contact_context']) { return False; } $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'uidnumber='.$id); $ldap_fields = ldap_get_entries($this->ldap, $sri); if ($ldap_fields[0]['dn']) { $err = ldap_delete($this->ldap,$ldap_fields[0]['dn']); $this->db->query("delete from $this->ext_table where contact_id='$id' and contact_owner='" . $this->account_id . "'",__LINE__,__FILE__); } else { return False; } } // This is for the admin script deleteaccount.php function delete_all($owner=0) { global $phpgw_info; if (!$phpgw_info['server']['ldap_contact_context']) { return False; } if ($owner) { $sri = ldap_search($this->ldap, $phpgw_info['server']['ldap_contact_context'], 'phpgwcontactowner='.$owner); $ldap_fields = ldap_get_entries($this->ldap, $sri); $entry = ''; while (list($null,$entry) = each($ldap_fields)) { $err = ldap_delete($this->ldap,$entry['dn']); } $this->db->query("DELETE FROM $this->ext_table WHERE contact_owner=$owner",__LINE__,__FILE__); } return; } } ?>