Example #1
0
 /**
  * Check session state
  *
  * @param  Application  $app
  * @param  Request      $request
  * @return JsonResponse
  */
 public function updateSession(Application $app, Request $request)
 {
     if (!$request->isXmlHttpRequest()) {
         $app->abort(400);
     }
     $ret = ['status' => 'unknown', 'message' => '', 'notifications' => false, 'changed' => []];
     if ($app['authentication']->isAuthenticated()) {
         $usr_id = $app['authentication']->getUser()->getId();
         if ($usr_id != $request->request->get('usr')) {
             // I logged with another user
             $ret['status'] = 'disconnected';
             return $app->json($ret);
         }
     } else {
         $ret['status'] = 'disconnected';
         return $app->json($ret);
     }
     try {
         $app['phraseanet.appbox']->get_connection();
     } catch (\Exception $e) {
         return $app->json($ret);
     }
     if (1 > ($moduleId = (int) $request->request->get('module'))) {
         $ret['message'] = 'Missing or Invalid `module` parameter';
         return $app->json($ret);
     }
     $session = $app['EM']->find('Phraseanet:Session', $app['session']->get('session_id'));
     $session->setUpdated(new \DateTime());
     if (!$session->hasModuleId($moduleId)) {
         $module = new SessionModule();
         $module->setModuleId($moduleId);
         $module->setSession($session);
         $app['EM']->persist($module);
     } else {
         $app['EM']->persist($session->getModuleById($moduleId)->setUpdated(new \DateTime()));
     }
     $app['EM']->persist($session);
     $app['EM']->flush();
     $ret['status'] = 'ok';
     $ret['notifications'] = $app['twig']->render('prod/notifications.html.twig', ['notifications' => $app['events-manager']->get_notifications()]);
     $baskets = $app['EM']->getRepository('Phraseanet:Basket')->findUnreadActiveByUser($app['authentication']->getUser());
     foreach ($baskets as $basket) {
         $ret['changed'][] = $basket->getId();
     }
     if (in_array($app['session']->get('phraseanet.message'), ['1', null])) {
         if ($app['conf']->get(['main', 'maintenance'])) {
             $ret['message'] .= $app->trans('The application is going down for maintenance, please logout.');
         }
         if ($app['conf']->get(['registry', 'maintenance', 'enabled'])) {
             $ret['message'] .= strip_tags($app['conf']->get(['registry', 'maintenance', 'message']));
         }
     }
     return $app->json($ret);
 }
 /**
  * {@inheritDoc}
  */
 public function setSession(\Alchemy\Phrasea\Model\Entities\Session $session = NULL)
 {
     $this->__initializer__ && $this->__initializer__->__invoke($this, 'setSession', array($session));
     return parent::setSession($session);
 }
