-
Improvement
-
Resolution: Duplicate
-
Minor
-
None
-
1.8.1
-
None
-
MOODLE_18_STABLE
If a course has enrollments that exceed the maximum returned number of attributes of the LDAP server, that course's enrollments will be truncated. This can be addressed by paging the returned group membership.
Example code (modifying enrol/ldap/enrol.php v1.20) for ActiveDirectory is below:
Remove the membership query from the initial search, deferring it until later, by deleting:
167 if($enrol){
168 array_push($ldap_fields_wanted, $CFG->
169 }
Add paging code at line 238 (for example):
// LOCAL: Enable large member results in AD
$rangeStart = 0;
$rangeLength = 500;
$member = $CFG->{'enrol_ldap_memberattribute_role'.$role->id}
;
$tempMembers = array('count' => 0);
while ($rangeStart > -1) {
if (1 == 1) { // MS-AD
$member = $CFG->
}
$ldap_fields_wanted = array('dn', $member);
if ($CFG->enrol_ldap_search_sub){ //use ldap_search to find first group from subtree $ldap_result = @ldap_search($ldap_connection, $context, $ldap_search_pattern, $ldap_fields_wanted); } else { //search only in this context $ldap_result = @ldap_list($ldap_connection, $context, $ldap_search_pattern, $ldap_fields_wanted,0,0); }
// check and push results
$records = $ldap_result ? ldap_get_entries($ldap_connection,$ldap_result) : array('count' => 0);
$record = $records[0];
if (array_key_exists(strtolower($CFG->{'enrol_ldap_memberattribute_role'.$role->id}
.';Range='.$rangeStart.'-*'), $record)) {
$record[strtolower($CFG->
unset($tempMembers['count']);
$tempMembers = array_merge($tempMembers, $record[strtolower($CFG->{'enrol_ldap_memberattribute_role'.$role->id}
.';Range='.$rangeStart.'-*')]);
$rangeStart = -1;
} else if (array_key_exists(strtolower($CFG->
$record[strtolower($CFG->{'enrol_ldap_memberattribute_role'.$role->id}
.'Range='.$rangeStart.'-'.($rangeStart+$rangeLength-1))][count] += $tempMembers['count'];
unset($tempMembers['count']);
$tempMembers = array_merge($tempMembers, $record[strtolower($CFG->
$rangeStart = $rangeStart + $rangeLength;
} else {
$tempMembers = $record[strtolower($CFG->{'enrol_ldap_memberattribute_role'.$role->id}
)];
$rangeStart = -1;
}
}
$course[strtolower($CFG->
)] = $tempMembers;
// END LOCAL
- duplicates
-
MDL-36119 ldap auth sync - add paged support
-
- Closed
-