Merge pull request #1945 from yokobond/fix-message-variable-name-destruction

Escape variable name in XML
This commit is contained in:
Karishma Chadha authored and GitHub committed 2019-02-04 10:10:13 -05:00
commit 166bc37f6f
2 files changed
+112 -1

No files matched your search

+2 -1
View File
@@ -4,6 +4,7 @@
*/
const uid = require('../util/uid');
const xmlEscape = require('../util/xml-escape');
class Variable {
/**
@@ -36,7 +37,7 @@ class Variable {
toXML (isLocal) {
isLocal = (isLocal === true);
return `<variable type="${this.type}" id="${this.id}" islocal="${isLocal
}" iscloud="${this.isCloud}">${this.name}</variable>`;
}" iscloud="${this.isCloud}">${xmlEscape(this.name)}</variable>`;
}
/**
+110
View File
@@ -0,0 +1,110 @@
const test = require('tap').test;
const Variable = require('../../src/engine/variable');
const htmlparser = require('htmlparser2');
test('spec', t => {
t.type(typeof Variable.SCALAR_TYPE, typeof Variable.LIST_TYPE);
t.type(typeof Variable.SCALAR_TYPE, typeof Variable.BROADCAST_MESSAGE_TYPE);
const varId = 'varId';
const varName = 'varName';
const varIsCloud = false;
let v = new Variable(
varId,
varName,
Variable.SCALAR_TYPE,
varIsCloud
);
t.type(Variable, 'function');
t.type(v, 'object');
t.ok(v instanceof Variable);
t.equal(v.id, varId);
t.equal(v.name, varName);
t.equal(v.type, Variable.SCALAR_TYPE);
t.type(v.value, 'number');
t.equal(v.isCloud, varIsCloud);
t.type(v.toXML, 'function');
v = new Variable(
varId,
varName,
Variable.LIST_TYPE,
varIsCloud
);
t.ok(Array.isArray(v.value));
v = new Variable(
varId,
varName,
Variable.BROADCAST_MESSAGE_TYPE,
varIsCloud
);
t.equal(v.value, 'varName');
t.end();
});
test('toXML', t => {
const varId = 'varId';
const varName = 'varName';
const varIsCloud = false;
const varIsLocal = false;
const v = new Variable(
varId,
varName,
Variable.SCALAR_TYPE,
varIsCloud
);
const parser = new htmlparser.Parser({
onopentag: function (name, attribs){
if (name === 'variable'){
t.equal(attribs.type, Variable.SCALAR_TYPE);
t.equal(attribs.id, varId);
t.equal(attribs.iscloud, varIsCloud.toString());
t.equal(attribs.islocal, varIsLocal.toString());
}
},
ontext: function (text){
t.equal(text, varName);
}
}, {decodeEntities: false});
parser.write(v.toXML(false));
parser.end();
t.end();
});
test('escape variable name for XML', t => {
const varId = 'varId';
const varName = '<>&\'"';
const varIsCloud = false;
const varIsLocal = false;
const v = new Variable(
varId,
varName,
Variable.SCALAR_TYPE,
varIsCloud
);
const parser = new htmlparser.Parser({
onopentag: function (name, attribs){
if (name === 'variable'){
t.equal(attribs.type, Variable.SCALAR_TYPE);
t.equal(attribs.id, varId);
t.equal(attribs.iscloud, varIsCloud.toString());
t.equal(attribs.islocal, varIsLocal.toString());
}
},
ontext: function (text){
t.equal(text, '&lt;&gt;&amp;&apos;&quot;');
}
}, {decodeEntities: false});
parser.write(v.toXML(false));
parser.end();
t.end();
});