Example #3
0
 public static function updateClientInfos(Application $app, $appId)
 {
     if (!$app['authentication']->isAuthenticated()) {
         return;
     }
     $session = $app['EM']->find('Phraseanet:Session', $app['session']->get('session_id'));
     if (!$session) {
         throw new SessionNotFound('No session found');
     }
     if (!$session->hasModuleId($appId)) {
         $module = new SessionModule();
         $module->setModuleId($appId);
         $module->setSession($session);
         $session->addModule($module);
         $app['EM']->persist($module);
         $app['EM']->persist($session);
         $app['EM']->flush();
     }
     $appName = ['1' => 'Prod', '2' => 'Client', '3' => 'Admin', '4' => 'Report', '5' => 'Thesaurus', '6' => 'Compare', '7' => 'Validate', '8' => 'Upload', '9' => 'API'];
     if (isset($appName[$appId])) {
         $sbas_ids = array_keys($app['acl']->get($app['authentication']->getUser())->get_granted_sbas());
         foreach ($sbas_ids as $sbas_id) {
             try {
                 $logger = $app['phraseanet.logger']($app['phraseanet.appbox']->get_databox($sbas_id));
                 $databox = $app['phraseanet.appbox']->get_databox($sbas_id);
                 $connbas = $databox->get_connection();
                 $sql = 'SELECT appli FROM log WHERE id = :log_id';
                 $stmt = $connbas->prepare($sql);
                 $stmt->execute([':log_id' => $logger->get_id()]);
                 $row3 = $stmt->fetch(PDO::FETCH_ASSOC);
                 $stmt->closeCursor();
                 if (!$row3) {
                     throw new Exception('no log');
                 }
                 $applis = unserialize($row3['appli']);
                 if (!in_array($appId, $applis)) {
                     $applis[] = $appId;
                 }
                 $sql = 'UPDATE log SET appli = :applis WHERE id = :log_id';
                 $params = [':applis' => serialize($applis), ':log_id' => $logger->get_id()];
                 $stmt = $connbas->prepare($sql);
                 $stmt->execute($params);
                 $stmt->closeCursor();
             } catch (\Exception $e) {
             }
         }
     }
     return;
 }
 public function checkSessionActivity(GetResponseEvent $event)
 {
     $modulesIds = ["prod" => 1, "client" => 2, "admin" => 3, "thesaurus" => 5, "report" => 10, "lightbox" => 6];
     $pathInfo = array_filter(explode('/', $event->getRequest()->getPathInfo()));
     if (count($pathInfo) < 1) {
         return;
     }
     $moduleName = strtolower($pathInfo[1]);
     if (!array_key_exists($moduleName, $modulesIds)) {
         return;
     }
     // this route is polled by js in admin/databox to refresh infos (progress bar...)
     if (preg_match("#^/admin/databox/[0-9]+/informations/documents/#", $event->getRequest()->getPathInfo()) == 1) {
         return;
     }
     // this route is polled by js in admin/tasks to refresh tasks status
     if ($event->getRequest()->getPathInfo() == "/admin/task-manager/tasks/" && $event->getRequest()->getContentType() == 'json') {
         return;
     }
     if ($this->isFlashUploadRequest($event->getRequest())) {
         return;
     }
     if ($event->getRequest()->query->has('LOG')) {
         return;
     }
     // if we are already disconnected (ex. from another window), quit immediatly
     if (!$this->app['authentication']->isAuthenticated()) {
         if ($event->getRequest()->isXmlHttpRequest()) {
             $response = new Response("End-Session", 403);
         } else {
             $response = new RedirectResponse($this->app["url_generator"]->generate("homepage", ["redirect" => '..' . $event->getRequest()->getPathInfo()]));
         }
         $response->headers->set('X-Phraseanet-End-Session', '1');
         $event->setResponse($response);
         return;
     }
     $session = $this->app['repo.sessions']->find($this->app['session']->get('session_id'));
     $idle = 0;
     if (isset($this->app["phraseanet.configuration"]["session"]["idle"])) {
         $idle = (int) $this->app["phraseanet.configuration"]["session"]["idle"];
     }
     $now = new \DateTime();
     $dt = $now->getTimestamp() - $session->getUpdated()->getTimestamp();
     if ($idle > 0 && $dt > $idle) {
         // we must disconnet due to idletime
         $this->app['authentication']->closeAccount();
         if ($event->getRequest()->isXmlHttpRequest()) {
             $response = new Response("End-Session", 403);
         } else {
             $response = new RedirectResponse($this->app["url_generator"]->generate("homepage", ["redirect" => '..' . $event->getRequest()->getPathInfo()]));
         }
         $response->headers->set('X-Phraseanet-End-Session', '1');
         $event->setResponse($response);
         return;
     }
     $moduleId = $modulesIds[$moduleName];
     $session->setUpdated(new \DateTime());
     if (!$session->hasModuleId($moduleId)) {
         $module = new SessionModule();
         $module->setModuleId($moduleId);
         $module->setSession($session);
         $session->addModule($module);
         $this->app['EM']->persist($module);
     } else {
         $this->app['EM']->persist($session->getModuleById($moduleId)->setUpdated(new \DateTime()));
     }
     $this->app['EM']->persist($session);
     $this->app['EM']->flush();
 }