home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Minami 83
/
MINAMI83.iso
/
Extra
/
DivXInstaller.exe
/
$PLUGINSDIR
/
GoogleToolbarFirefox.msi
/
xpi
/
amulet-jslib
/
listmanager.js
< prev
next >
Wrap
Text File
|
2006-08-07
|
12KB
|
347 lines
function PROT_ListManager(opt_testing) {
this.debugZone = "listmanager";
if (opt_testing)
this.debugZone += "testing";
G_debugService.enableZone(this.debugZone);
this.testing_ = !!opt_testing;
this.currentUpdateChecker_ = null; // set when we toggle updates
var self = this;
this.updateserverURL_ = PROT_globalStore.getUpdateserverURL();
this.tablesKnown_ = {};
if (this.testing_) {
this.tablesKnown_ = {
"test1-foo-domain": new PROT_VersionParser("test1-foo-domain", 0, -1),
"test2-foo-domain": new PROT_VersionParser("test2-foo-domain", 0, -1),
"test-white-domain": new PROT_VersionParser("test-white-domain", 0, -1,
true /* require mac*/),
"test-mac-domain": new PROT_VersionParser("test-mac-domain", 0, -1,
true /* require mac */)
};
}
this.tablesData_ = {};
this.registrar_ = new EventRegistrar({});
this.observerServiceObserver_ = new G_ObserverServiceObserver(
'xpcom-shutdown',
BindToObject(this.shutdown_, this),
true /*only once*/);
this.urlCrypto_ = null;
this.prefs_ = new G_Preferences();
}
PROT_ListManager.prototype.shutdown_ = function() {
for (var name in this.tablesData) {
delete this.tablesData[name];
}
}
PROT_ListManager.prototype.registerTable = function(tableName,
opt_requireMac,
opt_callback) {
var table = new PROT_VersionParser(tableName, 1, -1, opt_requireMac);
this.tablesKnown_[tableName] = table;
this.tablesData_[tableName] = new PROT_TRTable(tableName);
if (opt_callback) {
if (!this.registrar_.isKnownEventType(tableName))
this.registrar_.addEventType(tableName);
this.registrar_.registerListener(tableName, opt_callback);
G_Debug(this, "registering callback for " + tableName);
}
return true;
}
PROT_ListManager.prototype.enableUpdateTables = function(tables) {
var changed = false;
for (var i = 0; i < tables.length; ++i) {
var table = this.tablesKnown_[tables[i]];
if (table) {
G_Debug(this, "Enabling table updates for " + tables[i]);
table.needsUpdate = true;
changed = true;
}
}
if (changed === true)
this.maybeToggleUpdateChecking();
}
PROT_ListManager.prototype.disableUpdateTables = function(tables) {
var changed = false;
for (var i = 0; i < tables.length; ++i) {
var table = this.tablesKnown_[tables[i]];
if (table) {
G_Debug(this, "Disabling table updates for " + tables[i]);
table.needsUpdate = false;
changed = true;
}
}
if (changed === true)
this.maybeToggleUpdateChecking();
}
PROT_ListManager.prototype.requireTableUpdates = function() {
for (var type in this.tablesKnown_) {
if (this.tablesKnown_[type].major == 0)
continue;
if (this.tablesKnown_[type].needsUpdate)
return true;
}
return false;
}
PROT_ListManager.prototype.maybeStartManagingUpdates = function() {
if (this.testing_)
return;
this.maybeToggleUpdateChecking();
}
PROT_ListManager.prototype.maybeToggleUpdateChecking = function() {
if (this.testing_)
return;
if (this.requireTableUpdates() === true) {
G_Debug(this, "Starting managing lists");
if (!this.currentUpdateChecker_)
this.currentUpdateChecker_ =
new G_Alarm(BindToObject(this.checkForUpdates, this), 3000);
this.startUpdateChecker();
} else {
G_Debug(this, "Stopping managing lists (if currently active)");
this.stopUpdateChecker(); // Cancel pending updates
}
}
PROT_ListManager.prototype.startUpdateChecker = function() {
this.stopUpdateChecker();
var thirtyMinutes = 30 * 60 * 1000;
this.updateChecker_ = new G_Alarm(BindToObject(this.checkForUpdates, this),
thirtyMinutes, true /* repeat */);
}
PROT_ListManager.prototype.stopUpdateChecker = function() {
if (this.updateChecker_) {
this.updateChecker_.cancel();
this.updateChecker_ = null;
}
}
PROT_ListManager.prototype.safeExists = function(table, key, callback) {
try {
var map = this.tablesData_[table];
map.find(key, callback);
} catch(e) {
G_Debug(this, "safeExists masked failure for " + table + ", key " + key + ": " + e);
callback(false);
}
}
PROT_ListManager.prototype.loadTableVersions_ = function() {
var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
for (var table in this.tablesKnown_) {
var version = this.prefs_.getPref(prefBase + table, "1.-1");
G_Debug(this, "loadTableVersion " + table + ": " + version);
var tokens = version.split(".");
G_Assert(this, tokens.length == 2, "invalid version number");
this.tablesKnown_[table].major = tokens[0];
this.tablesKnown_[table].minor = tokens[1];
}
}
PROT_ListManager.prototype.setTableVersion_ = function(versionString) {
var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
G_Debug(this, "Got version string: " + versionString);
var versionParser = new PROT_VersionParser("");
if (versionParser.fromString(versionString)) {
var tableName = versionParser.type;
var versionNumber = versionParser.versionString();
this.prefs_.setPref(prefBase + tableName, versionNumber);
if (!this.tablesKnown_[tableName]) {
this.tablesKnown_[tableName] = versionParser;
} else {
this.tablesKnown_[tableName].ImportVersion(versionParser);
}
if (!this.tablesData_[tableName])
this.tablesData_[tableName] = new PROT_TRTable(tableName);
if (this.registrar_.isKnownEventType(tableName)) {
this.registrar_.fire(tableName, { table: this.tablesData_[tableName] });
}
}
}
PROT_ListManager.prototype.getRequestURL_ = function(url) {
url += "version=";
var firstElement = true;
var requestMac = false;
for (var type in this.tablesKnown_) {
if (this.tablesKnown_[type].major == 0)
continue;
if (this.tablesKnown_[type].needsUpdate == false)
continue;
if (!firstElement) {
url += ","
} else {
firstElement = false;
}
url += type + ":" + this.tablesKnown_[type].toUrl();
if (this.tablesKnown_[type].requireMac)
requestMac = true;
}
if (requestMac) {
if (!this.urlCrypto_)
this.urlCrypto_ = new PROT_UrlCrypto();
url += "&wrkey=" +
encodeURIComponent(this.urlCrypto_.getManager().getWrappedKey());
}
G_Debug(this, "getRequestURL returning: " + url);
return url;
}
PROT_ListManager.prototype.checkForUpdates = function() {
this.currentUpdateChecker_ = null;
this.loadTableVersions_();
G_Debug(this, 'checkForUpdates: scheduling request..');
var streamer = Cc["@google.com/streamupdater;1"]
.getService(Ci.GTBIStreamUpdater);
streamer.updateUrl = this.getRequestURL_(this.updateserverURL_);
if (!streamer.downloadUpdates(BindToObject(this.setTableVersion_, this))) {
G_Debug(this, "Streamer is busy, no updates now");
}
return true;
}
function TEST_PROT_ListManager() {
if (G_GDEBUG) {
var z = "listmanager UNITTEST";
G_debugService.enableZone(z);
G_Debug(z, "Starting");
var listManager = new PROT_ListManager(true /*testing*/);
var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
var vp;
function createTrueCallback(msg) {
return function(s) {
if (!s) {
G_Error(z, msg + " (" + s + ")");
}
}
}
function createFalseCallback(msg) {
return function(s) {
if (s) {
G_Error(z, msg + " (" + s + ")");
}
}
}
function checkTables2() {
for (var i = 0; i < 10; ++i) {
var prop = "http://" + i + ".com";
listManager.safeExists("test1-foo-domain", prop,
createTrueCallback("Couldn't find member " + prop + " of set1"));
}
vp = listManager.tablesKnown_["test1-foo-domain"];
G_Assert(z, "2" == vp.minor, "set1 table version mismatch");
G_Assert(z, "1.2" == listManager.prefs_.getPref(prefBase + vp.type),
"set1 table version mismatch (pref)");
for (var i = 0; i < 5; ++i) {
var prop = "http://" + i + ".com";
listManager.safeExists("test2-foo-domain", prop,
createTrueCallback("Couldn't find member " + prop + " of set2"));
}
vp = listManager.tablesKnown_["test2-foo-domain"];
G_Assert(z, "7" == vp.minor, "set2 table version mismatch");
G_Assert(z, "1.7" == listManager.prefs_.getPref(prefBase + vp.type),
"set2 table version mismatch (pref)");
listManager.safeExists("test1-black-url", "foo2",
createFalseCallback("test1: found malformed key/value pair foo2"));
for (i = 1; i <= 4; ++i) {
listManager.safeExists("test2-black-url", "foo" + i,
createTrueCallback("test2: missing key foo" + i));
}
listManager.safeExists("test3-black-url", "foo4",
createFalseCallback("test3: found malformed key/value pair foo4"));
for (i = 1; i <= 4; ++i) {
listManager.safeExists("test4-black-url", "foo" + i,
createTrueCallback("test4: missing key foo" + i));
}
G_Debug(z, "checkTables2 PASSED");
var file = G_File.getProfileFile();
file.append("google_safebrowsing");
file.append("kf.txt");
var data = "clientkey:24:ViEejQLgBqYFAEABj/d8TA==\n"
+ "wrappedkey:24:MTpv5__687Yk_CmU0wZZizE_\n";
G_FileWriter.writeAll(file, data);
var mgr = PROT_UrlCrypto.prototype.manager_;
mgr.maybeLoadOldKey();
mgr.replaceKeyOrig_ = mgr.replaceKey_;
mgr.replaceKey_ = function() {};
streamUpdater.updateUrl =
"http://firetools-win/unittests/streamupdate-test3.txt";
streamUpdater.downloadUpdates(checkTablesStreaming3);
}
function checkTables3() {
var vp = listManager.tablesKnown_['test-sandbox-text'];
G_Assert(z, "4" == vp.minor, "test-sandbox-text table version mismatch " + vp.minor);
G_Assert(z, "1.4" == listManager.prefs_.getPref(prefBase + vp.type),
"test-sandbox-text table version mismatch (pref)");
listManager.safeExists('test-sandbox-text', 'sandbox',
checkSandboxText);
listManager.safeExists("test1-foo-domain", "http://1.com",
createFalseCallback("failed to remove 1.com"));
listManager.safeExists("test1-foo-domain", "http://3.com",
createFalseCallback("failed to remove 3.com"));
listManager.safeExists("test1-foo-domain", "http://2.com",
createTrueCallback("2.com missing"));
listManager.safeExists("test1-foo-domain", "http://10.com",
createTrueCallback("failed to add 10.com"));
var mgr = PROT_UrlCrypto.prototype.manager_;
mgr.replaceKey_ = mgr.replaceKeyOrig_;
G_Debug(z, "PASSED ALL");
}
function checkSandboxText(text) {
G_Assert(z, "function%20getHandlers%28%29%7Breturn%5B%5D%7D%0A%3B%0A%0A"
== text, "sandbox text mismatch: " + text);
}
var streamUpdater = Components.classes["@google.com/streamupdater;1"]
.createInstance(Components.interfaces.GTBIStreamUpdater);
function checkTablesStreaming(versionString) {
if ('[streamtest-black-url 1.1]' == versionString) {
G_Debug(z, "Got streaming table callback");
listManager.registerTable('streamtest-black-url');
listManager.registerTable('streamtest2-white-url');
} else if ('[streamtest2-white-url 1.2]' == versionString) {
listManager.safeExists("streamtest-black-url", "foo1",
createTrueCallback("streamtest: failed to add foo1"));
listManager.safeExists("streamtest-black-url", "foo2",
createFalseCallback("streamtest: shouldn't find foo2 " +
" (malformed)"));
listManager.safeExists("streamtest-black-url", "foo3",
createTrueCallback("streamtest: failed to add foo3"));
listManager.safeExists("streamtest-black-url", "foo4",
createTrueCallback("streamtest: failed to add foo4"));
listManager.safeExists("streamtest2-white-url", "test",
createTrueCallback("streamtest2: failed to add test"));
streamUpdater.updateUrl =
"http://firetools-win/unittests/streamupdate-test2.txt";
streamUpdater.downloadUpdates(checkTablesStreaming2);
G_Debug(z, "STREAM TESTS PASSED");
} else {
G_Error(z, "(checkTablesStreaming) unexpected update line from "
+ "streaming update:" + versionString);
}
}
function checkTablesStreaming2(versionString) {
listManager.setTableVersion_(versionString);
if (versionString == "[test1-foo-domain 1.2]" ||
versionString == "[test2-foo-domain 1.7]" ||
versionString == "[test1-black-url 1.1]" ||
versionString == "[test2-black-url 1.2]" ||
versionString == "[test3-black-url 1.3]") {
G_Debug(z, "Got valid table callbacks");
} else if (versionString == "[test4-black-url 1.4]") {
G_Debug(z, "Got last valid table callback, starting checks");
checkTables2();
} else {
G_Error(z, "(checkTablesStreaming2) unexpected update line from "
+ "streaming update:" + versionString);
}
}
function checkTablesStreaming3(versionString) {
listManager.setTableVersion_(versionString);
if (versionString.startsWith("[test-sandbox-text 1.4]")) {
G_Debug(z, "Got valid table callbacks");
} else if (versionString == "[test1-foo-domain 1.3]") {
G_Debug(z, "Got last valid table callback, starting checks");
checkTables3();
} else {
G_Error(z, "(checkTablesStreaming3) unexpected update line from "
+ "streaming update:" + versionString);
}
}
streamUpdater.updateUrl =
"http://firetools-win/unittests/streamupdate-test1.txt";
G_Debug(z, "Testing Stream Updater");
streamUpdater.downloadUpdates(checkTablesStreaming);
}
}