<?php
// src/Centralstage/SecurityBundle/Controller/SecurityController.php
namespace App\Centralstage\SecurityBundle\Controller;
use App\Centralstage\CoreBundle\Models\DefaultModel;
use App\Centralstage\CoreBundle\Service\AuthenticationService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Centralstage\CoreBundle\Controller\AbstractedController;
use App\Centralstage\CoreBundle\Models\UsersModel;
use App\Centralstage\DemoModuleBundle\Models\DemoModuleModel;
use App\Centralstage\SecurityBundle\Models\SSOAuditModel;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use Symfony\Component\HttpFoundation\RedirectResponse;
use TheNetworg\OAuth2\Client\Provider\Azure;
class SecurityController extends AbstractedController
{
/**
* @Route("/login", name="login")
*/
public function login(Request $request){
/* If user is already authenticated, redirect him to the default landing page */
$authDetails = unserialize($this->session->get('authDetails'));
$error = $request->query->get('error');
$success = $request->query->get('success');
$showDemoModuleBtn= $_ENV["SHOW_DEMO_MODULE"] ?? false;
$demoModuleURL = $_ENV["DEMO_MODULE_URL"] ?? false;
if ($authDetails != null) {
$userEmail = $authDetails["userEmail"];
$getUserList = UsersModel::getUserByEmail($this->doctrine,$userEmail);
if($getUserList){
return $this->redirect($this->generateUrl('home'));
}
}
$ipAddress = $request->getClientIp();
$ipExpiryTime = DefaultModel::getExpiryTime($this->doctrine,$ipAddress);
if(!$ipExpiryTime){
DefaultModel::insertIP($this->doctrine,$ipAddress,0,0,0,0);
$ipExpiryTime = DefaultModel::getExpiryTime($this->doctrine,$ipAddress);
}
if($ipExpiryTime["remainingTime"] > 0 && $ipExpiryTime["remainingTime"] != null){
return $this->render('@CentralstageCore/default/ipblock.html.twig');
}else{
AuthenticationService::logoutUser($request, $this->doctrine);
$response = new Response();
$response->headers->clearCookie('authDetails');
$response->headers->clearCookie('pageTheme');
$response->headers->clearCookie('userID');
$response->sendHeaders();
if($showDemoModuleBtn){
$availableModules = DemoModuleModel::getAllDemoModuleList($this->doctrine);
return $this->render('@CentralstageSecurity/accounts/loginWithDemo.html.twig',array('theme' => 'lightTheme','error' => $error,'success' => $success, 'modulesDetails' => $availableModules, "demoModuleURL"=>$demoModuleURL));
}
return $this->render('@CentralstageSecurity/accounts/login.html.twig',array('theme' => 'lightTheme','error' => $error,'success' => $success,"showDemoModuleBtn"=>$showDemoModuleBtn));
}
}
public function getLandingUrl($userRoleID){
switch ($userRoleID) {
default:
return $this->generateUrl('home');
}
}
/**
* @Route("/logout", name="logout")
*/
public function logout(Request $request){
AuthenticationService::logoutUser($request, $this->doctrine);
$response = new Response();
$response->headers->clearCookie('authDetails');
$response->headers->clearCookie('pageTheme');
$response->headers->clearCookie('userID');
$response->sendHeaders();
return $this->redirect($this->generateUrl('login'));
}
/**
* @Route("/connect/azure", name="connect_azure_start")
*/
public function connectAction(ClientRegistry $clientRegistry): RedirectResponse
{
return $clientRegistry->getClient('azure')->redirect([], []);
}
/**
* @Route("/sso/callback", name="sso_callback")
*/
public function ssocallback(Request $request, ClientRegistry $clientRegistry,Azure $azureProvider)
{
return $this->redirectToRoute('home');
}
/**
* @Route("/sso/consent-success", name="sso_consent_success")
*/
public function ssoconsentsuccess(Request $request)
{
$requestUri = $request->getRequestUri();
$queryString = parse_url($requestUri, PHP_URL_QUERY);
// Parse the query string into an associative array
parse_str($queryString, $queryParams);
$orgID = $queryParams['state'] ?? null;
if(isset($queryParams['error'])){
$activityStatus = 'Failed';
}else{
$activityStatus = 'Approved';
}
SSOAuditModel::updateSSOauditLog($this->doctrine,$activityStatus,$queryString,$orgID);
return $this->redirect($this->generateUrl('home'));
}
}