Commit 3345f8a9 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Remise d'un événement 'authentification.ldap.fail' captable dans les...

- Remise d'un événement 'authentification.ldap.fail' captable dans les application pour aider les gestionnaires à identifier des problèmes d'accès/authentification LDAP.
parent 44707588
Loading
Loading
Loading
Loading
Loading
+33 −11
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface

    const USURPATION_USERNAMES_SEP = '=';

    const LDAP_AUTHENTIFICATION_FAIL = 'authentification.ldap.fail';

    /**
     * @var string
     */
@@ -88,7 +90,8 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface
        // NB: Dans la version 3.0.0 de zf-commons/zfc-user, cette méthode prend un EventInterface.
        // Mais dans la branche 3.x, c'est un AdapterChainEvent !
        // Si un jour c'est un AdapterChainEvent qui est attendu, plus besoin de faire $e->getTarget().
        $event = $e->getTarget(); /* @var $event AdapterChainEvent */
        $event = $e->getTarget();
        /* @var $event AdapterChainEvent */

        if ($this->isSatisfied()) {
            try {
@@ -203,12 +206,29 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface
        // LDAP auth
        $result = $this->getLdapAuthAdapter()->setUsername($username)->setPassword($credential)->authenticate();

        // Envoi des erreurs LDAP dans un événement
        if (!$result->isValid()) {
            $messages = "LDAP ERROR : ";
            $errorMessages = $result->getMessages();
            if (count($errorMessages) > 0) {
                // On ne prend que les 2 premières lignes d'erreur (les suivantes contiennent souvent
                // les mots de passe de l'utilisateur, et les mot de passe dans les logs... bof bof).
                for ($i = 0; $i < 2 && count($errorMessages) >= $i; $i++) {
                    $messages .= $errorMessages[$i] . " ";
                }
            }
            $errorEvent = new Event(self::LDAP_AUTHENTIFICATION_FAIL, null, ['messages' => $messages]);
            $this->getEventManager()->triggerEvent($errorEvent);
        }

        $success = $result->isValid();

        // verif existence du login usurpé
        if ($this->usernameUsurpe) {
            // s'il nexiste pas, échec de l'authentification
            if (!@$this->getLdapAuthAdapter()->getLdap()->searchEntries("(".$this->moduleOptions->getLdapUsername()."=$this->usernameUsurpe)")) {
            if (!@$this->getLdapAuthAdapter()->getLdap()->searchEntries(
                "(" . $this->moduleOptions->getLdapUsername() . "=$this->usernameUsurpe)"
            )) {
                $this->usernameUsurpe = null;
                $success = false;
            }
@@ -293,10 +313,12 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface
     */
    public function setEventManager(EventManagerInterface $eventManager): self
    {
        $eventManager->setIdentifiers([
        $eventManager->setIdentifiers(
            [
                __NAMESPACE__,
                __CLASS__,
        ]);
            ]
        );
        $this->eventManager = $eventManager;

        return $this;