From 090ecaa553d8e93a5740ce028a354bd7838e091d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Thu, 5 Dec 2019 10:12:19 +0100
Subject: [PATCH] =?UTF-8?q?R=C3=A9solution=20d=C3=A9finitive=20du=20bug=20?=
 =?UTF-8?q?li=C3=A9=20aux=20donn=C3=A9es=20de=20login=20r=C3=A9siduelles?=
 =?UTF-8?q?=20en=20m=C3=A9moire=20apr=C3=A8s=20d=C3=A9connexion.=20Utilisa?=
 =?UTF-8?q?tion=20de=20la=20config=20pour=20la=20recherche=20LDAP=20en=20c?=
 =?UTF-8?q?as=20d'usurpation=20d'identit=C3=A9.=20Mise=20en=20place=20d'un?=
 =?UTF-8?q?=20EventManager=20unique=20et=20d=C3=A9di=C3=A9=20=C3=A0=20Unic?=
 =?UTF-8?q?aenAuth?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 config/module.config.php                      |  1 +
 .../Adapter/AbstractFactory.php               |  7 +++--
 .../Authentication/Adapter/Cas.php            |  9 ------
 src/UnicaenAuth/Authentication/Adapter/Db.php |  9 ------
 .../Authentication/Adapter/Ldap.php           | 11 +------
 .../Authentication/Storage/Chain.php          |  3 --
 .../Storage/ChainServiceFactory.php           |  4 +--
 src/UnicaenAuth/Event/EventManager.php        |  8 +++++
 src/UnicaenAuth/Event/EventManagerFactory.php | 29 +++++++++++++++++++
 .../Provider/Identity/ChainServiceFactory.php |  4 +--
 10 files changed, 48 insertions(+), 37 deletions(-)
 create mode 100644 src/UnicaenAuth/Event/EventManager.php
 create mode 100644 src/UnicaenAuth/Event/EventManagerFactory.php

diff --git a/config/module.config.php b/config/module.config.php
index e031665..7012282 100644
--- a/config/module.config.php
+++ b/config/module.config.php
@@ -494,6 +494,7 @@ return [
 
             'UnicaenApp\HistoriqueListener' => HistoriqueListenerFactory::class,
             'UnicaenAuth\HistoriqueListener' => HistoriqueListenerFactory::class,
+            \UnicaenAuth\Event\EventManager::class => \UnicaenAuth\Event\EventManagerFactory::class,
         ],
         'lazy_services' => [
             // Mapping services to their class names is required since the ServiceManager is not a declarative DIC.
diff --git a/src/UnicaenAuth/Authentication/Adapter/AbstractFactory.php b/src/UnicaenAuth/Authentication/Adapter/AbstractFactory.php
index 6a32bd9..fa4e56d 100644
--- a/src/UnicaenAuth/Authentication/Adapter/AbstractFactory.php
+++ b/src/UnicaenAuth/Authentication/Adapter/AbstractFactory.php
@@ -6,7 +6,7 @@ use Interop\Container\ContainerInterface;
 use UnicaenApp\Exception\LogicException;
 use UnicaenAuth\Options\ModuleOptions;
 use UnicaenAuth\Service\User;
-use Zend\EventManager\EventManager;
+use UnicaenAuth\Event\EventManager;
 use Zend\EventManager\EventManagerAwareInterface;
 use Zend\Router\Http\TreeRouteStack;
 use Zend\ServiceManager\AbstractFactoryInterface;
@@ -62,10 +62,13 @@ class AbstractFactory implements AbstractFactoryInterface
 
         if ($adapter instanceof EventManagerAwareInterface) {
             /** @var EventManager $eventManager */
-            $eventManager = $container->get('EventManager');
+            $eventManager = $container->get(EventManager::class);
             $adapter->setEventManager($eventManager);
             $userService = $container->get('unicaen-auth_user_service'); /* @var $userService \UnicaenAuth\Service\User */
             $eventManager->attach('userAuthenticated', [$userService, 'userAuthenticated'], 100);
+            $eventManager->attach('clear', function() use ($adapter){
+                $adapter->getStorage()->clear();
+            });
         }
 
         return $adapter;
diff --git a/src/UnicaenAuth/Authentication/Adapter/Cas.php b/src/UnicaenAuth/Authentication/Adapter/Cas.php
index d1b0689..12cae0a 100644
--- a/src/UnicaenAuth/Authentication/Adapter/Cas.php
+++ b/src/UnicaenAuth/Authentication/Adapter/Cas.php
@@ -78,15 +78,6 @@ class Cas extends AbstractAdapter implements EventManagerAwareInterface
         $this->router = $router;
     }
 
