<?php
namespace App\Controller;
use App\Entity\User\NOUTOnlineUser;
use App\JSONEntity\JSGlobal\ConnexionInfos;
use App\Misc\Encoding;
use App\Service\ConfigExtranet;
use App\Service\ConstanteJavascript;
use App\Service\GestionLanguages;
use App\Service\InfoForLoginSIMAX;
use NOUT\Bundle\NOUTOnlineBundle\Entity\ActionResult;
use NOUT\Bundle\NOUTOnlineBundle\Entity\NOUTOnlineVersion;
use NOUT\Bundle\NOUTOnlineBundle\Entity\UsernameToken\OASISUsernameToken;
use NOUT\Bundle\NOUTOnlineBundle\Security\Authentication\Token\NOUTToken;
use NOUT\Bundle\NOUTOnlineBundle\Service\NOUTClientIHM;
use NOUT\Bundle\NOUTOnlineBundle\Service\NOUTOnlineRedirection;
use NOUT\Bundle\NOUTOnlineBundle\SOAP\SOAPException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
class DefaultController extends AbstractController
{
/**
* @Route(
* "/",
* name="index"
* )
* @param Request $request
* @return Response
* @throws \Exception
*/
public function indexAction(Request $request): Response
{
if (!$this->clNoutclient->isVersionMinSite() && $this->getParameter('kernel.environment') !== 'dev') {
return $this->forward('Security/login.html.twig', array());
}
return $this->forward('App\Controller\DefaultController::backboneAppAction', []);
}
/**
* @Route(
* "/forbidden",
* name="forbidden",
* )
* @param Request $request
* @param UrlGeneratorInterface $router
* @return RedirectResponse
* @throws SOAPException
*/
public function forbiddenAction(Request $request, UrlGeneratorInterface $router): RedirectResponse
{
$exception = json_decode($request->get('exception'));
if (empty($exception)) {
//on redirige vers login
return new RedirectResponse($router->generate('session_logout', array()));
}
throw new SOAPException($exception->message, $exception->code);
}
/**
* @Route(
* "/backbone_app",
* name="backbone_app"
* )
* @param Request $request
* @param ConstanteJavascript $clCconstJS
* @return Response
*/
public function backboneAppAction(Request $request, ConstanteJavascript $clCconstJS, TokenStorageInterface $tokenStorage, ConfigExtranet $configExtranet, InfoForLoginSIMAX $infoForLoginSIMAX): Response
{
/** @var NOUTToken $oToken */
$oToken = $tokenStorage->getToken();
$aParamLoginAnonyme = [];
$authExtraFromAnonyme = null;
if ($configExtranet->isExtranet()) {
$authExtraFromAnonyme = $this->getParameter('site.extranet.from_anonyme');
if ($authExtraFromAnonyme) {
//pour générer le formulaire de login
$aParamLoginAnonyme = $infoForLoginSIMAX->aGetParamForLoginSIMAX($request->getSession());
}
}
/** @var NOUTOnlineUser $user */
$user = $oToken->getUser();
$withPicture = $this->clNoutclient->getProfilPicture($user->getPictureLink(), $oToken->getResource(), $oToken->getIntranet(), $oToken->isExtranet());
return $this->render(
$this->clTemplating->sGetTemplate('index'),
[
'connection_infos' => new ConnexionInfos($oToken, $authExtraFromAnonyme, $this->getParameter('site.anonyme.auth')['other'], $withPicture),
'constante_javascript' => $clCconstJS->toJSONEntity(),
'customization' => $this->getParameter('custom.index'),
'no_version' => $oToken->getVersionNO(),
'onboarding' => $this->getParameter('site.onboarding'),
] + $aParamLoginAnonyme
);
}
/**
* @Route(
* "/about",
* name="about",
* options={"expose"=true}
* )
* @param Request $request
* @return Response
*/
public function aboutAction(Request $request, NOUTClientIHM $clNOUTClientIHM): Response
{
$oAbout = $clNOUTClientIHM->getAbout();
if (!$clNOUTClientIHM->clGetVersion()->isVersionSup(NOUTOnlineVersion::SUPPORT_ABOUTSMX)){
$oAbout->smx = [];
}
return new JsonResponse([
'html' => $this->clTemplating->render( $this->clTemplating->sGetTemplate('Component/about'),
[
'about' => $oAbout,
]),
]);
}
/**
* @Route(
* "/max/suggest/{query}",
* name="max_suggest",
* options={"expose"=true}
* )
* @param Request $request
* @return Response
*/
public function maxSuggestAction(Request $request, NOUTClientIHM $clNOUTClientIHM, string $query =""): Response
{
$query = urldecode($query);
$query = Encoding::toLowerCaseWithoutAccent($query);
$query = preg_replace('/\s+/', ' ', $query);
$aMaxAutoCompletion = $clNOUTClientIHM->getMaxAutoCompletion();
if (!empty($query)){
if (strpos($query, " ") !== false) {
//il y a un espace dans la requete, c'est un contient tout bête
$aMaxStartWith = array_filter($aMaxAutoCompletion, function ($key) use ($query) {
return str_starts_with($key, $query);
}, ARRAY_FILTER_USE_KEY);
$aMaxContains = array_filter($aMaxAutoCompletion, function ($key) use ($query, $aMaxStartWith) {
return str_contains($key, $query) && !array_key_exists($key, $aMaxStartWith);
}, ARRAY_FILTER_USE_KEY);
}
else
{
$aMaxStartWith = array_filter($aMaxAutoCompletion, function ($key) use ($query) {
$aKey = explode(" ", $key);
foreach($aKey as $subkey){
if (str_starts_with($subkey, $query)) {
return true;
}
}
return false;
}, ARRAY_FILTER_USE_KEY);
$aMaxContains = array_filter($aMaxAutoCompletion, function ($key) use ($query, $aMaxStartWith) {
$aKey = explode(" ", $key);
foreach($aKey as $subkey){
if (str_contains($subkey, $query) && !array_key_exists($key, $aMaxStartWith)) {
return true;
}
}
return false;
}, ARRAY_FILTER_USE_KEY);
}
}
else {
$aMaxStartWith = [];
$aMaxContains=[];
}
$aMaxFilteredCompletion = $aMaxStartWith+$aMaxContains;
$aRet = array_map(
function (array $actions) {
return [
'id' => uniqid(),
'actions' => array_keys($actions),
'title' => array_pop($actions),
];
},
array_values($aMaxFilteredCompletion)
);
return new JsonResponse(array_slice($aRet, 0, 200));
}
/**
* @Route(
* "/anonyme/login",
* name="anonyme_login"
* )
* @param Request $request
* @param InfoForLoginSIMAX $infoForLoginSIMAX
* @return Response
*/
public function anonymeLoginAction(Request $request, InfoForLoginSIMAX $infoForLoginSIMAX): Response
{
$session = $request->getSession();
$aParamLoginAnonyme = $infoForLoginSIMAX->aGetParamForLoginSIMAX($session);
//quelque ajustement par rapport au mode anonyme
$sso = $this->getParameter('site.sso');
$sso['actif'] = false; //pas de sso en mode extranet
return $this->render(
'WebSite/Security/login.html.twig',
[
// last username entered by the user
'check_route_name' => 'anonyme_check',
'customization' => $this->getParameter('custom.login'),
'sso' => $this->getParameter('site.sso'),
'version_min' => $this->getParameter('noutonline.version.min')['site'],
'display_version' => $this->getParameter('site.display')["version"],
] + $aParamLoginAnonyme
);
}
/**
* @param Request $request
* @param ConfigExtranet $clConfigExtranet
* @param GestionLanguages $gestionLanguages
* @param Security $security
* @param TokenStorageInterface $tokenStorage
* @return ActionResult
* @throws \Exception
*/
protected function _anonymeCnxAction(Request $request, ConfigExtranet $clConfigExtranet, GestionLanguages $gestionLanguages, Security $security, TokenStorageInterface $tokenStorage): ActionResult
{
//récupération des paramètres
$sLoginExtra = $request->get('m_sLogin', '');
$userSIMAX = $clConfigExtranet->getUser();
$formulaire = $clConfigExtranet->getForm();
//on récupère les infos de cryptage
[$clExtraExists, $clIntraExists] = $this->clNoutclient->aGetInfoForCnxExtraAction($userSIMAX, $sLoginExtra, $formulaire, $clConfigExtranet->getEncryption());
$sPasswordExtra = $request->get('m_sPass', '');
$sLocale = $request->get('m_sLocale', '');
$passwordSIMAX = $clConfigExtranet->getPassword();
$codeLangue = $gestionLanguages->getCodeLangue($sLocale);
$oRet = $this->clNoutclient->oConnexionExtranet($sLoginExtra, $sPasswordExtra, $clExtraExists->clEncryptionType, $codeLangue, $userSIMAX, $passwordSIMAX, $clIntraExists->clEncryptionType, $formulaire, true);
//il faut mettre à jour le token
/** @var NOUTToken $token */
$token = $security->getToken();
$usernameTokenSIMAX = new OASISUsernameToken($userSIMAX, $passwordSIMAX, $clIntraExists->clEncryptionType);
$token->setUsernameToken($usernameTokenSIMAX);
$token->setAnonyme(false);
$usernameTokenExtranet = new OASISUsernameToken($sLoginExtra, $sPasswordExtra, $clExtraExists->clEncryptionType);
$token->setExtranetUsernameToken($usernameTokenExtranet);
$clConnectedUser = $oRet->getConnectedUser();
$userTitle = $clConnectedUser->getExtranet() ? $clConnectedUser->getExtranet()->getElementTitle() : $sLoginExtra;
$token->setNameToDisplay($userTitle);
$bSelectTimezone = $this->getParameter('site.config')['timezone_at_cnx'];
$defaultTimezone = $this->getParameter('site.config')['timezone'];
if ($bSelectTimezone || empty($defaultTimezone)) {
$token->setTimeZone($request->get('m_sTimeZone'));
} else {
$token->setTimeZone($defaultTimezone);
}
$tokenStorage->setToken($token);
return $oRet;
}
/**
* @Route(
* "/anonyme/check",
* name="anonyme_check"
* )
* @param Request $request
* @param ConfigExtranet $clConfigExtranet
* @param GestionLanguages $gestionLanguages
* @param UrlGeneratorInterface $router
* @param Security $security
* @param TokenStorageInterface $tokenStorage
* @return RedirectResponse
*/
public function anonymeCheckLoginAction(Request $request, ConfigExtranet $clConfigExtranet, GestionLanguages $gestionLanguages, UrlGeneratorInterface $router, Security $security, TokenStorageInterface $tokenStorage): RedirectResponse
{
try {
$this->_anonymeCnxAction($request, $clConfigExtranet, $gestionLanguages, $security, $tokenStorage);
} catch (\Exception $e) {
$request->getSession()->set(Security::AUTHENTICATION_ERROR, [
'message' => ($e instanceof SOAPException ? $e->getMessageOrigine() : $e->getMessage())
]);
return new RedirectResponse($router->generate('anonyme_login', array()));
}
return new RedirectResponse($router->generate('index', array()));
}
/**
* @Route(
* "/anonyme/cnx",
* name="anonyme_cnx",
* options={"expose"=true}
* )
* @param Request $request
* @param ConfigExtranet $clConfigExtranet
* @param GestionLanguages $gestionLanguages
* @param Security $security
* @param TokenStorageInterface $tokenStorage
* @return JsonResponse
* @throws \Throwable
*/
public function anonymeCnxAction(Request $request, ConfigExtranet $clConfigExtranet, GestionLanguages $gestionLanguages, Security $security, TokenStorageInterface $tokenStorage): JsonResponse
{
try {
$oRet = $this->_anonymeCnxAction($request, $clConfigExtranet, $gestionLanguages, $security, $tokenStorage);
} catch (\Exception $e) {
return $this->_handleException($request, $e);
}
try
{
return new JsonResponse($this->clRenderEngine->oRenderNonCascade(
$oRet,
'',
'',
0
));
} catch (\Exception $e) {
return $this->_handleRenderException($e);
}
}
/**
* @Route(
* "/noutonline/{action}",
* requirements={"action"=".*"},
* name="noutonline"
* )
* @Route(
* "/simaxonline/{action}",
* requirements={"action"=".*"},
* name="simaxonline"
* )
* @Route(
* "/online/{action}",
* requirements={"action"=".*"},
* name="online"
* )
* @param Request $request
* @param string $action
* @param NOUTOnlineRedirection $clNOUTOnlineRedirection
*
* @return Response
* @throws \Throwable
*/
public function noutonlineProxyAction(Request $request, string $action, NOUTOnlineRedirection $clNOUTOnlineRedirection): Response
{
if (!$this->getParameter('site.redir_no')['open']) {
return new Response('', 404); //pas d'affichage particulier, on renvoit 404 si pas ouvert
}
return $clNOUTOnlineRedirection->TraiteRequest($request, $action);
}
}