Commit a77f9a96 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

[FIX] Meilleure gestion d'erreur en cas de demande d'usurpation d'un compte inexistant

parent f8d88e03
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace UnicaenAuth\Controller;

use Exception;
use UnicaenApp\Exception\RuntimeException;
use UnicaenApp\Mapper\Ldap\People as LdapPeopleMapper;
use UnicaenAuth\Entity\Db\AbstractUser;
@@ -132,10 +133,19 @@ class UtilisateurController extends AbstractActionController
            return $this->redirect()->toRoute('home');
        }

        $utilisateurUsurpe = $this->getUserMapper()->findByUsername($usernameUsurpe); /** @var AbstractUser $utilisateurUsurpe */
        if ($utilisateurUsurpe === null) {
            $this->flashMessenger()->addErrorMessage(
                "La demande d'usurpation du compte '$usernameUsurpe' a échoué car aucun compte utilisateur correspondant " .
                "n'a été trouvé."
            );
            return $this->redirect()->toRoute('home');
        }

        $sessionIdentity = $this->serviceUserContext->usurperIdentite($usernameUsurpe);
        if ($sessionIdentity !== null) {
            // cuisine spéciale si l'utilisateur courant s'est authentifié via Shibboleth
            $this->usurperIdentiteShib($usernameUsurpe);
            $this->usurperIdentiteShib($utilisateurUsurpe);
        }

        return $this->redirect()->toRoute('home');
@@ -144,19 +154,15 @@ class UtilisateurController extends AbstractActionController
    /**
     * Cuisine spéciale pour l'usurpation si l'utilisateur courant s'est authentifié via Shibboleth.
     *
     * @param string $usernameUsurpe Ex tartempion@unicaen.fr
     * @param AbstractUser $utilisateurUsurpe Utilisateur à usurper
     */
    protected function usurperIdentiteShib(string $usernameUsurpe)
    protected function usurperIdentiteShib(AbstractUser $utilisateurUsurpe)
    {
        $currentIdentityArray = $this->serviceUserContext->getIdentity();

        if (isset($currentIdentityArray['shib']) && $currentIdentityArray['shib'] instanceof ShibUser) {
            $fromShibUser = $currentIdentityArray['shib'];
            $toUtilisateur = $this->getUserMapper()->findByUsername($usernameUsurpe); /** @var AbstractUser $toUtilisateur */
            if ($toUtilisateur === null) {
                throw new RuntimeException("L'utilisateur '$usernameUsurpe' n'existe pas dans la table des utilisateurs");
            }
            $this->shibService->activateUsurpation($fromShibUser, $toUtilisateur);
            $this->shibService->activateUsurpation($fromShibUser, $utilisateurUsurpe);
        }
    }