Index: moodle/mod/lamslesson/lib.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/lib.php,v diff -u -r1.18 -r1.19 --- moodle/mod/lamslesson/lib.php 6 Aug 2014 05:45:04 -0000 1.18 +++ moodle/mod/lamslesson/lib.php 5 Dec 2014 22:28:01 -0000 1.19 @@ -67,6 +67,7 @@ define('LAMSLESSON_LD_SERVICE', '/services/xml/LearningDesignRepository'); define('LAMSLESSON_LD_SERVICE_SVG', '/services/LearningDesignSVG'); define('LAMSLESSON_LESSON_MANAGER', '/services/xml/LessonManager'); +define('LAMSLESSON_LAMS_SERVERTIME', 'services/getServerTime'); define('LAMSLESSON_POPUP_OPTIONS', 'location=0,toolbar=0,menubar=0,statusbar=0,width=996,height=700,resizable'); define('LAMSLESSON_OUTPUT_METHOD', 'toolOutputsUser'); @@ -281,7 +282,7 @@ $coursename = $coursename.' '.date('n/Y', $coursecreatedate); // generate hash - $datetime = date('F d,Y g:i a'); + $datetime = lamslesson_get_datetime(); $datetime_encoded = urlencode($datetime); $rawstring = trim($datetime).trim($username).trim($CFG->lamslesson_serverid).trim($CFG->lamslesson_serverkey); $hashvalue = sha1(strtolower($rawstring)); @@ -313,7 +314,8 @@ $coursename = $coursename.' '.date('n/Y', $coursecreatedate); // generate hash - $datetime = date('F d,Y g:i a'); + //$datetime = date('F d,Y g:i a'); + $datetime = lamslesson_get_datetime(); $rawstring = trim($datetime).trim($username).trim($CFG->lamslesson_serverid).trim($CFG->lamslesson_serverkey); $hashvalue = sha1(strtolower($rawstring)); @@ -325,8 +327,8 @@ 'datetime' => $datetime, 'hashValue' => $hashvalue, 'username' => $username, - 'firstName' => $firstName, - 'lastName' => $lastName, + 'firstName' => $firstname, + 'lastName' => $lastname, 'email' => $email, 'courseId' => $courseId, 'courseName' => $coursename, @@ -542,7 +544,8 @@ return NULL; } - $datetime = date("F d,Y g:i a"); + //$datetime = date("F d,Y g:i a"); + $datetime = lamslesson_get_datetime(); if(!isset($username)){ $username = $USER->username; } @@ -584,7 +587,8 @@ } - $datetime = date('F d,Y g:i a'); + //$datetime = date('F d,Y g:i a'); + $datetime = lamslesson_get_datetime(); if(!isset($username)){ $username = $USER->username; } @@ -621,7 +625,8 @@ function lamslesson_get_lams_outputs($username,$lamslesson,$foruser) { global $CFG, $DB; - $datetime = date('F d,Y g:i a'); + //$datetime = date('F d,Y g:i a'); + $datetime = lamslesson_get_datetime(); $plaintext = trim($datetime) .trim($username) .trim($CFG->lamslesson_serverid) @@ -703,7 +708,9 @@ // append month/year to course name $coursename = $coursename.' '.date('n/Y', $coursecreatedate); - $datetime = date('F d,Y g:i a'); + // change datetime to enforce time to live for login request + // See LDEV-3382 + $datetime = lamslesson_get_datetime(); // check if we are to use lessonstrictauth if ($method == LAMSLESSON_PARAM_LEARNER_STRICT_METHOD) { @@ -787,7 +794,8 @@ return NULL; } - $datetime = date("F d,Y g:i a"); + //$datetime = date("F d,Y g:i a"); + $datetime = lamslesson_get_datetime(); $plaintext = $datetime.$username.$CFG->lamslesson_serverid.$CFG->lamslesson_serverkey; $hashvalue = sha1(strtolower($plaintext)); @@ -964,7 +972,7 @@ */ function lamslesson_verify($url, $id, $key){ - $datetime = date("F d,Y g:i a"); + $datetime = lamslesson_get_datetime(); $plaintext = $datetime.$id.$key; // create hash $hashvalue = sha1(strtolower($plaintext)); @@ -1010,3 +1018,45 @@ } } +/** + * Returns a Number of milliseconds since January 1, 1970, 00:00:00 GMT + * (known as "the epoch") till the time when the call is made + * + * @return timestamp in milliseconds +*/ +function lamslesson_get_datetime() { + global $CFG; + + // change datetime to enforce time to live for login request + // See LDEV-3382 + + $offset = $CFG->lamslesson_servertimeoffset * 60 * 1000; + + $datetime = round(microtime(true) * 1000) + $offset; + + return $datetime; +} + +/** + * Gets LAMS server time + * + * @return timestamp in milliseconds (from LAMS server) +*/ +function lamslesson_get_lamsserver_time() { + // change datetime to enforce time to live for login request + // See LDEV-3382 + global $CFG; + $url = "$CFG->lamslesson_serverurl" . LAMSLESSON_LAMS_SERVERTIME; + $load = array('method' => LAMSLESSON_PARAM_VERIFY_METHOD); + + $result = lamslesson_http_call_post($url, $load); + + $localtime = round(microtime(true) * 1000); + + $offset = $result - $localtime; + + return "LAMS time: " . date('m-d-Y H:i:s.u', $result/1000) . " \rMoodle time:" . date('m-d-Y H:i:s.u', $localtime/1000) . " \rOffset: " . $offset/1000/60 . " minutes"; +} + + + Index: moodle/mod/lamslesson/mod_form.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/mod_form.php,v diff -u -r1.16 -r1.17 --- moodle/mod/lamslesson/mod_form.php 14 Aug 2013 18:01:04 -0000 1.16 +++ moodle/mod/lamslesson/mod_form.php 5 Dec 2014 22:28:01 -0000 1.17 @@ -103,8 +103,9 @@ js_writer::set_variable('currentsequence', $currentsequence)); $authorpreviewbutton .= html_writer::script('', $CFG->wwwroot.'/mod/lamslesson/preview.js'); + + $authorpreviewbutton .= html_writer::tag('p', 'hello!' . $USER->firstname); - $authorpreviewbutton .= html_writer::start_tag('div', array('id' => 'buttons', 'style' => 'float:right;')); // Preview button $authorpreviewbutton .= html_writer::start_tag('span', array('id' => 'previewbutton', 'style' => 'visibility:hidden;', 'class' => 'yui3-button yui3-link-button')); Index: moodle/mod/lamslesson/offset.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/offset.php,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ moodle/mod/lamslesson/offset.php 5 Dec 2014 22:28:01 -0000 1.1 @@ -0,0 +1,6 @@ +dirroot.'/mod/lamslesson/lib.php'); + +echo lamslesson_get_lamsserver_time(); +?> Index: moodle/mod/lamslesson/settings.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/settings.php,v diff -u -r1.3 -r1.4 --- moodle/mod/lamslesson/settings.php 21 Jan 2013 07:23:58 -0000 1.3 +++ moodle/mod/lamslesson/settings.php 5 Dec 2014 22:28:01 -0000 1.4 @@ -45,7 +45,29 @@ $settings->add(new admin_setting_configtext('lamslesson_requestsource', get_string('requestsource', 'lamslesson'), get_string('requestsourceinfo', 'lamslesson'), 'My Moodle')); + // Servers time offset + $settings->add(new admin_setting_configtext('lamslesson_servertimeoffset', get_string('servertimeoffset', 'lamslesson'), + get_string('servertimeoffsetinfo', 'lamslesson'), '0')); + + + // Sync LAMS server time + $html = html_writer::tag('p', get_string('offsetinfo', 'lamslesson')); + $html .= html_writer::start_tag('div', array('style' => 'text-align:center;padding-top: 15px; padding-bottom:5px;')); + $html .= html_writer::start_tag('span', array('id' => 'offsetbutton', 'class' => 'yui3-button yui3-link-button')); + + $html .= html_writer::tag('a', get_string('offsetbutton', 'lamslesson'), + array('id' => 'offsetbtn', + 'name' => 'offsetbtn', + 'href' => 'javascript:calculateOffset();')); + $html .= html_writer::end_tag('span'); + $html .= html_writer::end_tag('div'); + + $settings->add(new admin_setting_heading('lamslesson_offset', get_string('offsetheader', 'lamslesson'), + $html)); + + + // Validation button $html = html_writer::script('', $CFG->wwwroot.'/mod/lamslesson/validate.js'); @@ -58,12 +80,20 @@ 'href' => 'javascript:validate();')); $html .= html_writer::end_tag('span'); $html .= html_writer::end_tag('div'); + + + $html .= html_writer::tag('div', get_string('validationhelp', 'lamslesson') . ' ' .html_writer::link('http://wiki.lamsfoundation.org/display/lamsdocs/Moodle2', get_string('lamsmoodlehelp', 'lamslesson'), array('target' => '_blank')), array('style' => 'text-align: right; font-size: 10px;', 'target' => '_blank')); $settings->add(new admin_setting_heading('lamslesson_validation', get_string('validationheader', 'lamslesson'), $html)); + $html .= html_writer::end_tag('div'); + + + + } Index: moodle/mod/lamslesson/styles.css =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/styles.css,v diff -u -r1.8 -r1.9 --- moodle/mod/lamslesson/styles.css 9 Jan 2012 16:14:10 -0000 1.8 +++ moodle/mod/lamslesson/styles.css 5 Dec 2014 22:28:01 -0000 1.9 @@ -12,6 +12,7 @@ #monitorbutton a {text-decoration:none;padding-left: 2.25em;background: url([[pix:a/search]]) 5% 50% no-repeat;} #previewbutton a {text-decoration:none;padding-left: 2.25em;background: url([[pix:a/search]]) 5% 50% no-repeat;} #validatebutton a {text-decoration:none;padding-left: 2.25em;background: url([[pix:i/admin]]) 5% 50% no-repeat;} +#offsetbutton a {text-decoration:none;padding-left: 2.25em;background: url([[pix:i/log]]) 5% 50% no-repeat;} /* Copyright (c) 2006 Yahoo! Inc. All rights reserved. This file is from: Index: moodle/mod/lamslesson/validate.js =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/validate.js,v diff -u -r1.1 -r1.2 --- moodle/mod/lamslesson/validate.js 9 Jan 2012 16:14:10 -0000 1.1 +++ moodle/mod/lamslesson/validate.js 5 Dec 2014 22:28:01 -0000 1.2 @@ -60,6 +60,37 @@ return pairs.join("&"); } + function calculateOffset(){ + timer = setTimeout('timeCount()', 5000); + var url = '../mod/lamslesson/offset.php'; + var contentType = "application/x-www-form-urlencoded; charset=UTF-8"; + var query = createQuery(); + if (window.XMLHttpRequest) { // Non-IE browsers + req = new XMLHttpRequest(); + req.onreadystatechange = getResult; + try { + req.open("POST", url, true); + req.setRequestHeader("Content-Type", contentType); + req.send(query); + } catch (e) { + clearTimeout(timer); + alert(e); + } + } else if (window.ActiveXObject) { // IE + req = new ActiveXObject("Microsoft.XMLHTTP"); + if (req) { + req.onreadystatechange = getResult; + req.open("POST", url, true); + req.setRequestHeader("Content-Type", contentType); + req.send(query); + }else{ + clearTimeout(timer); + } + } + + + } + function verify(){ timer = setTimeout('timeCount()', 5000); var url = '../mod/lamslesson/verify.php'; Index: moodle/mod/lamslesson/version.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/version.php,v diff -u -r1.7 -r1.8 --- moodle/mod/lamslesson/version.php 20 Aug 2013 18:28:41 -0000 1.7 +++ moodle/mod/lamslesson/version.php 5 Dec 2014 22:28:01 -0000 1.8 @@ -29,6 +29,6 @@ defined('MOODLE_INTERNAL') || die(); -$module->version = 2013082310; // If version == 0 then module will not be installed +$module->version = 2014120310; // If version == 0 then module will not be installed $module->requires = 2012120300; // Requires this Moodle version $module->cron = 0; // Period for cron to check this module (secs) Index: moodle/mod/lamslesson/lang/en/lamslesson.php =================================================================== RCS file: /usr/local/cvsroot/moodle/mod/lamslesson/lang/en/lamslesson.php,v diff -u -r1.10 -r1.11 --- moodle/mod/lamslesson/lang/en/lamslesson.php 21 Jan 2013 15:54:39 -0000 1.10 +++ moodle/mod/lamslesson/lang/en/lamslesson.php 5 Dec 2014 22:28:01 -0000 1.11 @@ -79,6 +79,18 @@ $string['validationheader'] = 'Settings validation'; $string['validationinfo'] = 'Before you save your settings, please press the button to validate them with the LAMS server. If the validation is correct, save these settings. If not, please check that the settings you have entered match with the values in the LAMS server'; $string['validationhelp'] = 'Need help? check out the'; + +$string['offsetbutton'] = "Calculate offset"; +$string['offsetinfo'] = "If you are enforcing the login request time to live limit, it's important that you set up the time difference (in minutes) between the LAMS and your Moodle server. Click on the Calculate offset to see if there's a time difference between your LAMS and Moodle server. Take the offset time displayed and add it to \"Offset time difference\" setting."; + +$string['servertimeoffset'] = "Offset time difference (minutes)"; + +$string['servertimeoffsetinfo'] = "This is the time difference (or time offset) between the LAMS and Moodle server."; + +$string['offsetheader'] = "Time offset"; + + + $string['lamsmoodlehelp'] = 'LAMS-Moodle integration tutorial'; $string['validationsuccessful'] = 'Validation successful! You can now save your settings and start using LAMS within Moodle.';