PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/app/bundles/CoreBundle/EventListener/CoreSubscriber.php

https://gitlab.com/mautic-master/mautic
PHP | 254 lines | 143 code | 39 blank | 72 comment | 24 complexity | dcace3572c2333458582200c98f7588c MD5 | raw file
  1. <?php
  2. /**
  3. * @package Mautic
  4. * @copyright 2014 Mautic Contributors. All rights reserved.
  5. * @author Mautic
  6. * @link http://mautic.org
  7. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
  8. */
  9. namespace Mautic\CoreBundle\EventListener;
  10. use Mautic\CoreBundle\Controller\MauticController;
  11. use Mautic\CoreBundle\CoreEvents;
  12. use Mautic\CoreBundle\Event\MenuEvent;
  13. use Mautic\CoreBundle\Event\RouteEvent;
  14. use Mautic\CoreBundle\Event\IconEvent;
  15. use Mautic\ApiBundle\Event as ApiEvents;
  16. use Mautic\InstallBundle\Controller\InstallController;
  17. use Mautic\UserBundle\Entity\User;
  18. use Mautic\UserBundle\Event\LoginEvent;
  19. use Mautic\UserBundle\UserEvents;
  20. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  21. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  22. use Symfony\Component\HttpKernel\KernelEvents;
  23. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  24. use Symfony\Component\Security\Http\SecurityEvents;
  25. /**
  26. * Class CoreSubscriber
  27. */
  28. class CoreSubscriber extends CommonSubscriber
  29. {
  30. /**
  31. * {@inheritdoc}
  32. */
  33. public static function getSubscribedEvents()
  34. {
  35. return array(
  36. KernelEvents::CONTROLLER => array('onKernelController', 0),
  37. KernelEvents::REQUEST => [
  38. ['onKernelRequest', 0],
  39. ['onKernelRequestAddGlobalJS', 0]
  40. ],
  41. CoreEvents::BUILD_MENU => array('onBuildMenu', 9999),
  42. CoreEvents::BUILD_ROUTE => array('onBuildRoute', 0),
  43. CoreEvents::FETCH_ICONS => array('onFetchIcons', 9999),
  44. SecurityEvents::INTERACTIVE_LOGIN => array('onSecurityInteractiveLogin', 0)
  45. );
  46. }
  47. /**
  48. * Set default timezone/locale
  49. *
  50. * @param GetResponseEvent $event
  51. *
  52. * @return void
  53. */
  54. public function onKernelRequest(GetResponseEvent $event)
  55. {
  56. // Set the user's default locale
  57. $request = $event->getRequest();
  58. if (!$request->hasPreviousSession()) {
  59. return;
  60. }
  61. $currentUser = $this->factory->getUser();
  62. //set the user's timezone
  63. if (is_object($currentUser)) {
  64. $tz = $currentUser->getTimezone();
  65. }
  66. if (empty($tz)) {
  67. $tz = $this->params['default_timezone'];
  68. }
  69. date_default_timezone_set($tz);
  70. if (!$locale = $request->attributes->get('_locale')) {
  71. if (is_object($currentUser)) {
  72. $locale = $currentUser->getLocale();
  73. }
  74. if (empty($locale)) {
  75. $locale = $this->params['locale'];
  76. }
  77. }
  78. $request->setLocale($locale);
  79. // Set a cookie with session name for filemanager
  80. $sessionName = $request->cookies->get('mautic_session_name');
  81. if ($sessionName != session_name()) {
  82. /** @var \Mautic\CoreBundle\Helper\CookieHelper $cookieHelper */
  83. $cookieHelper = $this->factory->getHelper('cookie');
  84. $cookieHelper->setCookie('mautic_session_name', session_name(), null);
  85. }
  86. }
  87. /**
  88. * Add mauticForms in js script tag for Froala
  89. *
  90. * @param GetResponseEvent $event
  91. */
  92. public function onKernelRequestAddGlobalJS(GetResponseEvent $event)
  93. {
  94. if (defined('MAUTIC_INSTALLER')) {
  95. return;
  96. }
  97. $list = $this->factory->getEntityManager()->getRepository('MauticFormBundle:Form')->getSimpleList();
  98. $mauticForms = json_encode($list, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
  99. $this->factory->getHelper('template.assets')->addScriptDeclaration("var mauticForms = {$mauticForms};");
  100. }
  101. /**
  102. * Set vars on login
  103. *
  104. * @param InteractiveLoginEvent $event
  105. *
  106. * @return void
  107. */
  108. public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
  109. {
  110. if (defined('MAUTIC_INSTALLER')) {
  111. return;
  112. }
  113. $session = $event->getRequest()->getSession();
  114. $securityContext = $this->factory->getSecurityContext();
  115. if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY') || $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  116. $user = $event->getAuthenticationToken()->getUser();
  117. //set a session var for filemanager to know someone is logged in
  118. $session->set('mautic.user', $user->getId());
  119. //mark the user as last logged in
  120. $user = $this->factory->getUser();
  121. if ($user instanceof User) {
  122. /** @var \Mautic\UserBundle\Model\UserModel $userModel */
  123. $userModel = $this->factory->getModel('user');
  124. $userModel->setOnlineStatus('online');
  125. $userModel->getRepository()->setLastLogin($user);
  126. }
  127. //dispatch on login events
  128. $dispatcher = $this->factory->getDispatcher();
  129. if ($dispatcher->hasListeners(UserEvents::USER_LOGIN)) {
  130. $event = new LoginEvent($this->factory->getUser());
  131. $dispatcher->dispatch(UserEvents::USER_LOGIN, $event);
  132. }
  133. } else {
  134. $session->remove('mautic.user');
  135. }
  136. //set a couple variables used by filemanager
  137. $session->set('mautic.docroot', $event->getRequest()->server->get('DOCUMENT_ROOT'));
  138. $session->set('mautic.basepath', $event->getRequest()->getBasePath());
  139. $session->set('mautic.imagepath', $this->factory->getParameter('image_path'));
  140. }
  141. /**
  142. * Populates namespace, bundle, controller, and action into request to be used throughout application
  143. *
  144. * @param FilterControllerEvent $event
  145. *
  146. * @return void
  147. */
  148. public function onKernelController(FilterControllerEvent $event)
  149. {
  150. $controller = $event->getController();
  151. if (!is_array($controller)) {
  152. return;
  153. }
  154. //only affect Mautic controllers
  155. if ($controller[0] instanceof MauticController) {
  156. $request = $event->getRequest();
  157. //also set the request for easy access throughout controllers
  158. $controller[0]->setRequest($request);
  159. //set the factory for easy use access throughout the controllers
  160. $controller[0]->setFactory($this->factory);
  161. //run any initialize functions
  162. $controller[0]->initialize($event);
  163. //update the user's activity marker
  164. if (!($controller[0] instanceof InstallController) && !defined('MAUTIC_ACTIVITY_CHECKED') && !defined('MAUTIC_INSTALLER')) {
  165. //prevent multiple updates
  166. $user = $this->factory->getUser();
  167. //slight delay to prevent too many updates
  168. //note that doctrine will return in current timezone so we do not have to worry about that
  169. $delay = new \DateTime();
  170. $delay->setTimestamp(strtotime('2 minutes ago'));
  171. /** @var \Mautic\UserBundle\Model\UserModel $userModel */
  172. $userModel = $this->factory->getModel('user');
  173. if ($user instanceof User && $user->getLastActive() < $delay && $user->getId()) {
  174. $userModel->getRepository()->setLastActive($user);
  175. }
  176. $session = $this->factory->getSession();
  177. $delay = new \DateTime();
  178. $delay->setTimestamp(strtotime('15 minutes ago'));
  179. $lastOnlineStatusCleanup = $session->get('mautic.online.status.cleanup', $delay);
  180. if ($lastOnlineStatusCleanup <= $delay) {
  181. $userModel->getRepository()->updateOnlineStatuses();
  182. $session->set('mautic.online.status.cleanup', new \DateTime());
  183. }
  184. define('MAUTIC_ACTIVITY_CHECKED', 1);
  185. }
  186. }
  187. }
  188. /**
  189. * @param MenuEvent $event
  190. *
  191. * @return void
  192. */
  193. public function onBuildMenu(MenuEvent $event)
  194. {
  195. $this->buildMenu($event);
  196. }
  197. /**
  198. * @param RouteEvent $event
  199. *
  200. * @return void
  201. */
  202. public function onBuildRoute(RouteEvent $event)
  203. {
  204. $this->buildRoute($event);
  205. }
  206. /**
  207. * @param IconEvent $event
  208. *
  209. * @return void
  210. */
  211. public function onFetchIcons(IconEvent $event)
  212. {
  213. $this->buildIcons($event);
  214. }
  215. }