Index: moodle/mod/lamslesson/lang/en/lamslesson.php =================================================================== diff -u -r7bbc843576a59e79b0a2634961e859dccecce31c -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/lang/en/lamslesson.php (.../lamslesson.php) (revision 7bbc843576a59e79b0a2634961e859dccecce31c) +++ moodle/mod/lamslesson/lang/en/lamslesson.php (.../lamslesson.php) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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.'; Index: moodle/mod/lamslesson/lib.php =================================================================== diff -u -rf3309eeca609db4b529d113705ab287f18358311 -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/lib.php (.../lib.php) (revision f3309eeca609db4b529d113705ab287f18358311) +++ moodle/mod/lamslesson/lib.php (.../lib.php) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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 =================================================================== diff -u -rf18fbc545a0ae4d46669f82d3cfe74868c5da668 -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/mod_form.php (.../mod_form.php) (revision f18fbc545a0ae4d46669f82d3cfe74868c5da668) +++ moodle/mod/lamslesson/mod_form.php (.../mod_form.php) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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 =================================================================== diff -u --- moodle/mod/lamslesson/offset.php (revision 0) +++ moodle/mod/lamslesson/offset.php (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -0,0 +1,6 @@ +dirroot.'/mod/lamslesson/lib.php'); + +echo lamslesson_get_lamsserver_time(); +?> Index: moodle/mod/lamslesson/settings.php =================================================================== diff -u -r5cb64dadd9549c48b1e0c2aa0896df2711a06d39 -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/settings.php (.../settings.php) (revision 5cb64dadd9549c48b1e0c2aa0896df2711a06d39) +++ moodle/mod/lamslesson/settings.php (.../settings.php) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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 =================================================================== diff -u -r3ae896d21d5e7b871f6dc84d35089ed2cc262dad -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/styles.css (.../styles.css) (revision 3ae896d21d5e7b871f6dc84d35089ed2cc262dad) +++ moodle/mod/lamslesson/styles.css (.../styles.css) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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 =================================================================== diff -u -r3ae896d21d5e7b871f6dc84d35089ed2cc262dad -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/validate.js (.../validate.js) (revision 3ae896d21d5e7b871f6dc84d35089ed2cc262dad) +++ moodle/mod/lamslesson/validate.js (.../validate.js) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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 =================================================================== diff -u -re8099877545e20d3ecd34672b7348775a288809e -r24183dc4f6936f3122920cc99678b1231701a3ea --- moodle/mod/lamslesson/version.php (.../version.php) (revision e8099877545e20d3ecd34672b7348775a288809e) +++ moodle/mod/lamslesson/version.php (.../version.php) (revision 24183dc4f6936f3122920cc99678b1231701a3ea) @@ -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)