<?php
namespace EADPlataforma\Controller\Website;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\Session;
use EADPlataforma\Entity\Cart;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\ConfigurationIp;
use EADPlataforma\Enum\UserEnum;
use EADPlataforma\Enum\ClientEnum;
use EADPlataforma\Enum\SessionEnum;
use EADPlataforma\Enum\ServicesEnum;
use EADPlataforma\Enum\ConfigurationEnum;
use EADPlataforma\Enum\ConfigurationIpEnum;
use EADPlataforma\Enum\ErrorEnum;
use EADPlataforma\Enum\WebhookQueueEnum;
use EADPlataforma\Enum\WebhookEnum;
use EADPlataforma\Enum\TagsMarketingEnum;
/**
* @Route(
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class LoginController extends AbstractWebsiteController {
/**
* @Route(
* path = "/login/{hash}",
* name = "login",
* methods = {"GET"},
* defaults = { "hash": null }
* )
* @Route(
* path = "/entrar/{hash}",
* name = "loginOld",
* methods = {"GET"},
* defaults = { "hash": null }
* )
*/
public function loginPage(Request $request) {
if($this->user){
$enrollmentRepository = $this->em->getRepository(Enrollment::class);
$enrollmentNumber = $enrollmentRepository->countUserEnrollment(
$this->user->getId()
);
$platformType = $this->client->getPlatformType();
if(
!empty($enrollmentNumber) ||
$platformType == ClientEnum::PLATFORM_TYPE_RESTRICTED
){
return $this->redirectToRoute('resume');
}
return $this->redirectToRoute('home');
}
$this->data['hash'] = $request->get('hash');
if(!empty($this->generalService->getCookie('remember'))){
$this->data['remember'] = true;
}else{
$this->data['remember'] = false;
}
return $this->renderEAD('login/login.html.twig');
}
/**
* @Route(
* path = "/confirm/{hash}",
* name = "loginConfirm",
* methods = {"GET"},
* requirements = { "hash" = "([a-zA-Z0-9_-]+)" }
* )
*/
public function loginConfirm(Request $request) {
if($this->user){
$sessionOn = $this->user->getSession();
$sessionOn->delete();
$this->configuration->getSessionSym()->set('session', null);
$this->em->flush();
$this->generalService->deleteCookie('remember');
$this->generalService->deleteCookie('sessiontoken');
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
$this->requestUtil->setRequest($request)->setData();
$hash = $request->get('hash');
$userRepository = $this->em->getRepository(User::class);
$user = $userRepository->findOneBy([
"hashIdentify" => $hash,
"deleted" => UserEnum::ITEM_NO_DELETED
]);
$this->data["hash"] = base64_encode($this->domain);
$this->data['remember'] = $this->generalService->getCookie('remember');
if(!$user){
$this->data["confirmMsg"] = $this->configuration->getLanguage(
'user_not_found', 'login'
);
$this->data["confirmStatus"] = UserEnum::NO;
return $this->renderEAD('login/login.html.twig');
}
if($user->getStatus() != UserEnum::WAITING){
$this->data["confirmMsg"] = $this->configuration->getLanguage(
'invalid_action', 'login'
);
$this->data["confirmStatus"] = UserEnum::NO;
return $this->renderEAD('login/login.html.twig');
}
$user->setStatus(UserEnum::ACTIVE);
$user->setConfirmationDate(date('Y-m-d H:i:s'));
$user->setValidEmail(UserEnum::DELIVERABLE);
$pixelService = $this->generalService->getService('Marketing\\PixelService');
$pixelService->sendConversion('CompleteRegistration');
$marketingService = $this->generalService->getService('Marketing\\MarketingService');
$marketingService->setTag(TagsMarketingEnum::TAG_CONFIRM_REGISTER);
$marketingService->setUser($user);
$marketingService->send();
$this->em->flush();
$userWebhook = $userRepository->getToWebhook($user);
$dataObj= (object)[
"user" => $userWebhook,
];
$webhookService = $this->generalService->getService('WebhookService');
$webhookService->addItemList(WebhookEnum::USER, $dataObj);
$this->data["confirmMsg"] = $this->configuration->getLanguage(
'user_confirmed',
'login'
);
$this->data["confirmStatus"] = UserEnum::YES;
return $this->renderEAD('login/login.html.twig');
}
/**
* @Route(
* path = "/stopEmail/{hash}",
* name = "stopEmail",
* methods = {"GET"},
* requirements = { "hash" = "([a-zA-Z0-9_-]+)" }
* )
*/
public function stopEmail(Request $request) {
$this->requestUtil->setRequest($request)->setData();
$hash = $request->get('hash');
$user = $this->em->getRepository(User::class)->findOneBy([
"hashIdentify" => $hash,
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if(!$user){
$this->data["confirmMsg"] = $this->configuration->getLanguage('user_not_found', 'login');
$this->data["confirmStatus"] = UserEnum::NO;
$this->data["hash"] = null;
return $this->renderEAD('login/login.html.twig');
}
$this->data["hash"] = $hash;
$sessionOn = $user->getSession();
if($sessionOn){
$sessionOn->delete();
$this->configuration->getSessionSym()->set('session', null);
$this->em->flush();
$this->generalService->deleteCookie('remember');
$this->generalService->deleteCookie('sessiontoken');
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
$user->delete();
$this->em->flush();
$this->data["confirmMsg"] = $this->configuration->getLanguage('user_deleted', 'login');
$this->data["confirmStatus"] = UserEnum::YES;
return $this->renderEAD('login/login.html.twig');
}
/**
* @Route(
* path = "/stopNotification/{hash}",
* name = "stopNotification",
* methods = {"GET"},
* requirements = { "hash" = "([a-zA-Z0-9_-]+)" }
* )
*/
public function stopNotification(Request $request) {
$this->requestUtil->setRequest($request)->setData();
$hash = $request->get('hash');
$user = $this->em->getRepository(User::class)->findOneBy([
"hashIdentify" => $hash,
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if(!$user){
$this->data["confirmMsg"] = $this->configuration->getLanguage(
'user_not_found', 'login'
);
$this->data["hash"] = null;
return $this->renderEAD('login/login.html.twig');
}
$this->data['user'] = $user;
return $this->renderEAD('login/stop-notification.html.twig');
}
/**
* @Route(
* path = "/login/fast/{pass}",
* name = "loginFast",
* methods = {"GET"}
* )
*/
public function loginFast(Request $request) {
$this->requestUtil->setRequest($request)->setData();
$session = new Session();
$pass = $request->get('pass');
$pass = $this->stringUtil->decryptArray($pass);
if(empty($pass)){
return $this->redirectToRoute('notFound');
}
$userId = $pass['userId'];
$time = $pass['time'];
$urlRedirect = null;
if($userId == UserEnum::YES){
return $this->redirectToRoute('notFound');
}
if(!empty($pass['urlRedirect'])){
$urlRedirect = $pass['urlRedirect'];
}
$urlRedirectCart = $this->requestUtil->getField('url');
if(!empty($urlRedirectCart)){
$urlRedirect = $urlRedirectCart;
}
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $userId,
"deleted" => UserEnum::ITEM_NO_DELETED ,
]);
if(!$user){
return $this->redirectToRoute('notFound');
}
if($user->getStatus() == UserEnum::BLOCK){
return $this->redirectToRoute('notFound');
}
$this->userPermissionUtil->setUser($user);
$platformStatus = $this->clientConfig->getPlatformStatus();
if($platformStatus == ClientEnum::PLATFORM_STATUS_FREEZED){
if(!$this->userPermissionUtil->canAccessAdm()){
return $this->redirectToRoute('notFound');
}
}
$ipApi = $this->generalService->getService('IpApiService');
$ipApi->setRequest($request);
$session->setUser($user);
$session->setIp($ipApi->getIp());
$session->setIspName($ipApi->getIsp());
$session->setCoordinate($ipApi->getCoordinate());
$session->setTimeZone($ipApi->getTimeZone());
$session->setCity($ipApi->getCity());
$session->setState($ipApi->getState());
$session->setCountry($ipApi->getCountry());
$session->setUserAgent($request->headers->get('User-Agent'));
$sessionOn = $this->em->getRepository(Session::class)->findOneBy([
"user" => $user->getId(),
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if($user->getType() != UserEnum::STUDENT){
$session->setIsAdmin(SessionEnum::YES);
}else{
if($sessionOn){
$sessionOn->delete();
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
}
$errors = $this->validateEntity($session);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->persist($session);
$this->em->flush();
$crmService = $this->generalService->getService('CRM\\CrmService');
$crmService->savePerson($user);
$emptyCart = $this->em->getRepository(Cart::class)->updateCartHashToUser($user);
$time = 'Session';
$this->generalService->setCookie('sessiontoken', $session->getToken(), $time);
if(is_null($urlRedirect)){
return $this->redirectToRoute('resume');
}
if(
$emptyCart &&
(empty($urlRedirect) || stristr($urlRedirect,'/cart'))
&& !stristr($urlRedirect,'/indvidual')
){
return $this->redirectToRoute('resume');
}
return $this->redirect($urlRedirect, 301);
}
/**
* @Route(
* path = "/login/api/{pass}",
* name = "loginApi",
* methods = {"GET"}
* )
*/
public function loginApi(Request $request) {
$this->requestUtil->setRequest($request)->setData();
$ipApi = $this->generalService->getService('IpApiService');
$session = new Session();
$pass = $request->get('pass');
$pass = $this->stringUtil->decryptArray($pass);
if(empty($pass)){
return $this->eadResponse([
"message" => $this->configuration->getLanguage('login_invalid', 'login')
], ErrorEnum::ACTION_INVALID);
}
$userId = $pass['userId'];
$time = $pass['time'];
$urlRedirect = null;
if(!empty($pass['urlRedirect'])){
$urlRedirect = $pass['urlRedirect'];
}
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $userId,
"status" => UserEnum::ACTIVE,
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if(!$user){
return $this->eadResponse([
"message" => $this->configuration->getLanguage('login_invalid', 'login')
], ErrorEnum::ACTION_INVALID);
}
if($user->getStatus() == UserEnum::BLOCK){
return $this->eadResponse([
"message" => $this->configuration->getLanguage('login_invalid', 'login')
], ErrorEnum::ACTION_INVALID);
}
if($user->getId() == UserEnum::YES){
return $this->eadResponse([
"message" => $this->configuration->getLanguage('login_invalid', 'login')
], ErrorEnum::ACTION_INVALID);
}
$platformStatus = $this->clientConfig->getPlatformStatus();
if($platformStatus == ClientEnum::PLATFORM_STATUS_FREEZED){
if(!$this->userPermissionUtil->canAccessAdm()){
return $this->eadResponse([
"message" => $this->configuration->getLanguage('login_invalid', 'login')
], ErrorEnum::ACTION_INVALID);
}
}
$ipApi->setRequest($request);
$session->setUser($user);
$session->setIp($ipApi->getIp());
$session->setIspName($ipApi->getIsp());
$session->setCoordinate($ipApi->getCoordinate());
$session->setTimeZone($ipApi->getTimeZone());
$session->setCity($ipApi->getCity());
$session->setState($ipApi->getState());
$session->setCountry($ipApi->getCountry());
$session->setUserAgent($request->headers->get('User-Agent'));
$sessionOn = $this->em->getRepository(Session::class)->findOneBy([
"user" => $user->getId(),
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if($user->getType() != UserEnum::STUDENT){
$session->setIsAdmin(SessionEnum::YES);
}else{
if($sessionOn){
$sessionOn->delete();
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
}
$errors = $this->validateEntity($session);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->persist($session);
$this->em->flush();
$this->generalService->setCookie('sessiontoken', $session->getToken());
if(is_null($urlRedirect)){
return $this->redirectToRoute('resume');
}
return $this->redirect($urlRedirect, 301);
}
/**
* @Route(
* path = "/login/eadmin/sso/{userSign}/{tokenSign}",
* name = "loginEadminSSO",
* methods = {"GET"}
* )
*/
public function loginEadminSSO(Request $request){
$this->requestUtil->setRequest($request)->setData();
$userSign = $request->get('userSign');
$tokenSign = $request->get('tokenSign');
$url = $request->get('url');
$res = $this->generalService->verifySignedDataExpire($tokenSign);
if($res != md5($request->getHost())){
return $this->redirectToRoute('notFound');
}
$userId = $this->generalService->verifySignedDataExpire($userSign);
if(!$userId){
return $this->redirectToRoute('notFound');
}
$userAgent = $request->headers->get('User-Agent');
$blockUserAgent = [
"axios",
"Axios",
];
if(in_array($userAgent, $blockUserAgent)){
return $this->redirectToRoute('notFound');
}
$userInfo = $this->generalService->getUserFromEADAdminByID(
(string)$userId,
(string)$this->clientConfig->getId(),
(
in_array($request->getHost(), ConfigurationEnum::DOMAIN_DEV) ?
ConfigurationEnum::IP_LOCAL :
$request->getClientIp()
),
$userAgent,
$request->getHost()
);
if(empty($userInfo['usuario_id'])){
return $this->redirectToRoute('notFound');
}
$permission = (isset($userInfo['permission']) ? $userInfo['permission'] : null);
$tokenOn = $this->generalService->getCookie('sessiontoken');
if(!empty($tokenOn)){
$sessionOn = $this->em->getRepository(Session::class)->findOneBy([
"token" => $tokenOn
]);
if($sessionOn){
$sessionOn->delete();
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
$this->em->flush();
}
}
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => UserEnum::YES
]);
$ipApi = $this->generalService->getService('IpApiService');
$ipApi->setRequest($request);
$session = new Session();
$session->setUser($user);
$session->setIp($ipApi->getIp());
$session->setIspName($ipApi->getIsp());
$session->setCoordinate($ipApi->getCoordinate());
$session->setTimeZone($ipApi->getTimeZone());
$session->setCity($ipApi->getCity());
$session->setState($ipApi->getState());
$session->setCountry($ipApi->getCountry());
$session->setUserAgent($userAgent);
$session->setIsAdmin(SessionEnum::YES);
$session->setPermission($permission);
$errors = $this->validateEntity($session);
if($errors){
return $this->redirectToRoute('notFound');
}
$this->em->persist($session);
$this->em->flush();
$this->generalService->setCookie('sessiontoken', $session->getToken());
if(empty($url)){
return $this->redirectToRoute('resume');
}
return $this->redirect($url, 301);
}
/**
* @Route(
* path = "/change/password/{hash}",
* name = "changePasswordPost",
* methods = {"GET"},
* requirements = { "hash" = "([a-zA-Z0-9_-]+)" }
* )
*/
public function changePassword(Request $request) {
$hash = $request->get("hash");
$hashData = json_decode(base64_decode($this->stringUtil->decodeHex($hash)));
$templateName = 'login/recover-password.html.twig';
$error = false;
$this->data['hash'] = $hash;
$this->data['remember'] = $this->generalService->getCookie('remember');
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $hashData->userId,
"deleted" => UserEnum::ITEM_NO_DELETED
]);
if(!$user){
$error = true;
}
$oldPass = $user->getOldPassword(true);
if(isset($hashData->passTotal) && $hashData->passTotal != count($oldPass)){
$error = true;
}
if($hashData->today != date("Ymd")){
$error = true;
}
if($error){
$this->data["confirmMsg"] = $this->configuration->getLanguage(
'invalid_hash',
'login'
);
$this->data["confirmStatus"] = UserEnum::NO;
$templateName = 'login/login.html.twig';
}
return $this->renderEAD($templateName);
}
/**
* @Route(
* path = "/logoff/user",
* name = "userLogoff",
* methods = {"GET"}
* )
*/
public function logoffUser(Request $request) {
$userOrigin = null;
if($this->user && $this->user->getSession()){
$sessionOn = $this->user->getSession();
$userOrigin = $sessionOn->getUserOrigin();
$sessionOn->delete();
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
if($userOrigin){
$sessionOld = $this->em->getRepository(Session::class)->findOneBy([
"user" => $userOrigin->getId(),
"deleted" => UserEnum::ITEM_NO_DELETED
]);
$ipApi = $this->generalService->getService('IpApiService');
$ipApi->setRequest($request);
$session = new Session();
$session->setUser($userOrigin);
$session->setIp($ipApi->getIp());
$session->setIspName($ipApi->getIsp());
$session->setCoordinate($ipApi->getCoordinate());
$session->setTimeZone($ipApi->getTimeZone());
$session->setCity($ipApi->getCity());
$session->setState($ipApi->getState());
$session->setCountry($ipApi->getCountry());
$session->setIsAdmin(UserEnum::YES);
$session->setUserAgent($request->headers->get('User-Agent'));
$errors = $this->validateEntity($session);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
if($sessionOld){
$session->setPermission($sessionOld->getPermission());
$session->setToken($sessionOld->getToken());
$sessionOld->delete();
$time = time() + (24 * 60 * 60);
if($userOrigin->getId() != UserEnum::YES){
if($this->generalService->getCookie('remember') == SessionEnum::YES){
$time = null;
}
}
$this->generalService->setCookie(
'sessiontoken',
$session->getToken(),
$time
);
}
$this->em->persist($session);
$this->em->flush();
/*return $this->eadResponse([
"token" => $session->getToken(),
"userId" => $userOrigin->getId()
]);*/
}
$this->em->flush();
return $this->redirectToRoute('home');
}
/**
* @Route(
* path = "/logoff",
* name = "logoff",
* methods = {"GET"},
* )
*/
public function logoff(Request $request) {
if($this->user){
$sessionOn = $this->user->getSession();
if($sessionOn){
$sessionOn->delete();
$this->configuration->getSessionSym()->set('session', null);
$this->em->flush();
$this->generalService->deleteCookie('remember');
$this->generalService->deleteCookie('sessiontoken');
$this->generalService->logoffWS(
$sessionOn,
$this->clientConfig->getId()
);
}
}
return $this->redirectToRoute('home');
}
}