vendor/uvdesk/core-framework/Providers/UserProvider.php line 86

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Providers;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\Security\Core\User\UserInterface;
  6. use Symfony\Bundle\SecurityBundle\Security\FirewallMap;
  7. use Symfony\Component\DependencyInjection\ContainerInterface;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. use Symfony\Component\Security\Core\User\UserProviderInterface;
  10. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  11. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Services\ReCaptchaService;
  15. class UserProvider implements UserProviderInterface
  16. {
  17. private $firewall;
  18. private $container;
  19. private $requestStack;
  20. private $entityManager;
  21. private $session;
  22. private $recaptchaService;
  23. public function __construct(FirewallMap $firewall, ContainerInterface $container, RequestStack $requestStack, EntityManagerInterface $entityManager, SessionInterface $session, ReCaptchaService $recaptchaService)
  24. {
  25. $this->firewall = $firewall;
  26. $this->container = $container;
  27. $this->requestStack = $requestStack;
  28. $this->entityManager = $entityManager;
  29. $this->session = $session;
  30. $this->recaptchaService = $recaptchaService;
  31. }
  32. public function loadUserByUsername($username)
  33. {
  34. $request = $this->requestStack->getCurrentRequest();
  35. $recaptchaDetails = $this->recaptchaService->getRecaptchaDetails();
  36. if (
  37. $request->getMethod() == 'POST' && $recaptchaDetails && $recaptchaDetails->getIsActive() == true
  38. && ($request->attributes->get('_route') == 'helpdesk_member_handle_login' || $request->attributes->get('_route') == 'helpdesk_customer_login')
  39. && $this->recaptchaService->getReCaptchaResponse($request->request->get('g-recaptcha-response'))
  40. ) {
  41. $this->session->getFlashBag()->add('warning',"Warning ! Please select correct CAPTCHA or login again with correct CAPTCHA !");
  42. throw new UsernameNotFoundException('Please select correct CAPTCHA for'.$username);
  43. } else {
  44. $queryBuilder = $this->entityManager->createQueryBuilder()
  45. ->select('user, userInstance')
  46. ->from(User::class, 'user')
  47. ->leftJoin(UserInstance::class, 'userInstance', 'WITH', 'user.id = userInstance.user')
  48. ->leftJoin('userInstance.supportRole', 'supportRole')
  49. ->where('user.email = :email')->setParameter('email', trim($username))
  50. ->andWhere('userInstance.isActive = :isActive')->setParameter('isActive', true)
  51. ->setMaxResults(1)
  52. ;
  53. // Retrieve user instances based on active firewall
  54. $activeFirewall = $this->firewall->getFirewallConfig($this->requestStack->getCurrentRequest())->getName();
  55. switch (strtolower($activeFirewall)) {
  56. case 'member':
  57. case 'back_support':
  58. $queryBuilder
  59. ->andWhere('supportRole.code = :roleOwner OR supportRole.code = :roleAdmin OR supportRole.code = :roleAgent')
  60. ->setParameter('roleOwner', 'ROLE_SUPER_ADMIN')
  61. ->setParameter('roleAdmin', 'ROLE_ADMIN')
  62. ->setParameter('roleAgent', 'ROLE_AGENT')
  63. ;
  64. break;
  65. case 'customer':
  66. case 'front_support':
  67. $queryBuilder
  68. ->andWhere('supportRole.code = :roleCustomer')
  69. ->setParameter('roleCustomer', 'ROLE_CUSTOMER')
  70. ;
  71. break;
  72. default:
  73. throw new UsernameNotFoundException('Firewall not supported.');
  74. break;
  75. }
  76. $response = $queryBuilder->getQuery()->getResult();
  77. try {
  78. if (
  79. ! empty($response)
  80. && is_array($response)
  81. ) {
  82. list($user, $userInstance) = $response;
  83. // Set currently active instance
  84. $user->setCurrentInstance($userInstance);
  85. $user->setRoles((array) $userInstance->getSupportRole()->getCode());
  86. // Set user instance as online
  87. $userInstance->setIsOnline(true);
  88. $userInstance->setLastLogin(new \DateTime());
  89. $this->entityManager->persist($userInstance);
  90. $this->entityManager->flush();
  91. return $user;
  92. }
  93. } catch (\Exception $e) {
  94. // Do nothing...
  95. }
  96. throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
  97. }
  98. }
  99. public function refreshUser(UserInterface $user)
  100. {
  101. if ($this->supportsClass(get_class($user))) {
  102. return $this->loadUserByUsername($user->getEmail());
  103. }
  104. throw new UnsupportedUserException('Invalid user type');
  105. }
  106. public function supportsClass($class)
  107. {
  108. return User::class === $class;
  109. }
  110. }