'__public__', 'cal_lastname' => '', 'cal_firstname' => '', 'cal_is_admin' => 'N', 'cal_email' => '', 'cal_password' => '', 'cal_fullname' => $PUBLIC_ACCESS_FULLNAME]; if ( $publicOnly ) return $ret; if ($r = connect_and_bind ()) { $sr = @ldap_search ( $ds, $ldap_base_dn, $ldap_user_filter, $ldap_user_attr ); if (!$sr) { $error = 'Error searching LDAP server: ' . ldap_error( $ds ); } else { // ldap_sort() was removed in PHP 8.0; results are sorted by usort() below. $info = @ldap_get_entries( $ds, $sr ); for ( $i = 0; $i < $info['count']; $i++ ) { $ret[$count++] = [ 'cal_login' => $info[$i][$ldap_user_attr[0]][0], 'cal_lastname' => $info[$i][$ldap_user_attr[1]][0], 'cal_firstname' => $info[$i][$ldap_user_attr[2]][0], 'cal_email' => $info[$i][$ldap_user_attr[4]][0], 'cal_is_admin' => user_is_admin ($info[$i][$ldap_user_attr[0]][0],$Admins), 'cal_fullname' => $info[$i][$ldap_user_attr[3]][0]]; } @ldap_free_result($sr); } @ldap_close ( $ds ); } usort ( $ret, 'sort_users'); return $ret; } // Test if a user is an admin, that is: if the user is a member of a special // group in the LDAP Server // params: // $values - the login name // returns: Y if user is admin, N if not function user_is_admin ($values,$Admins) { if ( ! $Admins ) { return 'N'; } else if (in_array ($values, $Admins)) { return 'Y'; } else { return 'N'; } } // Searches $ldap_admin_group_name and returns an array of the group members. // Do this search only once per request. // returns: array of admins function get_admins () { global $cached_admins, $ds, $error, $ldap_admin_group_attr, $ldap_admin_group_name, $ldap_admin_group_type; if ( ! empty ( $cached_admins ) ) return $cached_admins; $cached_admins = []; if ($r = connect_and_bind ()) { $search_filter = "($ldap_admin_group_attr=*)"; $sr = @ldap_search ( $ds, $ldap_admin_group_name, $search_filter, [$ldap_admin_group_attr] ); if (!$sr) { $error = 'Error searching LDAP server: ' . ldap_error( $ds ); } else { $admins = ldap_get_entries( $ds, $sr ); for( $x = 0; $x < $admins[0][$ldap_admin_group_attr]['count']; $x ++ ) { if ($ldap_admin_group_type != 'posixgroup') { $cached_admins[] = stripdn($admins[0][$ldap_admin_group_attr][$x]); } else { $cached_admins[] = $admins[0][$ldap_admin_group_attr][$x]; } } @ldap_free_result($sr); } @ldap_close ( $ds ); } return $cached_admins; } // Strip everything but the username (uid) from a dn. // params: // $dn - the dn you want to strip the uid from. // returns: string - userid // // ex: stripdn(uid=jeffh,ou=people,dc=example,dc=com) returns jeffh function stripdn( $dn ) { list( $uid, $trash ) = explode( ',', $dn, 2 ); list( $trash, $user ) = explode( '=', $uid ); return $user; } // Connects and binds to the LDAP server // Tries to connect as $ldap_admin_dn if we set it. // returns: bind result or false function connect_and_bind () { global $ds, $error, $ldap_admin_dn, $ldap_admin_pwd, $ldap_port, $ldap_server, $ldap_start_tls, $ldap_version, $set_ldap_version; if ( ! function_exists ( 'ldap_connect' ) ) { die_miserable_death ( 'Your installation of PHP does not support LDAP' ); } $ret = false; $ds = @ldap_connect ( $ldap_server, $ldap_port ); if ( $ds ) { if ($set_ldap_version || $ldap_start_tls) ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); if ($ldap_start_tls) { if (!ldap_start_tls($ds)) { $error = 'Could not start TLS for LDAP connection'; return $ret; } } if ( $ldap_admin_dn != '') { $r = @ldap_bind ( $ds, $ldap_admin_dn, $ldap_admin_pwd ); } else { $r = @ldap_bind ( $ds ); } if (!$r) { $error = 'Invalid Admin login for LDAP Server'; } else { $ret = $r; } } else { $error = 'Error connecting to LDAP server'; $ret = false; } return $ret; } ?>