Index: moodle/mod/lamslesson/lang/en/lamslesson.php =================================================================== diff -u -r1c01d4255a22a95132a74d48808f084d8153f0c6 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/lang/en/lamslesson.php (.../lamslesson.php) (revision 1c01d4255a22a95132a74d48808f084d8153f0c6) +++ moodle/mod/lamslesson/lang/en/lamslesson.php (.../lamslesson.php) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 -rbe08f578da5e41c9b041c27b4a0bba15debd4ef7 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/lib.php (.../lib.php) (revision be08f578da5e41c9b041c27b4a0bba15debd4ef7) +++ moodle/mod/lamslesson/lib.php (.../lib.php) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 -r2e199e6752ced8849b6e67e788652a4459a15aa5 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/mod_form.php (.../mod_form.php) (revision 2e199e6752ced8849b6e67e788652a4459a15aa5) +++ moodle/mod/lamslesson/mod_form.php (.../mod_form.php) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -0,0 +1,6 @@ +dirroot.'/mod/lamslesson/lib.php'); + +echo lamslesson_get_lamsserver_time(); +?> Index: moodle/mod/lamslesson/settings.php =================================================================== diff -u -r26759e4a3721b0115d50efc85b883261c0ded334 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/settings.php (.../settings.php) (revision 26759e4a3721b0115d50efc85b883261c0ded334) +++ moodle/mod/lamslesson/settings.php (.../settings.php) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 -rfff4221d477dd2d8bbac61f36246ab726ba6d570 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/styles.css (.../styles.css) (revision fff4221d477dd2d8bbac61f36246ab726ba6d570) +++ moodle/mod/lamslesson/styles.css (.../styles.css) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 -rfff4221d477dd2d8bbac61f36246ab726ba6d570 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/validate.js (.../validate.js) (revision fff4221d477dd2d8bbac61f36246ab726ba6d570) +++ moodle/mod/lamslesson/validate.js (.../validate.js) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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 -rffbc8ae643653bfdcd0a3ac5b9b7906cf1a55ac6 -ra630a0dd9891c0958d64073a9700be5169ff5c6c --- moodle/mod/lamslesson/version.php (.../version.php) (revision ffbc8ae643653bfdcd0a3ac5b9b7906cf1a55ac6) +++ moodle/mod/lamslesson/version.php (.../version.php) (revision a630a0dd9891c0958d64073a9700be5169ff5c6c) @@ -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)