1<?php 2/* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4/** 5 * @author Michael Jansen <mjansen@databay.de> 6 * @version $Id$ 7 * @ingroup ServicesAuthentication 8 */ 9class ilSessionReminderCheck 10{ 11 /** 12 * @param string $sessionIdHash 13 * @return string 14 */ 15 public function getJsonResponse($sessionIdHash) 16 { 17 /** 18 * @var $ilDB ilDB 19 * @var $ilClientIniFile ilIniFile 20 * @var $lng ilLanguage 21 */ 22 global $DIC; 23 24 $ilDB = $DIC['ilDB']; 25 $lng = $DIC['lng']; 26 $ilClientIniFile = $DIC['ilClientIniFile']; 27 28 $GLOBALS['DIC']->logger()->auth()->debug('Session reminder call for session id hash: ' . $sessionIdHash); 29 30 // disable session writing and extension of expiration time 31 ilSession::enableWebAccessWithoutSession(true); 32 33 $response = array('remind' => false); 34 35 $res = $ilDB->queryF( 36 ' 37 SELECT expires, user_id, data 38 FROM usr_session 39 WHERE MD5(session_id) = %s 40 ', 41 ['text'], 42 [$sessionIdHash] 43 ); 44 45 $num = $ilDB->numRows($res); 46 47 if ($num > 1) { 48 $response['message'] = 'The determined session data is not unique.'; 49 return ilJsonUtil::encode($response); 50 } 51 52 if ($num == 0) { 53 $response['message'] = 'ILIAS could not determine the session data.'; 54 return ilJsonUtil::encode($response); 55 } 56 57 $data = $ilDB->fetchAssoc($res); 58 if (!$this->isAuthenticatedUsrSession($data)) { 59 $response['message'] = 'ILIAS could not fetch the session data or the corresponding user is no more authenticated.'; 60 return ilJsonUtil::encode($response); 61 } 62 63 /** 64 * @todo: php7: refactored session data; new implementation for idle time calcluation DONE 65 * 66 */ 67 $expiretime = $data['expires']; 68 if ($this->isSessionAlreadyExpired($expiretime)) { 69 $response['message'] = 'The session is already expired. The client should have received a remind command before.'; 70 return ilJsonUtil::encode($response); 71 } 72 73 if (null === $expiretime) { 74 $response['message'] = 'ILIAS could not determine the expire time from the session data.'; 75 return ilJsonUtil::encode($response); 76 } 77 78 if ($this->isSessionAlreadyExpired($expiretime)) { 79 $response['message'] = 'The session is already expired. The client should have received a remind command before.'; 80 return ilJsonUtil::encode($response); 81 } 82 83 /** 84 * @var $user ilObjUser 85 */ 86 $ilUser = ilObjectFactory::getInstanceByObjId($data['user_id']); 87 88 include_once './Services/Authentication/classes/class.ilSessionReminder.php'; 89 $remind_time = $expiretime - max(ilSessionReminder::MIN_LEAD_TIME, (float) $ilUser->getPref('session_reminder_lead_time')) * 60; 90 if ($remind_time > time()) { 91 // session will expire in <lead_time> minutes 92 $response['message'] = 'Lead time not reached, yet. Current time: ' . date('Y-m-d H:i:s', time()) . ', Reminder time: ' . date('Y-m-d H:i:s', $remind_time); 93 return ilJsonUtil::encode($response); 94 } 95 96 $dateTime = new ilDateTime($expiretime, IL_CAL_UNIX); 97 switch ($ilUser->getTimeFormat()) { 98 case ilCalendarSettings::TIME_FORMAT_12: 99 $formatted_expiration_time = $dateTime->get(IL_CAL_FKT_DATE, 'g:ia', $ilUser->getTimeZone()); 100 break; 101 102 case ilCalendarSettings::TIME_FORMAT_24: 103 default: 104 $formatted_expiration_time = $dateTime->get(IL_CAL_FKT_DATE, 'H:i', $ilUser->getTimeZone()); 105 break; 106 } 107 108 $response = array( 109 'extend_url' => './ilias.php?baseClass=ilPersonalDesktopGUI', 110 'txt' => str_replace("\\n", '%0A', sprintf($lng->txt('session_reminder_alert'), ilDatePresentation::secondsToString($expiretime - time()), $formatted_expiration_time, $ilClientIniFile->readVariable('client', 'name') . ' | ' . ilUtil::_getHttpPath())), 111 'remind' => true 112 ); 113 114 return ilJsonUtil::encode($response); 115 } 116 117 /** 118 * @param int $expiretime 119 * @return bool 120 */ 121 protected function isSessionAlreadyExpired($expiretime) 122 { 123 return $expiretime < time(); 124 } 125 126 /** 127 * @param array|null $data 128 * @return bool 129 */ 130 protected function isAuthenticatedUsrSession($data) 131 { 132 return is_array($data) && isset($data['user_id']) && $data['user_id'] > 0 && $data['user_id'] != ANONYMOUS_USER_ID; 133 } 134} 135