function updateRules(dir, cb) { // TODO ensure cache directory exists if (typeof dir === 'function') { cb = dir; dir = path.join(cacheDir('HTTPSize'), 'repo'); } cloneOrPull('https://github.com/EFForg/HTTPS-Everywhere.git', dir, cb); }
function loadRules(dir, cb) { if (typeof dir === 'function') { cb = dir; dir = path.join(cacheDir('HTTPSize'), 'repo/src/chrome/content/rules'); } var rulesets = []; dirUtil.readFiles(dir, { match: /.xml$/ }, function(err, content, next) { if (err) { cb(err, null); return; } // TODO handle parser errors and warnings var doc = new DOMParser().parseFromString(content, 'application/xml'); var rulesetElements = doc.getElementsByTagName('ruleset'); for (let i = 0; i < rulesetElements.length; i++) { var ruleset = new Map(); var el = rulesetElements[i]; // Name ruleset.name = el.getAttribute('name'); // Default off ruleset.defaultOff = el.getAttribute('default_off') || null; // Mixed Content ruleset.mixedContent = el.getAttribute('platform') === 'mixedcontent'; // Targets var targets = el.getElementsByTagName('target'); ruleset.targets = []; for (let j = 0; j < targets.length; j++) { ruleset.targets.push(targets[j].getAttribute('host')); } // Exclusions var exclusions = el.getElementsByTagName('exclusion'); ruleset.exclusions = []; for (var j = 0; j < exclusions.length; j++) { ruleset.exclusions.push(new RegExp(exclusions[j].getAttribute('pattern'))); } // Rules var rules = el.getElementsByTagName('rule'); ruleset.rules = []; for (let j = 0; j < rules.length; j++) { var rule = { from: new RegExp(rules[j].getAttribute('from')), to: new RegExp(rules[j].getAttribute('to')) }; ruleset.rules.push(rule); } // TODO <securecookie>s // TODO <test>s // TODO downgrades rulesets.push(ruleset); } next(); }, function(err, files) { if (err) { cb(err, null); return; } cb(null, rulesets); }); }