29 require_once
"Auth/Container.php";
33 require_once
"PEAR.php";
232 if (
false === extension_loaded(
'ldap')) {
280 if (isset($this->options[
'url']) && $this->options[
'url'] !=
'') {
282 $conn_params = array($this->options[
'url']);
285 $conn_params = array($this->options[
'host'], $this->options[
'port']);
288 if (($this->conn_id = @call_user_func_array(
'ldap_connect', $conn_params)) ===
false) {
290 $this->
log(
'LDAP ERROR: '.ldap_errno($this->conn_id).
': '.ldap_error($this->conn_id),
AUTH_LOG_DEBUG);
291 return PEAR::raiseError(
'Auth_Container_LDAP: Could not connect to server.', 41);
296 if (is_numeric($this->options[
'version']) && $this->options[
'version'] > 2) {
297 $this->
log(
"Switching to LDAP version {$this->options['version']}",
AUTH_LOG_DEBUG);
298 @ldap_set_option($this->conn_id, LDAP_OPT_PROTOCOL_VERSION, $this->options[
'version']);
301 if (isset($this->options[
'start_tls']) && $this->options[
'start_tls']) {
303 if (@ldap_start_tls($this->conn_id) ===
false) {
305 $this->
log(
'LDAP ERROR: '.ldap_errno($this->conn_id).
': '.ldap_error($this->conn_id),
AUTH_LOG_DEBUG);
312 if (is_bool($this->options[
'referrals'])) {
313 $this->
log(
"Switching LDAP referrals to " . (($this->options[
'referrals']) ?
'true' :
'false'),
AUTH_LOG_DEBUG);
314 if (@ldap_set_option($this->conn_id, LDAP_OPT_REFERRALS, $this->options[
'referrals']) ===
false) {
316 $this->
log(
'LDAP ERROR: '.ldap_errno($this->conn_id).
': '.ldap_error($this->conn_id),
AUTH_LOG_DEBUG);
321 if (strlen($this->options[
'binddn']) && strlen($this->options[
'bindpw'])) {
323 $bind_params = array($this->conn_id, $this->options[
'binddn'], $this->options[
'bindpw']);
326 $bind_params = array($this->conn_id);
330 if ((@call_user_func_array(
'ldap_bind', $bind_params)) ===
false) {
332 $this->
log(
'LDAP ERROR: '.ldap_errno($this->conn_id).
': '.ldap_error($this->conn_id),
AUTH_LOG_DEBUG);
334 return PEAR::raiseError(
"Auth_Container_LDAP: Could not bind to LDAP server.", 41);
353 $this->
log(
'disconnecting from server');
354 @ldap_unbind($this->conn_id);
374 if ($this->options[
'basedn'] ==
"" && $this->
_isValidLink()) {
377 $result_id = @ldap_read($this->conn_id,
"",
"(objectclass=*)", array(
"namingContexts"));
379 if (@ldap_count_entries($this->conn_id, $result_id) == 1) {
383 $entry_id = @ldap_first_entry($this->conn_id, $result_id);
384 $attrs = @ldap_get_attributes($this->conn_id, $entry_id);
385 $basedn = $attrs[
'namingContexts'][0];
389 $this->options[
'basedn'] = $basedn;
392 @ldap_free_result($result_id);
396 if ($this->options[
'basedn'] ==
"") {
397 return PEAR::raiseError(
"Auth_Container_LDAP: LDAP search base not specified!", 41);
413 if (is_resource($this->conn_id)) {
414 if (get_resource_type($this->conn_id) ==
'ldap link') {
431 $this->options[
'url'] =
'';
432 $this->options[
'host'] =
'localhost';
433 $this->options[
'port'] =
'389';
434 $this->options[
'version'] = 2;
435 $this->options[
'referrals'] =
true;
436 $this->options[
'binddn'] =
'';
437 $this->options[
'bindpw'] =
'';
438 $this->options[
'basedn'] =
'';
439 $this->options[
'userdn'] =
'';
440 $this->options[
'userscope'] =
'sub';
441 $this->options[
'userattr'] =
'uid';
442 $this->options[
'userfilter'] =
'(objectClass=posixAccount)';
443 $this->options[
'attributes'] = array(
'');
444 $this->options[
'attrformat'] =
'AUTH';
445 $this->options[
'group'] =
'';
446 $this->options[
'groupdn'] =
'';
447 $this->options[
'groupscope'] =
'sub';
448 $this->options[
'groupattr'] =
'cn';
449 $this->options[
'groupfilter'] =
'(objectClass=groupOfUniqueNames)';
450 $this->options[
'memberattr'] =
'uniqueMember';
451 $this->options[
'memberisdn'] =
true;
452 $this->options[
'start_tls'] =
false;
453 $this->options[
'debug'] =
false;
454 $this->options[
'try_all'] =
false;
470 foreach ($array as
$key => $value) {
471 if (array_key_exists(
$key, $this->options)) {
472 if (
$key ==
'attributes') {
473 if (is_array($value)) {
474 $this->options[
$key] = $value;
476 $this->options[
$key] = explode(
',', $value);
479 $this->options[
$key] = $value;
498 if (isset($array[
'useroc']))
499 $array[
'userfilter'] =
"(objectClass=".$array[
'useroc'].
")";
500 if (isset($array[
'groupoc']))
501 $array[
'groupfilter'] =
"(objectClass=".$array[
'groupoc'].
")";
502 if (isset($array[
'scope']))
503 $array[
'userscope'] = $array[
'scope'];
521 $function =
'ldap_list';
524 $function =
'ldap_read';
527 $function =
'ldap_search';
561 if (@ldap_get_option($this->conn_id, LDAP_OPT_PROTOCOL_VERSION, $ver) && $ver == 3) {
563 $username = utf8_encode($username);
567 $filter = sprintf(
'(&(%s=%s)%s)',
568 $this->options[
'userattr'],
570 $this->options[
'userfilter']);
573 $search_basedn = $this->options[
'userdn'];
574 if ($search_basedn !=
'' && substr($search_basedn, -1) !=
',') {
575 $search_basedn .=
',';
577 $search_basedn .= $this->options[
'basedn'];
580 $searchAttributes = $this->options[
'attributes'];
583 $func_params = array($this->conn_id, $search_basedn,
$filter, $searchAttributes);
588 $this->
log(
"Searching with $func_name and filter $filter in $search_basedn",
AUTH_LOG_DEBUG);
591 if (($result_id = @call_user_func_array($func_name, $func_params)) ===
false) {
593 }
elseif (@ldap_count_entries($this->conn_id, $result_id) >= 1) {
604 $entry_id = @ldap_first_entry($this->conn_id, $result_id);
607 $entry_id = @ldap_next_entry($this->conn_id, $entry_id);
608 if ($entry_id ===
false)
611 $user_dn = @ldap_get_dn($this->conn_id, $entry_id);
614 if (is_array($searchAttributes) && in_array(
'dn', $searchAttributes)) {
616 $this->_auth_obj->setAuthData(
'dn', $user_dn);
620 if ($attributes = @ldap_get_attributes($this->conn_id, $entry_id)) {
622 if (is_array($attributes) && isset($attributes[
'count']) &&
623 $attributes[
'count'] > 0) {
638 if ( strtoupper($this->options[
'attrformat']) ==
'AUTH' ) {
640 unset ($attributes[
'count']);
641 foreach ($attributes as $attributeName => $attributeValue ) {
642 if (is_int($attributeName))
continue;
643 if (is_array($attributeValue) && isset($attributeValue[
'count'])) {
644 unset ($attributeValue[
'count']);
646 if (count($attributeValue)<=1) $attributeValue = $attributeValue[0];
648 $this->_auth_obj->setAuthData($attributeName, $attributeValue);
654 $this->_auth_obj->setAuthData(
'attributes', $attributes);
658 @ldap_free_result($result_id);
666 if (@ldap_bind($this->conn_id, $user_dn,
$password)) {
670 if (strlen($this->options[
'group'])) {
673 $return = $this->
checkGroup(($this->options[
'memberisdn']) ? $user_dn : $username);
683 }
while ($this->options[
'try_all'] ==
true);
713 $filter = sprintf(
'(&(%s=%s)(%s=%s)%s)',
714 $this->options[
'groupattr'],
715 $this->options[
'group'],
716 $this->options[
'memberattr'],
718 $this->options[
'groupfilter']);
721 $search_basedn = $this->options[
'groupdn'];
722 if ($search_basedn !=
'' && substr($search_basedn, -1) !=
',') {
723 $search_basedn .=
',';
725 $search_basedn .= $this->options[
'basedn'];
727 $func_params = array($this->conn_id, $search_basedn,
$filter,
728 array($this->options[
'memberattr']));
731 $this->
log(
"Searching with $func_name and filter $filter in $search_basedn",
AUTH_LOG_DEBUG);
734 if (($result_id = @call_user_func_array($func_name, $func_params)) !=
false) {
735 if (@ldap_count_entries($this->conn_id, $result_id) == 1) {
736 @ldap_free_result($result_id);
757 $metas = array(
'\\',
'*',
'(',
')',
"\x00");
758 $quoted_metas = array(
'\\\\',
'\*',
'\(',
'\)',
"\\\x00");
759 return str_replace($metas, $quoted_metas, $filter_str);