Loading module/Application/src/Application/Authentication/Storage/AppStorage.php +6 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading module/Application/src/Application/Entity/UserWrapper.php +24 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } /** Loading @@ -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)); } } Loading module/Application/src/Application/Entity/UserWrapperFactory.php +4 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ class UserWrapperFactory * * @param StorageChainEvent $event * @return UserWrapper|null * @throws \Exception */ public function createInstanceFromStorageChainEvent(StorageChainEvent $event) { Loading Loading @@ -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) { Loading @@ -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(); Loading module/Application/src/Application/Event/UserAuthenticatedEventListener.php +16 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); Loading @@ -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"... Loading module/Application/src/Application/Provider/IdentityProvider.php +6 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
module/Application/src/Application/Authentication/Storage/AppStorage.php +6 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
module/Application/src/Application/Entity/UserWrapper.php +24 −11 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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; } /** Loading @@ -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)); } } Loading
module/Application/src/Application/Entity/UserWrapperFactory.php +4 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ class UserWrapperFactory * * @param StorageChainEvent $event * @return UserWrapper|null * @throws \Exception */ public function createInstanceFromStorageChainEvent(StorageChainEvent $event) { Loading Loading @@ -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) { Loading @@ -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(); Loading
module/Application/src/Application/Event/UserAuthenticatedEventListener.php +16 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); Loading @@ -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"... Loading
module/Application/src/Application/Provider/IdentityProvider.php +6 −0 Original line number Diff line number Diff line Loading @@ -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