src/Controller/DefaultController.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User\NOUTOnlineUser;
  4. use App\JSONEntity\JSGlobal\ConnexionInfos;
  5. use App\Misc\Encoding;
  6. use App\Service\ConfigExtranet;
  7. use App\Service\ConstanteJavascript;
  8. use App\Service\GestionLanguages;
  9. use App\Service\InfoForLoginSIMAX;
  10. use NOUT\Bundle\NOUTOnlineBundle\Entity\ActionResult;
  11. use NOUT\Bundle\NOUTOnlineBundle\Entity\NOUTOnlineVersion;
  12. use NOUT\Bundle\NOUTOnlineBundle\Entity\UsernameToken\OASISUsernameToken;
  13. use NOUT\Bundle\NOUTOnlineBundle\Security\Authentication\Token\NOUTToken;
  14. use NOUT\Bundle\NOUTOnlineBundle\Service\NOUTClientIHM;
  15. use NOUT\Bundle\NOUTOnlineBundle\Service\NOUTOnlineRedirection;
  16. use NOUT\Bundle\NOUTOnlineBundle\SOAP\SOAPException;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use Symfony\Component\Security\Core\Security;
  25. class DefaultController extends AbstractController
  26. {
  27.     /**
  28.      * @Route(
  29.      *        "/",
  30.      *        name="index"
  31.      * )
  32.      * @param Request $request
  33.      * @return Response
  34.      * @throws \Exception
  35.      */
  36.     public function indexAction(Request $request): Response
  37.     {
  38.         if (!$this->clNoutclient->isVersionMinSite() && $this->getParameter('kernel.environment') !== 'dev') {
  39.             return $this->forward('Security/login.html.twig', array());
  40.         }
  41.         return $this->forward('App\Controller\DefaultController::backboneAppAction', []);
  42.     }
  43.     /**
  44.      * @Route(
  45.      *        "/forbidden",
  46.      *        name="forbidden",
  47.      * )
  48.      * @param Request               $request
  49.      * @param UrlGeneratorInterface $router
  50.      * @return RedirectResponse
  51.      * @throws SOAPException
  52.      */
  53.     public function forbiddenAction(Request $requestUrlGeneratorInterface $router): RedirectResponse
  54.     {
  55.         $exception json_decode($request->get('exception'));
  56.         if (empty($exception)) {
  57.             //on redirige vers login
  58.             return new RedirectResponse($router->generate('session_logout', array()));
  59.         }
  60.         throw new SOAPException($exception->message$exception->code);
  61.     }
  62.     /**
  63.      * @Route(
  64.      *        "/backbone_app",
  65.      *        name="backbone_app"
  66.      * )
  67.      * @param Request             $request
  68.      * @param ConstanteJavascript $clCconstJS
  69.      * @return Response
  70.      */
  71.     public function backboneAppAction(Request $requestConstanteJavascript $clCconstJSTokenStorageInterface $tokenStorageConfigExtranet $configExtranetInfoForLoginSIMAX $infoForLoginSIMAX): Response
  72.     {
  73.         /** @var NOUTToken $oToken */
  74.         $oToken $tokenStorage->getToken();
  75.         $aParamLoginAnonyme = [];
  76.         $authExtraFromAnonyme null;
  77.         if ($configExtranet->isExtranet()) {
  78.             $authExtraFromAnonyme $this->getParameter('site.extranet.from_anonyme');
  79.             if ($authExtraFromAnonyme) {
  80.                 //pour générer le formulaire de login
  81.                 $aParamLoginAnonyme $infoForLoginSIMAX->aGetParamForLoginSIMAX($request->getSession());
  82.             }
  83.         }
  84.         /** @var NOUTOnlineUser $user */
  85.         $user $oToken->getUser();
  86.         $withPicture $this->clNoutclient->getProfilPicture($user->getPictureLink(), $oToken->getResource(), $oToken->getIntranet(), $oToken->isExtranet());
  87.         return $this->render(
  88.             $this->clTemplating->sGetTemplate('index'),
  89.             [
  90.                 'connection_infos'     => new ConnexionInfos($oToken$authExtraFromAnonyme$this->getParameter('site.anonyme.auth')['other'], $withPicture),
  91.                 'constante_javascript' => $clCconstJS->toJSONEntity(),
  92.                 'customization'        => $this->getParameter('custom.index'),
  93.                 'no_version'           => $oToken->getVersionNO(),
  94.                 'onboarding'           =>  $this->getParameter('site.onboarding'),
  95.             ] + $aParamLoginAnonyme
  96.         );
  97.     }
  98.     /**
  99.      * @Route(
  100.      *        "/about",
  101.      *        name="about",
  102.      *        options={"expose"=true}
  103.      * )
  104.      * @param Request             $request
  105.      * @return Response
  106.      */
  107.     public function aboutAction(Request $requestNOUTClientIHM $clNOUTClientIHM): Response
  108.     {
  109.         $oAbout $clNOUTClientIHM->getAbout();
  110.         if (!$clNOUTClientIHM->clGetVersion()->isVersionSup(NOUTOnlineVersion::SUPPORT_ABOUTSMX)){
  111.             $oAbout->smx = [];
  112.         }
  113.         return new JsonResponse([
  114.             'html' => $this->clTemplating->render$this->clTemplating->sGetTemplate('Component/about'),
  115.                                                    [
  116.                                                        'about'     => $oAbout,
  117.                                                    ]),
  118.                                 ]);
  119.     }
  120.     /**
  121.      * @Route(
  122.      *        "/max/suggest/{query}",
  123.      *        name="max_suggest",
  124.      *        options={"expose"=true}
  125.      * )
  126.      * @param Request             $request
  127.      * @return Response
  128.      */
  129.     public function maxSuggestAction(Request $requestNOUTClientIHM $clNOUTClientIHMstring $query =""): Response
  130.     {
  131.         $query urldecode($query);
  132.         $query Encoding::toLowerCaseWithoutAccent($query);
  133.         $query preg_replace('/\s+/'' '$query);
  134.         $aMaxAutoCompletion $clNOUTClientIHM->getMaxAutoCompletion();
  135.         if (!empty($query)){
  136.             if (strpos($query" ") !== false) {
  137.                 //il y a un espace dans la requete, c'est un contient tout bête
  138.                 $aMaxStartWith array_filter($aMaxAutoCompletion, function ($key) use ($query) {
  139.                     return str_starts_with($key$query);
  140.                 }, ARRAY_FILTER_USE_KEY);
  141.                 $aMaxContains array_filter($aMaxAutoCompletion, function ($key) use ($query$aMaxStartWith) {
  142.                     return str_contains($key$query) && !array_key_exists($key$aMaxStartWith);
  143.                 }, ARRAY_FILTER_USE_KEY);
  144.             }
  145.             else
  146.             {
  147.                 $aMaxStartWith array_filter($aMaxAutoCompletion, function ($key) use ($query) {
  148.                     $aKey explode(" "$key);
  149.                     foreach($aKey as $subkey){
  150.                         if (str_starts_with($subkey$query)) {
  151.                             return true;
  152.                         }
  153.                     }
  154.                     return false;
  155.                 }, ARRAY_FILTER_USE_KEY);
  156.                 $aMaxContains array_filter($aMaxAutoCompletion, function ($key) use ($query$aMaxStartWith) {
  157.                     $aKey explode(" "$key);
  158.                     foreach($aKey as $subkey){
  159.                         if (str_contains($subkey$query) && !array_key_exists($key$aMaxStartWith)) {
  160.                             return true;
  161.                         }
  162.                     }
  163.                     return false;
  164.                 }, ARRAY_FILTER_USE_KEY);
  165.             }
  166.         }
  167.         else {
  168.             $aMaxStartWith = [];
  169.             $aMaxContains=[];
  170.         }
  171.         $aMaxFilteredCompletion $aMaxStartWith+$aMaxContains;
  172.         $aRet array_map(
  173.             function (array $actions) {
  174.                 return [
  175.                     'id' => uniqid(),
  176.                     'actions' => array_keys($actions),
  177.                     'title' => array_pop($actions),
  178.                 ];
  179.             },
  180.             array_values($aMaxFilteredCompletion)
  181.         );
  182.         return new JsonResponse(array_slice($aRet0200));
  183.     }
  184.     /**
  185.      * @Route(
  186.      *        "/anonyme/login",
  187.      *        name="anonyme_login"
  188.      * )
  189.      * @param Request           $request
  190.      * @param InfoForLoginSIMAX $infoForLoginSIMAX
  191.      * @return Response
  192.      */
  193.     public function anonymeLoginAction(Request $requestInfoForLoginSIMAX $infoForLoginSIMAX): Response
  194.     {
  195.         $session $request->getSession();
  196.         $aParamLoginAnonyme $infoForLoginSIMAX->aGetParamForLoginSIMAX($session);
  197.         //quelque ajustement par rapport au mode anonyme
  198.         
  199.         $sso $this->getParameter('site.sso');
  200.         $sso['actif'] = false//pas de sso en mode extranet
  201.         return $this->render(
  202.             'WebSite/Security/login.html.twig',
  203.             [
  204.                 // last username entered by the user
  205.                 'check_route_name' => 'anonyme_check',
  206.                 'customization'    => $this->getParameter('custom.login'),
  207.                 'sso'              => $this->getParameter('site.sso'),
  208.                 'version_min'      => $this->getParameter('noutonline.version.min')['site'],
  209.                 'display_version'  => $this->getParameter('site.display')["version"],
  210.             ] + $aParamLoginAnonyme
  211.         );
  212.     }
  213.     /**
  214.      * @param Request               $request
  215.      * @param ConfigExtranet        $clConfigExtranet
  216.      * @param GestionLanguages      $gestionLanguages
  217.      * @param Security              $security
  218.      * @param TokenStorageInterface $tokenStorage
  219.      * @return ActionResult
  220.      * @throws \Exception
  221.      */
  222.     protected function _anonymeCnxAction(Request $requestConfigExtranet $clConfigExtranetGestionLanguages $gestionLanguagesSecurity $securityTokenStorageInterface $tokenStorage): ActionResult
  223.     {
  224.         //récupération des paramètres
  225.         $sLoginExtra $request->get('m_sLogin''');
  226.         $userSIMAX $clConfigExtranet->getUser();
  227.         $formulaire $clConfigExtranet->getForm();
  228.         //on récupère les infos de cryptage
  229.         [$clExtraExists$clIntraExists] = $this->clNoutclient->aGetInfoForCnxExtraAction($userSIMAX$sLoginExtra$formulaire$clConfigExtranet->getEncryption());
  230.         $sPasswordExtra $request->get('m_sPass''');
  231.         $sLocale $request->get('m_sLocale''');
  232.         $passwordSIMAX $clConfigExtranet->getPassword();
  233.         $codeLangue $gestionLanguages->getCodeLangue($sLocale);
  234.         $oRet $this->clNoutclient->oConnexionExtranet($sLoginExtra$sPasswordExtra$clExtraExists->clEncryptionType$codeLangue$userSIMAX$passwordSIMAX$clIntraExists->clEncryptionType$formulairetrue);
  235.         //il faut mettre à jour le token
  236.         /** @var NOUTToken $token */
  237.         $token $security->getToken();
  238.         $usernameTokenSIMAX = new OASISUsernameToken($userSIMAX$passwordSIMAX$clIntraExists->clEncryptionType);
  239.         $token->setUsernameToken($usernameTokenSIMAX);
  240.         $token->setAnonyme(false);
  241.         $usernameTokenExtranet = new OASISUsernameToken($sLoginExtra$sPasswordExtra$clExtraExists->clEncryptionType);
  242.         $token->setExtranetUsernameToken($usernameTokenExtranet);
  243.         $clConnectedUser $oRet->getConnectedUser();
  244.         $userTitle $clConnectedUser->getExtranet() ? $clConnectedUser->getExtranet()->getElementTitle() : $sLoginExtra;
  245.         $token->setNameToDisplay($userTitle);
  246.         $bSelectTimezone $this->getParameter('site.config')['timezone_at_cnx'];
  247.         $defaultTimezone $this->getParameter('site.config')['timezone'];
  248.         if ($bSelectTimezone || empty($defaultTimezone)) {
  249.             $token->setTimeZone($request->get('m_sTimeZone'));
  250.         } else {
  251.             $token->setTimeZone($defaultTimezone);
  252.         }
  253.         $tokenStorage->setToken($token);
  254.         return $oRet;
  255.     }
  256.     /**
  257.      * @Route(
  258.      *        "/anonyme/check",
  259.      *        name="anonyme_check"
  260.      * )
  261.      * @param Request               $request
  262.      * @param ConfigExtranet        $clConfigExtranet
  263.      * @param GestionLanguages      $gestionLanguages
  264.      * @param UrlGeneratorInterface $router
  265.      * @param Security              $security
  266.      * @param TokenStorageInterface $tokenStorage
  267.      * @return RedirectResponse
  268.      */
  269.     public function anonymeCheckLoginAction(Request $requestConfigExtranet $clConfigExtranetGestionLanguages $gestionLanguagesUrlGeneratorInterface $routerSecurity $securityTokenStorageInterface $tokenStorage): RedirectResponse
  270.     {
  271.         try {
  272.             $this->_anonymeCnxAction($request$clConfigExtranet$gestionLanguages$security$tokenStorage);
  273.         } catch (\Exception $e) {
  274.             $request->getSession()->set(Security::AUTHENTICATION_ERROR, [
  275.                 'message' => ($e instanceof SOAPException $e->getMessageOrigine() : $e->getMessage())
  276.             ]);
  277.             return new RedirectResponse($router->generate('anonyme_login', array()));
  278.         }
  279.         return new RedirectResponse($router->generate('index', array()));
  280.     }
  281.     /**
  282.      * @Route(
  283.      *        "/anonyme/cnx",
  284.      *        name="anonyme_cnx",
  285.      *        options={"expose"=true}
  286.      * )
  287.      * @param Request               $request
  288.      * @param ConfigExtranet        $clConfigExtranet
  289.      * @param GestionLanguages      $gestionLanguages
  290.      * @param Security              $security
  291.      * @param TokenStorageInterface $tokenStorage
  292.      * @return JsonResponse
  293.      * @throws \Throwable
  294.      */
  295.     public function anonymeCnxAction(Request $requestConfigExtranet $clConfigExtranetGestionLanguages $gestionLanguagesSecurity $securityTokenStorageInterface $tokenStorage): JsonResponse
  296.     {
  297.         try {
  298.             $oRet $this->_anonymeCnxAction($request$clConfigExtranet$gestionLanguages$security$tokenStorage);
  299.         } catch (\Exception $e) {
  300.             return $this->_handleException($request$e);
  301.         }
  302.         try
  303.         {
  304.             return new JsonResponse($this->clRenderEngine->oRenderNonCascade(
  305.                 $oRet,
  306.                 '',
  307.                 '',
  308.                 0
  309.             ));
  310.         } catch (\Exception $e) {
  311.             return $this->_handleRenderException($e);
  312.         }
  313.     }
  314.     /**
  315.      * @Route(
  316.      *     "/noutonline/{action}",
  317.      *     requirements={"action"=".*"},
  318.      *     name="noutonline"
  319.      * )
  320.      * @Route(
  321.      *     "/simaxonline/{action}",
  322.      *     requirements={"action"=".*"},
  323.      *     name="simaxonline"
  324.      * )
  325.      * @Route(
  326.      *      "/online/{action}",
  327.      *      requirements={"action"=".*"},
  328.      *      name="online"
  329.      *  )
  330.      * @param Request               $request
  331.      * @param string                $action
  332.      * @param NOUTOnlineRedirection $clNOUTOnlineRedirection
  333.      *
  334.      * @return Response
  335.      * @throws \Throwable
  336.      */
  337.     public function noutonlineProxyAction(Request $requeststring $actionNOUTOnlineRedirection $clNOUTOnlineRedirection): Response
  338.     {
  339.         if (!$this->getParameter('site.redir_no')['open']) {
  340.             return new Response(''404); //pas d'affichage particulier, on renvoit 404 si pas ouvert
  341.         }
  342.         return $clNOUTOnlineRedirection->TraiteRequest($request$action);
  343.     }
  344. }