| | |
| | | */ |
| | | class rcube_ldap extends rcube_addressbook |
| | | { |
| | | /** public properties */ |
| | | // public properties |
| | | public $primary_key = 'ID'; |
| | | public $groups = false; |
| | | public $readonly = true; |
| | |
| | | public $group_id = 0; |
| | | public $coltypes = array(); |
| | | |
| | | /** private properties */ |
| | | // private properties |
| | | protected $ldap; |
| | | protected $prop = array(); |
| | | protected $fieldmap = array(); |
| | |
| | | protected $ldap_result; |
| | | protected $mail_domain = ''; |
| | | protected $debug = false; |
| | | |
| | | /** |
| | | * Group objectclass (lowercase) to member attribute mapping |
| | | * |
| | | * @var array |
| | | */ |
| | | private static $group_types = array( |
| | | 'group' => 'member', |
| | | 'groupofnames' => 'member', |
| | | 'kolabgroupofnames' => 'member', |
| | | 'groupofuniquenames' => 'uniqueMember', |
| | | 'kolabgroupofuniquenames' => 'uniqueMember', |
| | | 'univentiongroup' => 'uniqueMember', |
| | | 'groupofurls' => null, |
| | | ); |
| | | |
| | | private $base_dn = ''; |
| | | private $groups_base_dn = ''; |
| | |
| | | $this->result = new rcube_result_set($entries['count'], ($this->list_page-1) * $this->page_size); |
| | | } |
| | | else { |
| | | $prop = $this->group_id ? $this->group_data : $this->prop; |
| | | $prop = $this->group_id ? $this->group_data : $this->prop; |
| | | $base_dn = $this->group_id ? $this->group_base_dn : $this->base_dn; |
| | | |
| | | // use global search filter |
| | | if (!empty($this->filter)) |
| | |
| | | |
| | | // exec LDAP search if no result resource is stored |
| | | if ($this->ready && !$this->ldap_result) |
| | | $this->ldap_result = $this->ldap->search($prop['base_dn'], $prop['filter'], $prop['scope'], $this->prop['attributes'], $prop); |
| | | $this->ldap_result = $this->ldap->search($base_dn, $prop['filter'], $prop['scope'], $this->prop['attributes'], $prop); |
| | | |
| | | // count contacts for this user |
| | | $this->result = $this->count(); |
| | |
| | | } |
| | | // We have a connection but no result set, attempt to get one. |
| | | else if ($this->ready) { |
| | | $prop = $this->group_id ? $this->group_data : $this->prop; |
| | | $prop = $this->group_id ? $this->group_data : $this->prop; |
| | | $base_dn = $this->group_id ? $this->group_base_dn : $this->base_dn; |
| | | |
| | | if (!empty($this->filter)) { // Use global search filter |
| | | $prop['filter'] = $this->filter; |
| | | } |
| | | |
| | | $count = $this->ldap->search($prop['base_dn'], $prop['filter'], $prop['scope'], array('dn'), $prop, true); |
| | | $count = $this->ldap->search($base_dn, $prop['filter'], $prop['scope'], array('dn'), $prop, true); |
| | | } |
| | | |
| | | return new rcube_result_set($count, ($this->list_page-1) * $this->page_size); |
| | |
| | | // change the group membership of the contact |
| | | if ($this->groups) { |
| | | $group_ids = $this->get_record_groups($dn); |
| | | foreach ($group_ids as $group_id => $group_prop) |
| | | { |
| | | foreach (array_keys($group_ids) as $group_id) { |
| | | $this->remove_from_group($group_id, $dn); |
| | | $this->add_to_group($group_id, $newdn); |
| | | } |
| | |
| | | if ($this->groups) { |
| | | $dn = self::dn_encode($dn); |
| | | $group_ids = $this->get_record_groups($dn); |
| | | foreach ($group_ids as $group_id => $group_prop) { |
| | | foreach (array_keys($group_ids) as $group_id) { |
| | | $this->remove_from_group($group_id, $dn); |
| | | } |
| | | } |
| | |
| | | { |
| | | // list of known attribute aliases |
| | | static $aliases = array( |
| | | 'gn' => 'givenname', |
| | | 'gn' => 'givenname', |
| | | 'rfc822mailbox' => 'email', |
| | | 'userid' => 'uid', |
| | | 'emailaddress' => 'email', |
| | | 'pkcs9email' => 'email', |
| | | 'userid' => 'uid', |
| | | 'emailaddress' => 'email', |
| | | 'pkcs9email' => 'email', |
| | | ); |
| | | |
| | | list($name, $limit) = explode(':', $namev, 2); |
| | |
| | | */ |
| | | private static function is_group_entry($entry) |
| | | { |
| | | return array_intersect( |
| | | array('group', 'groupofnames', 'kolabgroupofnames', 'groupofuniquenames', |
| | | 'kolabgroupofuniquenames', 'groupofurls', 'univentiongroup'), |
| | | array_map('strtolower', (array)$entry['objectclass']) |
| | | ); |
| | | $classes = array_map('strtolower', (array)$entry['objectclass']); |
| | | |
| | | return count(array_intersect(array_keys(self::$group_types), $classes)) > 0; |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | $base_dn = $this->groups_base_dn; |
| | | $filter = $this->prop['groups']['filter']; |
| | | $scope = $this->prop['groups']['scope']; |
| | | $name_attr = $this->prop['groups']['name_attr']; |
| | | $email_attr = $this->prop['groups']['email_attr'] ? $this->prop['groups']['email_attr'] : 'mail'; |
| | | $sort_attrs = $this->prop['groups']['sort'] ? (array)$this->prop['groups']['sort'] : array($name_attr); |
| | |
| | | } |
| | | |
| | | $attrs = array_unique(array('dn', 'objectClass', $name_attr, $email_attr, $sort_attr)); |
| | | $ldap_data = $ldap->search($base_dn, $filter, $this->prop['groups']['scope'], $attrs, $this->prop['groups']); |
| | | $ldap_data = $ldap->search($base_dn, $filter, $scope, $attrs, $this->prop['groups']); |
| | | |
| | | if ($ldap_data === false) { |
| | | return array(); |
| | |
| | | $name_attr = $this->prop['groups']['name_attr'] ? $this->prop['groups']['name_attr'] : 'cn'; |
| | | $member_attr = $this->get_group_member_attr(); |
| | | $add_filter = ''; |
| | | |
| | | if ($member_attr != 'member' && $member_attr != 'uniqueMember') |
| | | $add_filter = "($member_attr=$contact_dn)"; |
| | | $filter = strtr("(|(member=$contact_dn)(uniqueMember=$contact_dn)$add_filter)", array('\\' => '\\\\')); |
| | |
| | | $entry['dn'] = $ldap_data->get_dn(); |
| | | $group_name = $entry[$name_attr][0]; |
| | | $group_id = self::dn_encode($entry['dn']); |
| | | $groups[$group_id] = array('ID' => $group_id, 'name' => $group_name, 'dn' => $entry['dn']); |
| | | $groups[$group_id] = $group_name; |
| | | } |
| | | |
| | | return $groups; |
| | | } |
| | | |
| | |
| | | |
| | | if (!empty($object_classes)) { |
| | | foreach ((array)$object_classes as $oc) { |
| | | switch (strtolower($oc)) { |
| | | case 'group': |
| | | case 'groupofnames': |
| | | case 'kolabgroupofnames': |
| | | return 'member'; |
| | | |
| | | case 'groupofuniquenames': |
| | | case 'kolabgroupofuniquenames': |
| | | case 'univentiongroup': |
| | | return 'uniqueMember'; |
| | | if ($attr = self::$group_types[strtolower($oc)]) { |
| | | return $attr; |
| | | } |
| | | } |
| | | } |