src/Event/RouteListener.php line 200

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  4. use Symfony\Component\HttpFoundation\Session;
  5. //use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\HttpKernel;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use \DateTime as DateTime;
  11. //use App\Utils\UserHelper;
  12. use App\Utils\ContentHelper;
  13. use App\Entity\Content;
  14. use App\Entity\Traffic;
  15. use App\Entity\TrafficData;
  16. use App\Entity\ContentView;
  17. use App\Entity\SiteConfig;
  18. use App\Entity\User;
  19. class RouteListener
  20. {
  21.     //protected $userHelper;
  22.     protected $entityManager;
  23.     protected $contentHelper;
  24.     protected $tokenStorage;
  25.     
  26.     public function __construct (
  27.         //UserHelper $userHelper,
  28.         ContentHelper $contentHelper,
  29.         EntityManagerInterface $entityManager,
  30.         TokenStorageInterface $tokenStorage
  31.     ){                
  32.         //$this->userHelper = $userHelper;
  33.         $this->contentHelper $contentHelper;
  34.         $this->entityManager $entityManager;
  35.         $this->tokenStorage $tokenStorage;        
  36.     }
  37.     
  38.     public function onKernelRequest (
  39.         RequestEvent $event
  40.     ) {
  41.         //Temporary CCS redirect:
  42.         /*
  43.         //Fix issues with dev bar not showing up (bc vars declared twice?)
  44.         $request = $event->getRequest();
  45.         $site_host = $request->getHost();
  46.         $site = SiteConfig::getSiteIdFromURL($site_host);
  47.         $routeName = $request->get("_route");
  48.         if ($this->tokenStorage->getToken()) {
  49.             $user = $this->tokenStorage->getToken()->getUser();
  50.         } else {
  51.             $user = null;
  52.         }
  53.         if (is_string($user)) {
  54.             $user = null;
  55.         }
  56.         if($site == Content::SITE_CCS && $routeName != "sign-in_ccs" && $routeName != "coming-soon_ccs" && (!$user || (!$user->isAdmin()))) {
  57.             $event->setResponse(new RedirectResponse("/coming-soon"));
  58.         }
  59.         elseif($site == Content::SITE_CCS && $routeName == "coming-soon_ccs" && $user && ($user->isAdmin())) {
  60.             $event->setResponse(new RedirectResponse("/"));
  61.         }
  62.         */
  63.         
  64.         /*
  65.         var_dump("event handler");
  66.         exit;
  67.         */
  68.         
  69.         //Ran from a cron job now. See Command/UpdatePublishedExpiredContentCommand.php
  70.         /*
  71.         $this->contentHelper->updatePublished();
  72.         $this->contentHelper->updateExpired();
  73.         $this->contentHelper->updateExpiredAnnouncements();
  74.         */
  75.         
  76.         //Ran from a cron job now. See Command/UpdatePurchaseItemsCommand.php
  77.         //$this->orderHelper->updateExpiredPurchaseItems();
  78.         
  79.         $request $event->getRequest();
  80.         $session $request->getSession();
  81.         
  82.         if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST || 
  83.             strpos($event->getRequest()->getPathInfo(), "_wdt") !== false
  84.         ) {
  85.             return;
  86.         }
  87.         
  88.         $routeName $request->get("_route");
  89.         $routeParams $request->get("_route_params");
  90.         $path $request->getPathInfo();
  91.         
  92.         if ($this->tokenStorage->getToken()) {
  93.             $user $this->tokenStorage->getToken()->getUser();
  94.         } else {
  95.             $user null;
  96.         }
  97.         
  98.         if (is_string($user)) {
  99.             $user null;
  100.         }
  101.         
  102.         // ==================================================
  103.         // Log the traffic request
  104.         // Should modify and use ContentHelper's addImpression function instead of doing here
  105.         // $temp = $request;
  106.         $temp $_REQUEST;
  107.                 
  108.         // remove any private payment data ...
  109.         if (isset($temp["payment"])) {
  110.             unset($temp["payment"]);
  111.         }
  112.         
  113.         $last_route $session->get("last_route", [
  114.             "name" => "",
  115.             "params" => "",
  116.             "path" => "",
  117.         ]);
  118.         $user_token $session->get("user_token"bin2hex(openssl_random_pseudo_bytes(32)));
  119.         
  120.         //Get the site
  121.         $site_host $request->getHost();
  122.         $site SiteConfig::getSiteIdFromURL($site_host);
  123.         
  124.         //Don't log any traffic from the admin pages
  125.         if(substr($path0strlen("/admin/")) !== "/admin/") {
  126.             $user_ip $request->getClientIp();
  127.             $user_ua $request->headers->get("User-Agent");
  128.             $user_refer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "";
  129.             $user_this_path $path;
  130.             $user_this_route = isset($routeName) ? $routeName "";
  131.             $user_this_route_params = isset($routeParams) ? json_encode($routeParams) : "";
  132.             $user_last_path = isset($last_route["path"]) ? $last_route["path"] : "";
  133.             $user_last_route = isset($last_route["name"]) ? $last_route["name"] : "";
  134.             $user_last_route_params = isset($last_route["params"]) ? json_encode($last_route["params"]) : "";
  135.             $user_request_data json_encode($temp);
  136.             $requested_at = new DateTime("now");
  137.             
  138.             $hash md5(implode("", [
  139.                 $user_token,
  140.                 $user_ip,
  141.                 $user_ua,
  142.                 ($user) ? $user->getId() : "",
  143.                 $user_refer,
  144.                 $user_this_path,
  145.                 $user_this_route,
  146.                 $user_this_route_params,
  147.                 $user_last_path,
  148.                 $user_last_route,
  149.                 $user_last_route_params,
  150.                 $user_request_data,
  151.                 date("Y-m-d H:i:s"),
  152.                 rand(1,1000),
  153.             ]));
  154.             
  155.             $traffic_data = new TrafficData();
  156.             $traffic_data->setHash($hash);
  157.             $traffic_data->setUserToken($user_token);
  158.             $traffic_data->setUser($user);
  159.             $traffic_data->setUserIp($user_ip);
  160.             $traffic_data->setUserUa($user_ua);
  161.             $traffic_data->setUserRefer($user_refer);
  162.             $traffic_data->setUserThisPath($user_this_path);
  163.             $traffic_data->setUserThisRoute($user_this_route);
  164.             $traffic_data->setUserThisRouteParams($user_this_route_params);
  165.             $traffic_data->setUserLastPath($user_last_path);
  166.             $traffic_data->setUserLastRoute($user_last_route);
  167.             $traffic_data->setUserLastRouteParams($user_last_route_params);
  168.             $traffic_data->setUserRequestData($user_request_data);
  169.             $traffic_data->setRequestedAt($requested_at);
  170.             
  171.             if (!$this->entityManager->isOpen()) {
  172.                 $this->entityManager $this->entityManager->create(
  173.                     $this->entityManager->getConnection(),
  174.                     $this->entityManager->getConfiguration()
  175.                 );
  176.             }
  177.             
  178.             $content "";
  179.             if($path && $path != "/") {
  180.                 $content $this->entityManager
  181.                     ->getRepository(Content::class)
  182.                     ->getContentByUrl(
  183.                         $path$site
  184.                     );
  185.             }
  186.             else {
  187.                 //Home page. Just store view to content_id 1. (RCS previously was using 48924)
  188.                 $content $this->entityManager
  189.                     ->getRepository(Content::class)
  190.                     ->findOneBy(["id" => 1]);
  191.             }
  192.             
  193.             if($content) {
  194.                 $content_view = new ContentView();
  195.                 $content_view->setTrafficData($traffic_data);
  196.                 $content_view->setContent($content);
  197.                 $content_view->setRequestedAt($requested_at);
  198.                 $content_view->setSiteId($site);
  199.             }
  200.             
  201.             try{
  202.                 //not tracking paging that aren't content w/ new system, do we need to?
  203.                 //$this->entityManager->persist($traffic);
  204.                 //$this->entityManager->flush();
  205.                 
  206.                 if($content) {
  207.                     //$content->incrementTotalClicks();
  208.                     $this->entityManager->persist($content);
  209.                     $this->entityManager->persist($content_view);
  210.                     $this->entityManager->persist($traffic_data);
  211.                     $this->entityManager->flush();
  212.                 }
  213.             } catch(\Exception $e) {
  214.                 try{
  215.                     //Exception may occur if inserting a duplicate primary key. Should log this somewhere.
  216.                     $errorlog fopen(__DIR__ "/../../var/log/traffic_error.txt""a") or die("Unable to open file!");
  217.                     $txt 'Caught exception (RouteListener.php): '.  $e->getMessage() . "\n";
  218.                     fwrite($errorlog$txt);
  219.                     fclose($errorlog);
  220.                 } catch(\Exception $e) {
  221.                     // Error writing to file
  222.                 }
  223.             }
  224.         }
  225.         // store the token in the session
  226.         $session->set("user_token"$user_token);
  227.         
  228.         // End log traffic request
  229.         // ==================================================
  230.         
  231.         // store the site being used
  232.         //$session->set("site_host", $request->getHost());
  233.         $session->set("site"$site);
  234.         
  235.         
  236.         // we should also prevent duplicate pages from get stored back to back ...
  237.         
  238.         // perform any database cleanup - this should probably not remove accounts - just set them to null...
  239.         //(Now done in Command/UpdatePublishedExpiredContentCommand.php)
  240.         //$this->userHelper->clean();
  241.         
  242.         if ($routeName[0] == "_") {
  243.             return;
  244.         }
  245.         
  246.         $routeData = array (
  247.             "name" => $routeName,
  248.             "params" => $routeParams,
  249.             "path" => $path,
  250.         );
  251.         
  252.         //Temporary redirect for CCS:
  253.         /*if($site == Content::SITE_CCS && $routeName != "sign-in_ccs" && $routeName != "coming-soon_ccs" && (!$user || (!$user->isAdmin()))) {
  254.             $event->setResponse(new RedirectResponse("/coming-soon"));
  255.         }
  256.         elseif($site == Content::SITE_CCS && $routeName == "coming-soon_ccs" && $user && ($user->isAdmin())) {
  257.             $event->setResponse(new RedirectResponse("/"));
  258.         }*/
  259.             
  260.         $thisRoute $session->get("this_route", array ());
  261.         if ($thisRoute == $routeData) {
  262.             return;
  263.         }
  264.         
  265.         $session->set("last_route"$thisRoute);
  266.         $session->set("this_route"$routeData);
  267.         if($path != "/sign-in" &&
  268.             $path != "/rcs-sign-up" &&
  269.             $path != "/forgot-password" &&
  270.             $path != "/forgot-username" &&
  271.             $path != "/send-activation" &&
  272.             //$path != "/sign-in_aar" &&
  273.             !(strpos($path"/rcs-reset-password") !== false) &&
  274.             !(strpos($path"/activate-account") !== false) &&
  275.             !(strpos($path"/rcs.php") !== false) &&
  276.             !(strpos($path"/mfasignin") !== false) &&
  277.             !(strpos($path"/mfa/") !== false) &&
  278.             !(strpos($path"/ajax") !== false)
  279.         ) {
  280.             $session->set("non_sign_in_route"$routeData);
  281.         }
  282.     }
  283.     
  284. }