From 7aa4a48ebe6c96de9b812b5625f1928bf2805f0b Mon Sep 17 00:00:00 2001 From: Miles Lott Date: Mon, 14 May 2001 01:50:45 +0000 Subject: [PATCH] This is work in progress using schema in api/doc/ldap --- .../inc/class.contacts_ldap_wip.inc.php | 848 ++++++++++++++++++ 1 file changed, 848 insertions(+) create mode 100644 addressbook/inc/class.contacts_ldap_wip.inc.php diff --git a/addressbook/inc/class.contacts_ldap_wip.inc.php b/addressbook/inc/class.contacts_ldap_wip.inc.php new file mode 100644 index 0000000000..92c949a6f6 --- /dev/null +++ b/addressbook/inc/class.contacts_ldap_wip.inc.php @@ -0,0 +1,848 @@ + * +* View and manipulate contact records using SQL * +* Copyright (C) 2001 Joseph Engo * +* -------------------------------------------------------------------------* +* 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.
+ 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' => 'streetaddress', + 'adr_one_locality' => 'l', + 'adr_one_region' => 'st', + 'adr_one_postalcode' => 'postalcode', + 'adr_one_countryname' => 'countryname', + '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 = 1; + + 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)) + { + $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) + { + $clean[$name] = $value; + //echo '
fieldname ="'.$name.'", value ="'.$value.'"'; + } + } + $ldap_fields = $clean; + //echo $dn; + //exit; + + $err = ldap_add($this->ldap, $dn, $clean); + + //$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]) + { + //echo "
".$fname." => ".$fvalue." was there"; + $err = ldap_modify($this->ldap,$dn,array($fvalue => $stock_fields[$fname])); + } + elseif (!$ldap_fields[0][$fvalue]) + { + //echo "
".$fname." not there"; + //$err = ldap_mod_add($this->ldap,$dn,array($fvalue => $stock_fields[$fname])); + } + } + } + + 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'], 'phpgwowner='.$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('phpgwowner' => $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'], 'phpgwowner='.$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; + } + } +?>