-    public function getStorage()
-    {
-        if (null === $this->storage) {
-            $this->setStorage(new Session());
-        }
-
-        return $this->storage;
-    }
-    
     /**
      * Réalise l'authentification.
      *
diff --git a/src/UnicaenAuth/Authentication/Adapter/Db.php b/src/UnicaenAuth/Authentication/Adapter/Db.php
index 2f13e4c..39b1c8d 100644
--- a/src/UnicaenAuth/Authentication/Adapter/Db.php
+++ b/src/UnicaenAuth/Authentication/Adapter/Db.php
@@ -37,15 +37,6 @@ class Db extends \ZfcUser\Authentication\Adapter\Db implements ServiceLocatorAwa
         return $this;
     }
 
-    public function getStorage()
-    {
-        if (null === $this->storage) {
-            $this->setStorage(new Session());
-        }
-
-        return $this->storage;
-    }
-
     /**
      * Authentification.
      *
diff --git a/src/UnicaenAuth/Authentication/Adapter/Ldap.php b/src/UnicaenAuth/Authentication/Adapter/Ldap.php
index 41f7087..711935d 100644
--- a/src/UnicaenAuth/Authentication/Adapter/Ldap.php
+++ b/src/UnicaenAuth/Authentication/Adapter/Ldap.php
@@ -78,15 +78,6 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface
         $this->appModuleOptions = $appModuleOptions;
     }
 
-    public function getStorage()
-    {
-        if (null === $this->storage) {
-            $this->setStorage(new Session());
-        }
-
-        return $this->storage;
-    }
-    
     /**
      *
      * @param EventInterface $e
@@ -224,7 +215,7 @@ class Ldap extends AbstractAdapter implements EventManagerAwareInterface
         // verif existence du login usurpé
         if ($this->usernameUsurpe) {
             // s'il nexiste pas, échec de l'authentification
-            if (!$this->getLdapAuthAdapter()->getLdap()->searchEntries("(supannAliasLogin=$this->usernameUsurpe)")) {
+            if (!@$this->getLdapAuthAdapter()->getLdap()->searchEntries("(".$this->getOptions()->getLdapUsername()."=$this->usernameUsurpe)")) {
                 $this->usernameUsurpe = null;
                 $success              = false;
             }
diff --git a/src/UnicaenAuth/Authentication/Storage/Chain.php b/src/UnicaenAuth/Authentication/Storage/Chain.php
index bf958d0..c357b79 100644
--- a/src/UnicaenAuth/Authentication/Storage/Chain.php
+++ b/src/UnicaenAuth/Authentication/Storage/Chain.php
@@ -163,9 +163,6 @@ class Chain implements StorageInterface, EventManagerAwareInterface
      */
     public function getEventManager()
     {
-        if (null === $this->eventManager) {
-            $this->eventManager = new EventManager();
-        }
         return $this->eventManager;
     }
 
diff --git a/src/UnicaenAuth/Authentication/Storage/ChainServiceFactory.php b/src/UnicaenAuth/Authentication/Storage/ChainServiceFactory.php
index ca4eafc..7318ad8 100644
--- a/src/UnicaenAuth/Authentication/Storage/ChainServiceFactory.php
+++ b/src/UnicaenAuth/Authentication/Storage/ChainServiceFactory.php
@@ -4,7 +4,7 @@ namespace UnicaenAuth\Authentication\Storage;
 
 use Interop\Container\ContainerInterface;
 use UnicaenAuth\Options\ModuleOptions;
-use Zend\EventManager\EventManager;
+use UnicaenAuth\Event\EventManager;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -33,7 +33,7 @@ class ChainServiceFactory implements FactoryInterface
         $chain = new Chain();
 
         /** @var EventManager $eventManager */
-        $eventManager = $container->get('EventManager');
+        $eventManager = $container->get(EventManager::class);
 
         $chain->setEventManager($eventManager);
 
diff --git a/src/UnicaenAuth/Event/EventManager.php b/src/UnicaenAuth/Event/EventManager.php
new file mode 100644
index 0000000..d5bbabb
--- /dev/null
+++ b/src/UnicaenAuth/Event/EventManager.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace UnicaenAuth\Event;
+
+class EventManager extends \Zend\EventManager\EventManager
+{
+    
+}
\ No newline at end of file
diff --git a/src/UnicaenAuth/Event/EventManagerFactory.php b/src/UnicaenAuth/Event/EventManagerFactory.php
new file mode 100644
index 0000000..74d9c3b
--- /dev/null
+++ b/src/UnicaenAuth/Event/EventManagerFactory.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenAuth\Event;
+
+use Interop\Container\ContainerInterface;
+
+/**
+ * Description of EventManagerFactory
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class EventManagerFactory
+{
+
+    /**
+     * @param ContainerInterface $container
+     * @param string             $requestedName
+     * @param array|null         $options
+     *
+     * @return EventManager
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, $options = null)
+    {
+        $shared = $container->has('SharedEventManager') ? $container->get('SharedEventManager') : null;
+        $eventManager = new EventManager($shared);
+
+        return $eventManager;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenAuth/Provider/Identity/ChainServiceFactory.php b/src/UnicaenAuth/Provider/Identity/ChainServiceFactory.php
index 41c874b..1909a84 100644
--- a/src/UnicaenAuth/Provider/Identity/ChainServiceFactory.php
+++ b/src/UnicaenAuth/Provider/Identity/ChainServiceFactory.php
@@ -4,8 +4,8 @@ namespace UnicaenAuth\Provider\Identity;
 
 use BjyAuthorize\Service\Authorize;
 use Interop\Container\ContainerInterface;
+use UnicaenAuth\Event\EventManager;
 use UnicaenAuth\Service\UserContext;
-use Zend\EventManager\EventManager;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -32,7 +32,7 @@ class ChainServiceFactory implements FactoryInterface
         $authorizeService = $container->get('BjyAuthorize\Service\Authorize');
 
         /** @var EventManager $eventManager */
-        $eventManager = $container->get('EventManager');
+        $eventManager = $container->get(EventManager::class);
 
         $chain->setUserContextService($userContextService);
         $chain->setAuthorizeService($authorizeService);
-- 
GitLab