1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_service_sync_remoteSetup.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,168 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +Cu.import("resource://gre/modules/Log.jsm"); 1.8 +Cu.import("resource://services-sync/constants.js"); 1.9 +Cu.import("resource://services-sync/keys.js"); 1.10 +Cu.import("resource://services-sync/service.js"); 1.11 +Cu.import("resource://services-sync/util.js"); 1.12 +Cu.import("resource://testing-common/services/sync/fakeservices.js"); 1.13 +Cu.import("resource://testing-common/services/sync/utils.js"); 1.14 + 1.15 +function run_test() { 1.16 + let logger = Log.repository.rootLogger; 1.17 + Log.repository.rootLogger.addAppender(new Log.DumpAppender()); 1.18 + 1.19 + let guidSvc = new FakeGUIDService(); 1.20 + let clients = new ServerCollection(); 1.21 + let meta_global = new ServerWBO('global'); 1.22 + 1.23 + let collectionsHelper = track_collections_helper(); 1.24 + let upd = collectionsHelper.with_updated_collection; 1.25 + let collections = collectionsHelper.collections; 1.26 + 1.27 + function wasCalledHandler(wbo) { 1.28 + let handler = wbo.handler(); 1.29 + return function() { 1.30 + wbo.wasCalled = true; 1.31 + handler.apply(this, arguments); 1.32 + }; 1.33 + } 1.34 + 1.35 + let keysWBO = new ServerWBO("keys"); 1.36 + let cryptoColl = new ServerCollection({keys: keysWBO}); 1.37 + let metaColl = new ServerCollection({global: meta_global}); 1.38 + do_test_pending(); 1.39 + 1.40 + /** 1.41 + * Handle the bulk DELETE request sent by wipeServer. 1.42 + */ 1.43 + function storageHandler(request, response) { 1.44 + do_check_eq("DELETE", request.method); 1.45 + do_check_true(request.hasHeader("X-Confirm-Delete")); 1.46 + 1.47 + _("Wiping out all collections."); 1.48 + cryptoColl.delete({}); 1.49 + clients.delete({}); 1.50 + metaColl.delete({}); 1.51 + 1.52 + let ts = new_timestamp(); 1.53 + collectionsHelper.update_collection("crypto", ts); 1.54 + collectionsHelper.update_collection("clients", ts); 1.55 + collectionsHelper.update_collection("meta", ts); 1.56 + return_timestamp(request, response, ts); 1.57 + } 1.58 + 1.59 + let server = httpd_setup({ 1.60 + "/1.1/johndoe/storage": storageHandler, 1.61 + "/1.1/johndoe/storage/crypto/keys": upd("crypto", keysWBO.handler()), 1.62 + "/1.1/johndoe/storage/crypto": upd("crypto", cryptoColl.handler()), 1.63 + "/1.1/johndoe/storage/clients": upd("clients", clients.handler()), 1.64 + "/1.1/johndoe/storage/meta/global": upd("meta", wasCalledHandler(meta_global)), 1.65 + "/1.1/johndoe/storage/meta": upd("meta", wasCalledHandler(metaColl)), 1.66 + "/1.1/johndoe/info/collections": collectionsHelper.handler 1.67 + }); 1.68 + 1.69 + try { 1.70 + _("Log in."); 1.71 + ensureLegacyIdentityManager(); 1.72 + Service.serverURL = server.baseURI; 1.73 + 1.74 + _("Checking Status.sync with no credentials."); 1.75 + Service.verifyAndFetchSymmetricKeys(); 1.76 + do_check_eq(Service.status.sync, CREDENTIALS_CHANGED); 1.77 + do_check_eq(Service.status.login, LOGIN_FAILED_NO_PASSPHRASE); 1.78 + 1.79 + _("Log in with an old secret phrase, is upgraded to Sync Key."); 1.80 + Service.login("johndoe", "ilovejane", "my old secret phrase!!1!"); 1.81 + _("End of login"); 1.82 + do_check_true(Service.isLoggedIn); 1.83 + do_check_true(Utils.isPassphrase(Service.identity.syncKey)); 1.84 + let syncKey = Service.identity.syncKey; 1.85 + Service.startOver(); 1.86 + 1.87 + Service.serverURL = server.baseURI; 1.88 + Service.login("johndoe", "ilovejane", syncKey); 1.89 + do_check_true(Service.isLoggedIn); 1.90 + 1.91 + _("Checking that remoteSetup returns true when credentials have changed."); 1.92 + Service.recordManager.get(Service.metaURL).payload.syncID = "foobar"; 1.93 + do_check_true(Service._remoteSetup()); 1.94 + 1.95 + _("Do an initial sync."); 1.96 + let beforeSync = Date.now()/1000; 1.97 + Service.sync(); 1.98 + 1.99 + _("Checking that remoteSetup returns true."); 1.100 + do_check_true(Service._remoteSetup()); 1.101 + 1.102 + _("Verify that the meta record was uploaded."); 1.103 + do_check_eq(meta_global.data.syncID, Service.syncID); 1.104 + do_check_eq(meta_global.data.storageVersion, STORAGE_VERSION); 1.105 + do_check_eq(meta_global.data.engines.clients.version, Service.clientsEngine.version); 1.106 + do_check_eq(meta_global.data.engines.clients.syncID, Service.clientsEngine.syncID); 1.107 + 1.108 + _("Set the collection info hash so that sync() will remember the modified times for future runs."); 1.109 + collections.meta = Service.clientsEngine.lastSync; 1.110 + collections.clients = Service.clientsEngine.lastSync; 1.111 + Service.sync(); 1.112 + 1.113 + _("Sync again and verify that meta/global wasn't downloaded again"); 1.114 + meta_global.wasCalled = false; 1.115 + Service.sync(); 1.116 + do_check_false(meta_global.wasCalled); 1.117 + 1.118 + _("Fake modified records. This will cause a redownload, but not reupload since it hasn't changed."); 1.119 + collections.meta += 42; 1.120 + meta_global.wasCalled = false; 1.121 + 1.122 + let metaModified = meta_global.modified; 1.123 + 1.124 + Service.sync(); 1.125 + do_check_true(meta_global.wasCalled); 1.126 + do_check_eq(metaModified, meta_global.modified); 1.127 + 1.128 + _("Checking bad passphrases."); 1.129 + let pp = Service.identity.syncKey; 1.130 + Service.identity.syncKey = "notvalid"; 1.131 + do_check_false(Service.verifyAndFetchSymmetricKeys()); 1.132 + do_check_eq(Service.status.sync, CREDENTIALS_CHANGED); 1.133 + do_check_eq(Service.status.login, LOGIN_FAILED_INVALID_PASSPHRASE); 1.134 + Service.identity.syncKey = pp; 1.135 + do_check_true(Service.verifyAndFetchSymmetricKeys()); 1.136 + 1.137 + // changePassphrase wipes our keys, and they're regenerated on next sync. 1.138 + _("Checking changed passphrase."); 1.139 + let existingDefault = Service.collectionKeys.keyForCollection(); 1.140 + let existingKeysPayload = keysWBO.payload; 1.141 + let newPassphrase = "bbbbbabcdeabcdeabcdeabcdea"; 1.142 + Service.changePassphrase(newPassphrase); 1.143 + 1.144 + _("Local key cache is full, but different."); 1.145 + do_check_true(!!Service.collectionKeys._default); 1.146 + do_check_false(Service.collectionKeys._default.equals(existingDefault)); 1.147 + 1.148 + _("Server has new keys."); 1.149 + do_check_true(!!keysWBO.payload); 1.150 + do_check_true(!!keysWBO.modified); 1.151 + do_check_neq(keysWBO.payload, existingKeysPayload); 1.152 + 1.153 + // Try to screw up HMAC calculation. 1.154 + // Re-encrypt keys with a new random keybundle, and upload them to the 1.155 + // server, just as might happen with a second client. 1.156 + _("Attempting to screw up HMAC by re-encrypting keys."); 1.157 + let keys = Service.collectionKeys.asWBO(); 1.158 + let b = new BulkKeyBundle("hmacerror"); 1.159 + b.generateRandom(); 1.160 + collections.crypto = keys.modified = 100 + (Date.now()/1000); // Future modification time. 1.161 + keys.encrypt(b); 1.162 + keys.upload(Service.resource(Service.cryptoKeysURL)); 1.163 + 1.164 + do_check_false(Service.verifyAndFetchSymmetricKeys()); 1.165 + do_check_eq(Service.status.login, LOGIN_FAILED_INVALID_PASSPHRASE); 1.166 + 1.167 + } finally { 1.168 + Svc.Prefs.resetBranch(""); 1.169 + server.stop(do_test_finished); 1.170 + } 1.171 +}