Skip to content

Commit a1d02f1

Browse files
Seth Schoenpde
authored andcommitted
switch XML parsing syntax from E4X to DOMParser (bug 5893)
intended to fix https://trac.torproject.org/projects/tor/ticket/5893 Conflicts: src/chrome/content/code/HTTPSRules.js
1 parent 4fcbc0a commit a1d02f1

1 file changed

Lines changed: 36 additions & 34 deletions

File tree

src/chrome/content/code/HTTPSRules.js

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ function RuleSet(name, match_rule, default_off) {
4848
}
4949
}
5050

51+
var dom_parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser);
52+
5153
RuleSet.prototype = {
5254
_apply: function(urispec) {
5355
// return null if it does not apply
@@ -228,52 +230,52 @@ const RuleWriter = {
228230
}
229231

230232
sstream.close();
231-
fstream.close();
233+
fstream.close();
234+
// XXX: With DOMParser, we probably do not need to throw away the XML
235+
// declaration anymore nowadays.
232236
data = data.replace(/<\?xml[^>]*\?>/, "");
233237
try {
234-
data = data.replace(/<\?xml[^>]*\?>/, "");
235-
var xmlrulesets = XML(data);
238+
var xmlrulesets = dom_parser.parseFromString(data, "text/xml");
236239
} catch(e) { // file has been corrupted; XXX: handle error differently
237240
this.log(WARN,"Error in XML file: " + file.path + "\n" + e);
238241
return null;
239242
}
240243
this.parseXmlRulesets(xmlrulesets, rule_store, file);
241244
},
242245

243-
parseXmlRulesets: function(xmlblob, rule_store, file) {
244-
// Iterate over all the <ruleset>...</ruleset> elements in the file, and
245-
// add them to the rule_store HTTPSRules object.
246-
if (xmlblob.@name != xmlblob.@nonexistantthing) {
247-
// The root of the XML tree has a name, which means it should be single a ruleset...
248-
this.parseOneRuleset(xmlblob, rule_store, file);
246+
247+
parseXmlRulesets: function(xmldom, rule_store, file) {
248+
// XML input files can either be a <ruleset> in a file, or a
249+
// <rulesetlibrary> with many <rulesets> inside it (the latter form exists
250+
// because ZIP does a much better job of compressing it).
251+
if (xmldom.documentElement.nodeName == "ruleset") {
252+
// This is a single ruleset.
253+
this.parseOneRuleset(xmldom.documentElement, rule_store, file);
249254
} else {
250-
// The root of the XML tree should be a <rulesetlibrary> with many
251-
// <ruleset> children
252-
var lngth = xmlblob.ruleset.length(); // premature optimisation
255+
// The root of the XML tree is assumed to look like a <rulesetlibrary>
256+
var lngth = xmldom.documentElement.getElementsByTagName("ruleset").length; // premature optimisation
253257
if (lngth == 0 && (file.path.search("00README") == -1))
254258
this.log(WARN, "Probable <rulesetlibrary> with no <rulesets> in "
255-
+ file.path + "\n" + xmlblob);
259+
+ file.path + "\n" + xmldom);
256260
for (var j = 0; j < lngth; j++)
257-
this.parseOneRuleset(xmlblob.ruleset[j], rule_store, file);
261+
this.parseOneRuleset(xmldom.getElementsByTagName("ruleset")[j], rule_store, file);
258262
}
259263
},
260264

261265
parseOneRuleset: function(xmlruleset, rule_store, file) {
262-
// Extract an xmlrulset into the rulestore
263-
this.log(DBUG, "Parsing " + xmlruleset.@name + " from " + file.path);
264-
265-
if (xmlruleset.@name == xmlruleset.@nonexistantthing) {
266+
// Extract an xmlruleset into the rulestore
267+
if (!xmlruleset.getAttribute("name")) {
266268
this.log(WARN, "This blob: '" + xmlruleset + "' is not a ruleset\n");
267269
return null;
268270
}
269271

270-
var match_rl = null;
271-
var dflt_off = null;
272-
if (xmlruleset.@match_rule.length() > 0) match_rl = xmlruleset.@match_rule;
273-
if (xmlruleset.@default_off.length() > 0) dflt_off = xmlruleset.@default_off;
274-
var rs = new RuleSet(xmlruleset.@name, match_rl, dflt_off);
272+
this.log(DBUG, "Parsing " + xmlruleset.getAttribute("name") + " from " + file.path);
273+
274+
var match_rl = xmlruleset.getAttribute("match_rule");
275+
var dflt_off = xmlruleset.getAttribute("default_off");
276+
var rs = new RuleSet(xmlruleset.getAttribute("name"), xmlruleset.getAttribute("f"), match_rl, dflt_off);
275277

276-
if (xmlruleset.target.length() == 0) {
278+
if (xmlruleset.getElementsByTagName("target").length == 0) {
277279
var msg = "Error: As of v0.3.0, XML rulesets require a target domain entry,";
278280
msg = msg + "\nbut " + file.path + " is missing one.";
279281
this.log(WARN, msg);
@@ -289,8 +291,8 @@ const RuleWriter = {
289291

290292
// add this ruleset into HTTPSRules.targets with all of the applicable
291293
// target host indexes
292-
for (var i = 0; i < xmlruleset.target.length(); i++) {
293-
var host = xmlruleset.target[i].@host;
294+
for (var i = 0; i < xmlruleset.getElementsByTagName("target").length; i++) {
295+
var host = xmlruleset.getElementsByTagName("target")[i].getAttribute("host");
294296
if (!host) {
295297
this.log(WARN, "<target> missing host in " + file.path);
296298
return null;
@@ -300,20 +302,20 @@ const RuleWriter = {
300302
rule_store.targets[host].push(rs);
301303
}
302304

303-
for (var i = 0; i < xmlruleset.exclusion.length(); i++) {
304-
var exclusion = new Exclusion(xmlruleset.exclusion[i].@pattern);
305+
for (var i = 0; i < xmlruleset.getElementsByTagName("exclusion").length; i++) {
306+
var exclusion = new Exclusion(xmlruleset.getElementsByTagName("exclusion")[i].getAttribute("pattern"));
305307
rs.exclusions.push(exclusion);
306308
}
307309

308-
for (var i = 0; i < xmlruleset.rule.length(); i++) {
309-
var rule = new Rule(xmlruleset.rule[i].@from,
310-
xmlruleset.rule[i].@to);
310+
for (var i = 0; i < xmlruleset.getElementsByTagName("rule").length; i++) {
311+
var rule = new Rule(xmlruleset.getElementsByTagName("rule")[i].getAttribute("from"),
312+
xmlruleset.getElementsByTagName("rule")[i].getAttribute("to"));
311313
rs.rules.push(rule);
312314
}
313315

314-
for (var i = 0; i < xmlruleset.securecookie.length(); i++) {
315-
var c_rule = new CookieRule(xmlruleset.securecookie[i].@host,
316-
xmlruleset.securecookie[i].@name);
316+
for (var i = 0; i < xmlruleset.getElementsByTagName("securecookie").length; i++) {
317+
var c_rule = new CookieRule(xmlruleset.getElementsByTagName("securecookie")[i].getAttribute("host"),
318+
xmlruleset.getElementsByTagName("securecookie")[i].getAttribute("name"));
317319
rs.cookierules.push(c_rule);
318320
this.log(DBUG,"Cookie rule "+ c_rule.host+ " " +c_rule.name);
319321
}

0 commit comments

Comments
 (0)