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