Bug 601952 - Merge fx-sync to mozilla-central. a=blocking-beta7

This commit is contained in:
Philipp von Weitershausen 2010-10-05 19:11:27 +02:00
commit f2b7562c00
8 changed files with 38 additions and 41 deletions

View File

@ -107,34 +107,12 @@ WeaveCrypto.prototype = {
Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
// Open the NSS library.
let nssfile = Services.dirsvc.get("GreD", Ci.nsILocalFile);
let os = Services.appinfo.OS;
switch (os) {
case "WINNT":
case "WINMO":
case "WINCE":
nssfile.append("nss3.dll");
break;
case "Darwin":
nssfile.append("libnss3.dylib");
break;
case "Linux":
case "SunOS":
case "WebOS": // Palm Pre
nssfile.append("libnss3.so");
break;
case "Android":
// Android uses a $GREDIR/lib/ subdir.
nssfile.append("lib");
nssfile.append("libnss3.so");
break;
default:
throw Components.Exception("unsupported platform: " + os, Cr.NS_ERROR_UNEXPECTED);
}
this.log("Using NSS library " + nssfile.path);
let path = ctypes.libraryName("nss3");
this.log("Using NSS library " + path);
// XXX really want to be able to pass specific dlopen flags here.
let nsslib = ctypes.open(nssfile.path);
let nsslib = ctypes.open(path);
this.log("Initializing NSS types and function declarations...");

View File

@ -83,7 +83,7 @@ WeaveService.prototype = {
if (resProt.hasSubstitution("services-sync"))
return;
let uri = ioService.newURI("resource://gre/modules/services-sync/",
let uri = ioService.newURI("resource:///modules/services-sync/",
null, null);
resProt.setSubstitution("services-sync", uri);
}

View File

@ -76,11 +76,11 @@ CryptoWrapper.prototype = {
this.cleartext = null;
},
decrypt: function CryptoWrapper_decrypt(passphrase) {
decrypt: function CryptoWrapper_decrypt(passphrase, keyUri) {
let pubkey = PubKeys.getDefaultKey();
let privkey = PrivKeys.get(pubkey.privateKeyUri);
let meta = CryptoMetas.get(this.encryption);
let meta = CryptoMetas.get(keyUri);
let symkey = meta.getKey(privkey, passphrase);
// Authenticate the encrypted blob with the expected HMAC

View File

@ -468,7 +468,13 @@ SyncEngine.prototype = {
handled.push(item.id);
try {
item.decrypt(ID.get("WeaveCryptoID"));
// Short-circuit the key URI to the engine's one in case the WBO's
// might be wrong due to relative URI confusions (bug 600995).
try {
item.decrypt(ID.get("WeaveCryptoID"), this.cryptoMetaURL);
} catch (ex) {
item.decrypt(ID.get("WeaveCryptoID"), item.encryption);
}
if (this._reconcile(item)) {
count.applied++;
this._tracker.ignoreAll = true;
@ -763,7 +769,7 @@ SyncEngine.prototype = {
test.sort = "newest";
test.full = true;
test.recordHandler = function(record) {
record.decrypt(ID.get("WeaveCryptoID"));
record.decrypt(ID.get("WeaveCryptoID"), this.cryptoMetaURL);
canDecrypt = true;
};

View File

@ -50,7 +50,7 @@ function PlacesItem(uri, type) {
this.type = type || "item";
}
PlacesItem.prototype = {
decrypt: function PlacesItem_decrypt(passphrase) {
decrypt: function PlacesItem_decrypt(passphrase, keyUri) {
// Do the normal CryptoWrapper decrypt, but change types before returning
let clear = CryptoWrapper.prototype.decrypt.apply(this, arguments);

View File

@ -51,7 +51,7 @@ function run_test() {
do_check_eq(checkCount, serialized.length);
_("Making sure the record still looks like it did before");
record.decrypt(passphrase);
record.decrypt(passphrase, Clients.cryptoMetaURL);
do_check_eq(record.id, "ascii");
do_check_eq(record.name, "wéävê");

View File

@ -74,9 +74,10 @@ function run_test() {
log.info("Creating a record");
let cryptoUri = "http://localhost:8080/crypto/steam";
cryptoWrap = new CryptoWrapper("http://localhost:8080/steam/resource");
cryptoWrap.encryption = "http://localhost:8080/crypto/steam";
do_check_eq(cryptoWrap.encryption, "http://localhost:8080/crypto/steam");
cryptoWrap.encryption = cryptoUri;
do_check_eq(cryptoWrap.encryption, cryptoUri);
do_check_eq(cryptoWrap.payload.encryption, "../crypto/steam");
log.info("Encrypting a record");
@ -87,7 +88,7 @@ function run_test() {
log.info("Decrypting the record");
let payload = cryptoWrap.decrypt(passphrase);
let payload = cryptoWrap.decrypt(passphrase, cryptoUri);
do_check_eq(payload.stuff, "my payload here");
do_check_neq(payload, cryptoWrap.payload); // wrap.data.payload is the encrypted one
@ -96,7 +97,7 @@ function run_test() {
cryptoWrap.cleartext.stuff = "another payload";
cryptoWrap.encrypt(passphrase);
let secondIV = cryptoWrap.IV;
payload = cryptoWrap.decrypt(passphrase);
payload = cryptoWrap.decrypt(passphrase, cryptoUri);
do_check_eq(payload.stuff, "another payload");
log.info("Make sure multiple encrypts use different IVs");
@ -107,7 +108,7 @@ function run_test() {
cryptoWrap.data.id = "other";
let error = "";
try {
cryptoWrap.decrypt(passphrase);
cryptoWrap.decrypt(passphrase, cryptoUri);
}
catch(ex) {
error = ex;
@ -119,7 +120,7 @@ function run_test() {
cryptoWrap.hmac = "foo";
error = "";
try {
cryptoWrap.decrypt(passphrase);
cryptoWrap.decrypt(passphrase, cryptoUri);
}
catch(ex) {
error = ex;

View File

@ -48,7 +48,6 @@ SteamStore.prototype = {
createRecord: function(id, uri) {
var record = new SteamRecord(uri);
record.id = id;
record.denomination = this.items[id] || "Data for new record: " + id;
return record;
},
@ -125,7 +124,7 @@ function encryptPayload(cleartext) {
cleartext = JSON.stringify(cleartext);
}
return {encryption: "http://localhost:8080/1.0/foo/storage/crypto/steam",
return {encryption: "../crypto/steam",
ciphertext: cleartext, // ciphertext == cleartext with fake crypto
IV: "irrelevant",
hmac: Utils.sha256HMAC(cleartext, null)};
@ -502,6 +501,15 @@ function test_processIncoming_createFromServer() {
'scotsman', encryptPayload({id: 'scotsman',
denomination: "Flying Scotsman"}));
// Two pathological cases involving relative URIs gone wrong.
collection.wbos['../pathological'] = new ServerWBO(
'../pathological', encryptPayload({id: '../pathological',
denomination: "Pathological Case"}));
let wrong_keyuri = encryptPayload({id: "wrong_keyuri",
denomination: "Wrong Key URI"});
wrong_keyuri.encryption = "../../crypto/steam";
collection.wbos["wrong_keyuri"] = new ServerWBO("wrong_keyuri", wrong_keyuri);
let server = sync_httpd_setup({
"/1.0/foo/storage/crypto/steam": crypto_steam.handler(),
"/1.0/foo/storage/steam": collection.handler(),
@ -520,6 +528,8 @@ function test_processIncoming_createFromServer() {
do_check_eq(engine.lastModified, null);
do_check_eq(engine._store.items.flying, undefined);
do_check_eq(engine._store.items.scotsman, undefined);
do_check_eq(engine._store.items['../pathological'], undefined);
do_check_eq(engine._store.items.wrong_keyuri, undefined);
engine._processIncoming();
@ -530,6 +540,8 @@ function test_processIncoming_createFromServer() {
// Local records have been created from the server data.
do_check_eq(engine._store.items.flying, "LNER Class A3 4472");
do_check_eq(engine._store.items.scotsman, "Flying Scotsman");
do_check_eq(engine._store.items['../pathological'], "Pathological Case");
do_check_eq(engine._store.items.wrong_keyuri, "Wrong Key URI");
} finally {
server.stop(do_test_finished);