MDL-10425 and MDL-12872 Firefox bugs String() handling on replace. enhanced rege xfor CMI data types. MDL-8193 Incorrect handling of quotes in SetValue processing - recoded so that it escapes all values passed from tracks. backport to 1.8. Plus - fixed a back dated problem with determining the next sco in sequence with the navigation buttons.
This commit is contained in:
+8
-6
@@ -35,9 +35,11 @@
|
||||
|
||||
require_login($course->id, false, $cm);
|
||||
|
||||
if ($usertrack=scorm_get_tracks($scoid,$USER->id,$attempt)) {
|
||||
if ($usertrack = scorm_get_tracks($scoid,$USER->id,$attempt)) {
|
||||
if ((isset($usertrack->{'cmi.exit'}) && ($usertrack->{'cmi.exit'} != 'time-out')) || ($scorm->version != "SCORM_1.3")) {
|
||||
$userdata = $usertrack;
|
||||
foreach ($usertrack as $key => $value) {
|
||||
$userdata->$key = addslashes_js($value);
|
||||
}
|
||||
} else {
|
||||
$userdata->status = '';
|
||||
$userdata->score_raw = '';
|
||||
@@ -46,8 +48,8 @@
|
||||
$userdata->status = '';
|
||||
$userdata->score_raw = '';
|
||||
}
|
||||
$userdata->student_id = addslashes($USER->username);
|
||||
$userdata->student_name = addslashes($USER->lastname .', '. $USER->firstname);
|
||||
$userdata->student_id = addslashes_js($USER->username);
|
||||
$userdata->student_name = addslashes_js($USER->lastname .', '. $USER->firstname);
|
||||
$userdata->mode = 'normal';
|
||||
if (isset($mode)) {
|
||||
$userdata->mode = $mode;
|
||||
@@ -59,7 +61,7 @@
|
||||
}
|
||||
if ($scodatas = scorm_get_sco($scoid, SCO_DATA)) {
|
||||
foreach ($scodatas as $key => $value) {
|
||||
$userdata->$key = $value;
|
||||
$userdata->$key = addslashes_js($value);
|
||||
}
|
||||
} else {
|
||||
error('Sco not found');
|
||||
@@ -74,6 +76,6 @@
|
||||
|
||||
var errorCode = "0";
|
||||
function underscore(str) {
|
||||
str = str.replace(/.N/g,".");
|
||||
str = String(str).replace(/.N/g,".");
|
||||
return str.replace(/\./g,"__");
|
||||
}
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
//
|
||||
function AICCapi() {
|
||||
// Standard Data Type Definition
|
||||
CMIString256 = '^.{0,255}$';
|
||||
//CMIString4096 = '^[.|\\n|\\r]{0,4095}$';
|
||||
CMIString4096 = '^.{0,4096}$';
|
||||
CMIString256 = '^[\\u0000-\\uffff]{0,255}$';
|
||||
CMIString4096 = '^[\\u0000-\\uffff]{0,4096}$';
|
||||
CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$';
|
||||
CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$';
|
||||
CMIInteger = '^\\d+$';
|
||||
@@ -224,10 +223,10 @@ function AICCapi() {
|
||||
if (Initialized) {
|
||||
if (element !="") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'w') {
|
||||
element = element.replace(expression, "_$1.");
|
||||
element = String(element).replace(expression, "_$1.");
|
||||
elementIndexes = element.split('.');
|
||||
subelement = 'cmi';
|
||||
i = 1;
|
||||
@@ -278,7 +277,7 @@ function AICCapi() {
|
||||
if (Initialized) {
|
||||
if (element != "") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
expression = new RegExp(eval('datamodel["'+elementmodel+'"].format'));
|
||||
@@ -474,7 +473,7 @@ function AICCapi() {
|
||||
} else {
|
||||
element = parent+'.'+property;
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
elementstring = '&'+underscore(element)+'='+escape(data[property]);
|
||||
|
||||
@@ -16,10 +16,8 @@
|
||||
//
|
||||
function SCORMapi1_2() {
|
||||
// Standard Data Type Definition
|
||||
CMIString256 = '^.{0,255}$';
|
||||
CMIString4096 = '^.{0,4096}$';
|
||||
//CMIString256 = '^[\.|\\n|\\r]{0,255}$';
|
||||
//CMIString4096 = '^[\.|\\n|\\r]{0,4095}$';
|
||||
CMIString256 = '^[\\u0000-\\uffff]{0,255}$';
|
||||
CMIString4096 = '^[\\u0000-\\uffff]{0,4096}$';
|
||||
CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$';
|
||||
CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$';
|
||||
CMIInteger = '^\\d+$';
|
||||
@@ -55,7 +53,7 @@ function SCORMapi1_2() {
|
||||
'cmi._version':{'defaultvalue':'3.4', 'mod':'r', 'writeerror':'402'},
|
||||
'cmi.core._children':{'defaultvalue':core_children, 'mod':'r', 'writeerror':'402'},
|
||||
'cmi.core.student_id':{'defaultvalue':'<?php echo $userdata->student_id ?>', 'mod':'r', 'writeerror':'403'},
|
||||
'cmi.core.student_name':{'defaultvalue':'<?php echo addslashes($userdata->student_name) ?>', 'mod':'r', 'writeerror':'403'},
|
||||
'cmi.core.student_name':{'defaultvalue':'<?php echo $userdata->student_name ?>', 'mod':'r', 'writeerror':'403'},
|
||||
'cmi.core.lesson_location':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_location'})?$userdata->{'cmi.core.lesson_location'}:'' ?>', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},
|
||||
'cmi.core.credit':{'defaultvalue':'<?php echo $userdata->credit ?>', 'mod':'r', 'writeerror':'403'},
|
||||
'cmi.core.lesson_status':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_status'})?$userdata->{'cmi.core.lesson_status'}:'' ?>', 'format':CMIStatus, 'mod':'rw', 'writeerror':'405'},
|
||||
@@ -223,10 +221,10 @@ function SCORMapi1_2() {
|
||||
if (Initialized) {
|
||||
if (element !="") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'w') {
|
||||
element = element.replace(expression, "_$1.");
|
||||
element = String(element).replace(expression, "_$1.");
|
||||
elementIndexes = element.split('.');
|
||||
subelement = 'cmi';
|
||||
i = 1;
|
||||
@@ -282,7 +280,7 @@ function SCORMapi1_2() {
|
||||
if (Initialized) {
|
||||
if (element != "") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
expression = new RegExp(eval('datamodel["'+elementmodel+'"].format'));
|
||||
@@ -493,7 +491,7 @@ function SCORMapi1_2() {
|
||||
} else {
|
||||
element = parent+'.'+property;
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if (elementmodel != "cmi.core.session_time") {
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
|
||||
@@ -211,7 +211,7 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
|
||||
$findnext = false;
|
||||
$parents[$level]='/';
|
||||
|
||||
foreach ($scoes as $sco) {
|
||||
foreach ($scoes as $pos => $sco) {
|
||||
$isvisible = false;
|
||||
$sco->title = stripslashes($sco->title);
|
||||
if ($optionaldatas = scorm_get_sco($sco->id, SCO_DATA)) {
|
||||
@@ -251,7 +251,11 @@ function scorm_get_toc($user,$scorm,$liststyle,$currentorg='',$scoid='',$mode='n
|
||||
if ($isvisible) {
|
||||
$result->toc .= "\t\t<li>";
|
||||
}
|
||||
$nextsco = next($scoes);
|
||||
if (isset($scoes[$pos+1])) {
|
||||
$nextsco = $scoes[$pos+1];
|
||||
} else {
|
||||
$nextsco = false;
|
||||
}
|
||||
$nextisvisible = false;
|
||||
if (($nextsco !== false) && ($optionaldatas = scorm_get_sco($nextsco->id, SCO_DATA))) {
|
||||
if (!isset($optionaldatas->isvisible) || (isset($optionaldatas->isvisible) && ($optionaldatas->isvisible == 'true'))) {
|
||||
|
||||
@@ -94,7 +94,7 @@ function SCORMapi1_3() {
|
||||
'cmi.interactions.n.description':{'pattern':CMIIndex, 'format':CMILangString250, 'mod':'rw'},
|
||||
'cmi.launch_data':{'defaultvalue':<?php echo isset($userdata->datafromlms)?'\''.$userdata->datafromlms.'\'':'null' ?>, 'mod':'r'},
|
||||
'cmi.learner_id':{'defaultvalue':'<?php echo $userdata->student_id ?>', 'mod':'r'},
|
||||
'cmi.learner_name':{'defaultvalue':'<?php echo addslashes($userdata->student_name) ?>', 'mod':'r'},
|
||||
'cmi.learner_name':{'defaultvalue':'<?php echo $userdata->student_name ?>', 'mod':'r'},
|
||||
'cmi.learner_preference._children':{'defaultvalue':student_preference_children, 'mod':'r'},
|
||||
'cmi.learner_preference.audio_level':{'defaultvalue':'1', 'format':CMIDecimal, 'range':audio_range, 'mod':'rw'},
|
||||
'cmi.learner_preference.language':{'defaultvalue':'', 'format':CMILang, 'mod':'rw'},
|
||||
@@ -286,12 +286,12 @@ function SCORMapi1_3() {
|
||||
if ((Initialized) && (!Terminated)) {
|
||||
if (element !="") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'w') {
|
||||
|
||||
element = element.replace(/\.(\d+)\./, ".N$1.");
|
||||
element = String(element).replace(/\.(\d+)\./, ".N$1.");
|
||||
element = element.replace(/\.(\d+)\./, ".N$1.");
|
||||
|
||||
elementIndexes = element.split('.');
|
||||
@@ -385,7 +385,7 @@ function SCORMapi1_3() {
|
||||
if ((Initialized) && (!Terminated)) {
|
||||
if (element != "") {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
expression = new RegExp(eval('datamodel["'+elementmodel+'"].format'));
|
||||
@@ -751,7 +751,7 @@ function SCORMapi1_3() {
|
||||
function duplicatedID (element, value) {
|
||||
var found = false;
|
||||
var elements = eval(element+'._count');
|
||||
for (n=0;(n<elements) && (!found);n++) {
|
||||
for (n=0;(n < elements) && (!found);n++) {
|
||||
if (eval(element+'.N'+n+'.id') == value) {
|
||||
found = true;
|
||||
}
|
||||
@@ -764,7 +764,7 @@ function SCORMapi1_3() {
|
||||
return element;
|
||||
} else {
|
||||
expression = new RegExp(CMIIndex,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if (typeof datamodel[elementmodel] != "undefined") {
|
||||
return elementmodel;
|
||||
}
|
||||
@@ -788,7 +788,7 @@ function SCORMapi1_3() {
|
||||
mins = parseInt(firstarray[11],10)+parseInt(secondarray[11],10)+change; //Minutes
|
||||
change = Math.floor(mins / 60);
|
||||
mins = mins - (change * 60);
|
||||
hours = parseInt(firstarray[10],10)+parseInt(secondarray[10],10)+change; //Hours
|
||||
hours = parseInt(firstarray[9],10)+parseInt(secondarray[9],10)+change; //Hours
|
||||
change = Math.floor(hours / 24);
|
||||
hours = hours - (change * 24);
|
||||
days = parseInt(firstarray[6],10)+parseInt(secondarray[6],10)+change; // Days
|
||||
@@ -832,7 +832,7 @@ function SCORMapi1_3() {
|
||||
} else {
|
||||
element = parent+'.'+property;
|
||||
expression = new RegExp(CMIIndexStore,'g');
|
||||
elementmodel = element.replace(expression,'.n.');
|
||||
elementmodel = String(element).replace(expression,'.n.');
|
||||
if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
|
||||
if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
|
||||
elementstring = '&'+underscore(element)+'='+escape(data[property]);
|
||||
|
||||
Reference in New Issue
Block a user