Bug 568677 - Failure to get CryptoMeta assumes it's missing [r=mconnor]

Explicitly check the status code to make sure we stop syncing on non-404 crypto meta failures. Add tests to check correct behavior of 404 and non-404 errors during syncStartup.
This commit is contained in:
Edward Lee 2010-06-14 15:16:53 -07:00
Родитель 9529fb34fa
Коммит 2256714107
3 изменённых файлов: 95 добавлений и 0 удалений

Просмотреть файл

@ -121,6 +121,7 @@ NO_SYNC_NODE_FOUND: "error.sync.reason.no_node_found",
ENGINE_UPLOAD_FAIL: "error.engine.reason.record_upload_fail",
ENGINE_DOWNLOAD_FAIL: "error.engine.reason.record_download_fail",
ENGINE_UNKNOWN_FAIL: "error.engine.reason.unknown_fail",
ENGINE_METARECORD_DOWNLOAD_FAIL: "error.engine.reason.metarecord_download_fail",
ENGINE_METARECORD_UPLOAD_FAIL: "error.engine.reason.metarecord_upload_fail",
// Ways that a sync can be disabled (messages only to be printed in debug log)

Просмотреть файл

@ -363,6 +363,12 @@ SyncEngine.prototype = {
meta = null;
}
}
// Don't proceed if we failed to get the crypto meta for reasons not 404
else if (CryptoMetas.response.status != 404) {
let resp = CryptoMetas.response;
resp.failureCode = ENGINE_METARECORD_DOWNLOAD_FAIL;
throw resp;
}
// Determine if we need to wipe on outdated versions
let metaGlobal = Records.get(this.metaURL);

Просмотреть файл

@ -230,6 +230,94 @@ function test_syncStartup_emptyOrOutdatedGlobalsResetsSync() {
}
}
function test_syncStartup_metaGet404() {
_("SyncEngine._syncStartup resets sync and wipes server data if the symmetric key is missing 404");
Svc.Prefs.set("clusterURL", "http://localhost:8080/");
// A symmetric key with an incorrect HMAC
let crypto_steam = new ServerWBO("steam");
// A proper global record with matching version and syncID
let engine = makeSteamEngine();
let global = new ServerWBO("global",
{engines: {steam: {version: engine.version,
syncID: engine.syncID}}});
// Some server side data that's going to be wiped
let collection = new ServerCollection();
collection.wbos.flying = new ServerWBO(
"flying", encryptPayload({id: "flying",
denomination: "LNER Class A3 4472"}));
collection.wbos.scotsman = new ServerWBO(
"scotsman", encryptPayload({id: "scotsman",
denomination: "Flying Scotsman"}));
let server = sync_httpd_setup({
"/1.0/foo/storage/crypto/steam": crypto_steam.handler(),
"/1.0/foo/storage/steam": collection.handler()
});
createAndUploadKeypair();
try {
_("Confirm initial environment");
do_check_false(!!crypto_steam.payload);
do_check_true(!!collection.wbos.flying.payload);
do_check_true(!!collection.wbos.scotsman.payload);
engine.lastSync = Date.now() / 1000;
engine._syncStartup();
_("Sync was reset and server data was wiped");
do_check_eq(engine.lastSync, 0);
do_check_eq(collection.wbos.flying.payload, undefined);
do_check_eq(collection.wbos.scotsman.payload, undefined);
_("New bulk key was uploaded");
key = crypto_steam.data.keyring["http://localhost:8080/1.0/foo/storage/keys/pubkey"];
do_check_eq(key.wrapped, "fake-symmetric-key-0");
do_check_eq(key.hmac, "fake-symmetric-key-0 ");
} finally {
server.stop(function() {});
Svc.Prefs.resetBranch("");
Records.clearCache();
CryptoMetas.clearCache();
syncTesting = new SyncTestingInfrastructure(makeSteamEngine);
}
}
function test_syncStartup_failedMetaGet() {
_("SyncEngine._syncStartup non-404 failures for getting cryptometa should stop sync");
Svc.Prefs.set("clusterURL", "http://localhost:8080/");
let server = httpd_setup({
"/1.0/foo/storage/crypto/steam": function(request, response) {
response.setStatusLine(request.httpVersion, 405, "Method Not Allowed");
response.bodyOutputStream.write("Fail!", 5);
}
});
let engine = makeSteamEngine();
try {
_("Getting the cryptometa will fail and should set the appropriate failure");
let error;
try {
engine._syncStartup();
} catch (ex) {
error = ex;
}
do_check_eq(error.failureCode, ENGINE_METARECORD_DOWNLOAD_FAIL);
} finally {
server.stop(function() {});
Svc.Prefs.resetBranch("");
Records.clearCache();
syncTesting = new SyncTestingInfrastructure(makeSteamEngine);
}
}
function test_syncStartup_serverHasNewerVersion() {
_("SyncEngine._syncStartup ");