Commit 7eed8902 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Merge branch 'fix_etab_utilisateur_ext'

parents 6c06c3ba 926ad631
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -48,7 +48,13 @@ class AppStorage implements ChainableStorage
    public function read(ChainEvent $e)
    {
        $userWrapperFactory = new UserWrapperFactory();
        try {
            $this->userWrapper = $userWrapperFactory->createInstanceFromStorageChainEvent($e);
        } catch (\Exception $e) {
            error_log($e->getMessage());
            error_log($e->getTraceAsString());
            return;
        }
        if ($this->userWrapper === null) {
            return;
        }
+24 −11
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@ namespace Application\Entity;
use Application\Entity\Db\Individu;
use Application\Entity\Db\Utilisateur;
use Application\Exception\DomainException;
use Exception;
use InvalidArgumentException;
use UnicaenApp\Entity\Ldap\People as UnicaenAppPeople;
use UnicaenApp\Exception\LogicException;
use UnicaenApp\Exception\RuntimeException;
@@ -36,11 +38,24 @@ class UserWrapper implements UserInterface

    /**
     * @param Utilisateur|UnicaenAppPeople|ShibUser|UnicaenLdapPeople $userData
     * @return UserWrapper
     * @return self
     * @throws \Exception
     */
    public function setUserData($userData)
    public function setUserData($userData): self
    {
        switch (true) {
            case $userData instanceof UnicaenLdapPeople:
            case $userData instanceof UnicaenAppPeople:
            case $userData instanceof ShibUser:
            case $userData instanceof Utilisateur:
                $this->userData = $userData;
                break;
            default:
                throw new Exception(
                    "Type de données utilisateurs spécifié inattendu : " .
                    is_object($userData) ? get_class($userData) : gettype($userData)
                );
        }

        if ($this->userData instanceof Utilisateur) {
            $this->individu = $this->userData->getIndividu();
@@ -75,13 +90,13 @@ class UserWrapper implements UserInterface
     *
     * Retourne par exemple "unicaen.fr" lorsque l'EPPN est "tartempion@unicaen.fr"
     *
     * @return string
     * @return string|null
     */
    public function getDomainFromEppn()
    public function getDomainFromEppn(): ?string
    {
        $parts = explode('@', $this->getEppn());

        return $parts[1];
        return $parts[1] ?? null;
    }

    /**
@@ -102,23 +117,21 @@ class UserWrapper implements UserInterface
     * Retourne l'EduPersonPrincipalName (EPPN), si applicable aux données utilisateur courantes.
     *
     * @return string
     * @throws DomainException Si l'EPPN n'a pas de sens pour les données utilisateur courantes
     */
    public function getEppn()
    public function getEppn(): string
    {
        switch (true) {
            case $this->userData instanceof UnicaenLdapPeople:
            case $this->userData instanceof UnicaenAppPeople:
                return $this->userData->getEduPersonPrincipalName();

            case $this->userData instanceof Utilisateur:
                throw new DomainException("Les données d'identité de type Utilisateur ne sont pas supportées");

            case $this->userData instanceof ShibUser:
                return $this->userData->getEppn();

            default:
                throw new LogicException("Cas imprévu!");
                throw new DomainException(
                    "Pas d'EPPN pour des données d'identité de type " .
                    is_object($this->userData) ? get_class($this->userData) : gettype($this->userData));
        }
    }

+4 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ class UserWrapperFactory
     *
     * @param StorageChainEvent $event
     * @return UserWrapper|null
     * @throws \Exception
     */
    public function createInstanceFromStorageChainEvent(StorageChainEvent $event)
    {
@@ -55,6 +56,7 @@ class UserWrapperFactory
     *
     * @param array $identity ['ldap' => People|null, 'db' => Utilisateur|null, 'shib' => ShibUser|null]
     * @return UserWrapper
     * @throws \Exception
     */
    public function createInstanceFromIdentity(array $identity)
    {
@@ -76,8 +78,9 @@ class UserWrapperFactory
     *
     * @param UserAuthenticatedEvent $event
     * @return UserWrapper
     * @throws \Exception
     */
    public function createInstanceFromUserAuthenticatedEvent(UserAuthenticatedEvent $event)
    public function createInstanceFromUserAuthenticatedEvent(UserAuthenticatedEvent $event): UserWrapper
    {
        $inst = new UserWrapper();

+16 −2
Original line number Diff line number Diff line
@@ -28,7 +28,13 @@ class UserAuthenticatedEventListener extends AuthenticatedUserSavedAbstractListe
        parent::onUserAuthenticatedPrePersist($e);

        $userWrapperFactory = new UserWrapperFactory();
        try {
            $userWrapper = $userWrapperFactory->createInstanceFromUserAuthenticatedEvent($e);
        } catch (\Exception $e) {
            error_log($e->getMessage());
            error_log($e->getTraceAsString());
            return;
        }

        /** @var Utilisateur $utilisateur */
        $utilisateur = $e->getDbUser();
@@ -47,7 +53,13 @@ class UserAuthenticatedEventListener extends AuthenticatedUserSavedAbstractListe
        parent::onUserAuthenticatedPostPersist($e);

        $userWrapperFactory = new UserWrapperFactory();
        try {
            $userWrapper = $userWrapperFactory->createInstanceFromUserAuthenticatedEvent($e);
        } catch (\Exception $e) {
            error_log($e->getMessage());
            error_log($e->getTraceAsString());
            return;
        }

        if ($userWrapper->getIndividu() !== null) {
            $individu = $userWrapper->getIndividu();
@@ -67,14 +79,16 @@ class UserAuthenticatedEventListener extends AuthenticatedUserSavedAbstractListe
     * @param UserWrapper $userWrapper
     * @return Individu
     */
    private function processIndividu(UserWrapper $userWrapper)
    private function processIndividu(UserWrapper $userWrapper): Individu
    {
        $createIndividu = false;
        $etablissementInconnu = $this->etablissementService->getRepository()->fetchEtablissementInconnu();

        // recherche de l'établissement de connexion l'utilisateur : à partir du domaine de l'EPPN, ex: 'unicaen.fr'
        $domaineEtab = $userWrapper->getDomainFromEppn();
        $etablissement = null;
        if ($domaineEtab = $userWrapper->getDomainFromEppn()) {
            $etablissement = $this->etablissementService->getRepository()->findOneByDomaine($domaineEtab);
        }

        if ($etablissement === null) {
            // si aucun établissement ne correspond au domaine, on essaie l'établissement "inconnu"...
+6 −0
Original line number Diff line number Diff line
@@ -88,7 +88,13 @@ class IdentityProvider implements ProviderInterface, ChainableProvider
        $identity = $this->authenticationService->getIdentity();

        $userWrapperFactory = new UserWrapperFactory();
        try {
            $this->userWrapper = $userWrapperFactory->createInstanceFromIdentity($identity);
        } catch (\Exception $e) {
            error_log($e->getMessage());
            error_log($e->getTraceAsString());
            return [];
        }
        if ($this->userWrapper === null) {
            return [];
        }
Loading