From 1b1a594eda1d3d358b0cd629eb950d48da52903d Mon Sep 17 00:00:00 2001
From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr>
Date: Thu, 19 Apr 2018 17:01:40 +0200
Subject: [PATCH] =?UTF-8?q?Nouvelle=20technique=20pour=20usurper=20une=20i?=
 =?UTF-8?q?dentit=C3=A9.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 config/module.config.php                      |  1 +
 .../Controller/UtilisateurController.php      | 62 +++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/config/module.config.php b/config/module.config.php
index b015ae6..0bad699 100644
--- a/config/module.config.php
+++ b/config/module.config.php
@@ -122,6 +122,7 @@ return [
                 ['controller' => 'UnicaenApp\Controller\Application', 'action' => 'informatique-et-libertes', 'roles' => []],
                 ['controller' => 'UnicaenApp\Controller\Application', 'action' => 'refresh-session', 'roles' => []],
                 ['controller' => 'UnicaenAuth\Controller\Utilisateur', 'action' => 'selectionner-profil', 'roles' => []],
+                ['controller' => 'UnicaenAuth\Controller\Utilisateur', 'action' => 'usurper-identite', 'roles' => []],
 
                 ['controller' => 'UnicaenAuth\Controller\Auth', 'action' => 'shibboleth', 'roles' => []],
             ],
diff --git a/src/UnicaenAuth/Controller/UtilisateurController.php b/src/UnicaenAuth/Controller/UtilisateurController.php
index e8b1b01..707cbae 100644
--- a/src/UnicaenAuth/Controller/UtilisateurController.php
+++ b/src/UnicaenAuth/Controller/UtilisateurController.php
@@ -2,7 +2,13 @@
 
 namespace UnicaenAuth\Controller;
 
+use UnicaenAuth\Entity\Db\UserInterface;
+use UnicaenAuth\Entity\Ldap\People;
+use UnicaenAuth\Entity\Shibboleth\ShibUser;
+use UnicaenAuth\Options\ModuleOptions;
+use Zend\Authentication\AuthenticationService;
 use Zend\Http\Request;
+use Zend\Http\Response;
 use Zend\Mvc\Controller\AbstractActionController;
 
 /**
@@ -12,6 +18,62 @@ use Zend\Mvc\Controller\AbstractActionController;
  */
 class UtilisateurController extends AbstractActionController
 {
+    /**
+     * Usurpe l'identité d'un autre utilisateur.
+     *
+     * @return Response
+     */
+    public function usurperIdentiteAction()
+    {
+        $request = $this->getRequest();
+        if (! $request instanceof Request) {
+            exit(1);
+        }
+
+        $redirection = $this->redirect()->toRoute('home');
+
+        $newIdentity = $request->getQuery('identity', $request->getPost('identity'));
+        if (! $newIdentity) {
+            return $redirection;
+        }
+
+        /** @var AuthenticationService $authenticationService */
+        $authenticationService = $this->getServiceLocator()->get(AuthenticationService::class);
+
+        /** @var ModuleOptions $options */
+        $options = $this->getServiceLocator()->get('unicaen-auth_module_options');
+
+        $currentIdentity = $authenticationService->getIdentity();
+        if (! $currentIdentity) {
+            return $redirection;
+        }
+        if (! is_array($currentIdentity)) {
+            return $redirection;
+        }
+
+        if (isset($currentIdentity['shib'])) {
+            /** @var ShibUser $currentIdentity */
+            $currentIdentity = $currentIdentity['shib'];
+        } elseif (isset($currentIdentity['ldap'])) {
+            /** @var People $currentIdentity */
+            $currentIdentity = $currentIdentity['ldap'];
+        } elseif (isset($currentIdentity['db'])) {
+            /** @var UserInterface $currentIdentity */
+            $currentIdentity = $currentIdentity['db'];
+        } else {
+            return $redirection;
+        }
+
+        $currentIdentity = $currentIdentity->getUsername();
+        if (! in_array($currentIdentity, $options->getUsurpationAllowedUsernames())) {
+            return $redirection;
+        }
+
+        $authenticationService->getStorage()->write($newIdentity);
+
+        return $redirection;
+    }
+
     /**
      * Traite les requêtes AJAX POST de sélection d'un profil utilisateur.
      * La sélection est mémorisé en session par le service AuthUserContext.
-- 
GitLab