Closed Frankniesten closed 7 years ago
Hoi Lucas, bij fontys gaat dit fout in de functie deleteAttribute van LdapClient.php. Als de $data leeg is, oftwel er is niets te deleten, dan probeert hij het toch en wordt de error gegeven. 'unwilling to perform'
ik heb even een print_r($data) gegeven om dit te verifieren en een extra conditie gemaakt, zodat alleen gedelete wordt als er iets te deleten is.
We zien dat het dan wel werkt als we description vullen en leeg maken.
print_r ($data); if (count($data) > 0) { if (false === @ldap_mod_del($this->connection, $dn, $data)) { $ldapError = ldap_error($this->connection); if ($ldapError === self::ERROR_NO_SUCH_ATTRIBUTE) { return; } throw new LdapException($ldapError); } }
Hoi Herman,
De modify
functie van de LdapClient
checkt of een waarde leeg is en zal proberen deze te verwijderen in plaats van te updaten (aangezien LDAP niet kan updaten naar een lege waarde). Dat verwijderen gebeurt door de delete functie aan te roepen met een lege waarde:
$mapToDeleteValue = function () {
return [];
};
$this->deleteAttribute($dn, array_map($mapToDeleteValue, array_filter($data, $isEmptyValue)));
In de praktijk zal de waarde die deleteAttribute
ontvangt dus altijd een lege array zijn.
Wanneer je nu op de test server probeert een niet bestaand element te verwijderen krijg je de foutmelding: No such attribute
Hier wordt op als volgt op gecheckt:
const ERROR_NO_SUCH_ATTRIBUTE = 'No such attribute';
$ldapError = ldap_error($this->connection);
if ($ldapError === self::ERROR_NO_SUCH_ATTRIBUTE) {
return;
}
Ik begrijp dat de AD server deze melding niet teruggeeft?
Update het zou kunnen dat deze opzet niet goed werkt wanneer er niks ter verwijderen valt
@hermanvand Het kan inderdaad voorkomen dat er een complete lege $data
array naar b.v. deleteAttribute
wordt gestuurd. Daar kan de LDAP server inderdaad niet mee overweg. Anders dan de naam doet vermoeden werkt deleteAttribute
en andere functies niet op maar op meerdere attributen. Ik heb dit expliciet gemaakt door ze te hernoemen, zie:
Opgelost door: https://github.com/SURFnet/grouphub/pull/78/files
Overigens mapt de LDAP client vrij direct op hoe LDAP werkt terwijl het juist een abstractie zou moeten zijn.
Hoi Lucas, zo te lezen heb je nu toch iets aangepast waarmee het gefixed zou zijn. Voor de volledigheid, de AD geeft de melding 'unwilling to perform'. En volgens mij is je conclusie goed dat het niet goed werkt als er niets te verwijderen is. We gaan de fix testen bij de volgende release.
Als de description van een groep die al is gesynchroniseerd richting AD wordt verwijderd dan komt deze wijziging niet mee in de AD. Er moet altijd een waarde worden opgegeven om het attribuut te kunnen wijzigen.