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:
piers
2008-08-06 23:56:46 +00:00
parent 5f75ca701e
commit e19a4892a9
5 changed files with 35 additions and 32 deletions
+8 -6
View File
@@ -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,"__");
}
+6 -7
View File
@@ -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]);
+7 -9
View File
@@ -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') {
+6 -2
View File
@@ -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'))) {
+8 -8
View File
@@ -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]);