SURFnet / grouphub

Group hub App en Business laag
0 stars 1 forks source link

Description in LDAP Leegmaken #19

Closed Frankniesten closed 7 years ago

Frankniesten commented 8 years ago

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.

lucasvanlierop commented 7 years ago

Zie: https://github.com/SURFnet/grouphub/pull/65/files

hermanvand commented 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);
        }
}
lucasvanlierop commented 7 years ago

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?

lucasvanlierop commented 7 years ago

Update het zou kunnen dat deze opzet niet goed werkt wanneer er niks ter verwijderen valt

lucasvanlierop commented 7 years ago

@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.

hermanvand commented 7 years ago

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.