diff --git a/config/module.config.php b/config/module.config.php index b015ae6ff8c3e1e9babb0b2f034142249d61281e..0bad6991bf0183bf6c54711b74309f4f1af448a6 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 e8b1b01e70f8b5933d7ddd9f35f3e6b39b98b13f..707cbae58285b9e207e2122e89de398ad9249c84 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.