diff options
author | zea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-15 02:43:40 +0000 |
---|---|---|
committer | zea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-15 02:43:40 +0000 |
commit | 5d90a0a29d28df268692a34183aac47967e8030a (patch) | |
tree | 2846767f16d96bcb022b46d347120da8013dcb98 /net/tools/testserver | |
parent | cb5d01c34cbcb79a6e49e0932dba95a83e511cd3 (diff) | |
download | chromium_src-5d90a0a29d28df268692a34183aac47967e8030a.zip chromium_src-5d90a0a29d28df268692a34183aac47967e8030a.tar.gz chromium_src-5d90a0a29d28df268692a34183aac47967e8030a.tar.bz2 |
[Sync] Add support for remotely enabling keystore encryption
We hook up logic to the keystore_encryption experiment to enable the
keystore encryption logic. Once the experiment is received, on the next
client restart sync will start using the keystore encryption logic.
BUG=129665
Review URL: https://chromiumcodereview.appspot.com/11266045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167829 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/tools/testserver')
-rw-r--r-- | net/tools/testserver/chromiumsync.py | 39 | ||||
-rwxr-xr-x | net/tools/testserver/chromiumsync_test.py | 29 | ||||
-rwxr-xr-x | net/tools/testserver/testserver.py | 16 |
3 files changed, 83 insertions, 1 deletions
diff --git a/net/tools/testserver/chromiumsync.py b/net/tools/testserver/chromiumsync.py index 92542e3..8e25482 100644 --- a/net/tools/testserver/chromiumsync.py +++ b/net/tools/testserver/chromiumsync.py @@ -108,6 +108,9 @@ UNIX_TIME_EPOCH = (1970, 1, 1, 0, 0, 0, 3, 1, 0) # The number of characters in the server-generated encryption key. KEYSTORE_KEY_LENGTH = 16 +# The hashed client tag for the keystore encryption experiment node. +KEYSTORE_ENCRYPTION_EXPERIMENT_TAG = "pis8ZRzh98/MKLtVEio2mr42LQA=" + class Error(Exception): """Error class for this module.""" @@ -974,6 +977,34 @@ class SyncDataModel(object): if spec.name == "Synced Bookmarks"] self._CreatePermanentItem(synced_bookmarks_spec) + def TriggerEnableKeystoreEncryption(self): + """Create the keystore_encryption experiment entity and enable it. + + A new entity within the EXPERIMENTS datatype is created with the unique + client tag "keystore_encryption" if it doesn't already exist. The + keystore_encryption message is then filled with |enabled| set to true. + """ + + experiment_id = self._ServerTagToId("google_chrome_experiments") + keystore_encryption_id = self._ClientTagToId( + EXPERIMENTS, + KEYSTORE_ENCRYPTION_EXPERIMENT_TAG) + keystore_entry = self._entries.get(keystore_encryption_id) + if keystore_entry is None: + keystore_entry = sync_pb2.SyncEntity() + keystore_entry.id_string = keystore_encryption_id + keystore_entry.name = "Keystore Encryption" + keystore_entry.client_defined_unique_tag = ( + KEYSTORE_ENCRYPTION_EXPERIMENT_TAG) + keystore_entry.folder = False + keystore_entry.deleted = False + keystore_entry.specifics.CopyFrom(GetDefaultEntitySpecifics(EXPERIMENTS)) + self._WritePosition(keystore_entry, experiment_id) + + keystore_entry.specifics.experiments.keystore_encryption.enabled = True + + self._SaveEntry(keystore_entry) + def SetInducedError(self, error, error_frequency, sync_count_before_errors): self.induced_error = error @@ -1130,6 +1161,14 @@ class TestServer(object): 200, '<html><title>Synced Bookmarks</title><H1>Synced Bookmarks</H1></html>') + def HandleEnableKeystoreEncryption(self): + """Enables the keystore encryption experiment.""" + self.account.TriggerEnableKeystoreEncryption() + return ( + 200, + '<html><title>Enable Keystore Encryption</title>' + '<H1>Enable Keystore Encryption</H1></html>') + def HandleCommand(self, query, raw_request): """Decode and handle a sync command from a raw input of bytes. diff --git a/net/tools/testserver/chromiumsync_test.py b/net/tools/testserver/chromiumsync_test.py index 7a68b40..56970b3 100755 --- a/net/tools/testserver/chromiumsync_test.py +++ b/net/tools/testserver/chromiumsync_test.py @@ -604,6 +604,35 @@ class SyncDataModelTest(unittest.TestCase): self.assertTrue(len(key1) > 0) self.assertEqual(key1, key2) + def testTriggerEnableKeystoreEncryption(self): + version1, changes, remaining = ( + self.GetChangesFromTimestamp([chromiumsync.EXPERIMENTS], 0)) + keystore_encryption_id_string = ( + self.model._ClientTagToId( + chromiumsync.EXPERIMENTS, + chromiumsync.KEYSTORE_ENCRYPTION_EXPERIMENT_TAG)) + + self.assertFalse(self.model._ItemExists(keystore_encryption_id_string)) + self.model.TriggerEnableKeystoreEncryption() + self.assertTrue(self.model._ItemExists(keystore_encryption_id_string)) + + # The creation of the experiment should be downloaded on the next + # GetUpdates. + version2, changes, remaining = ( + self.GetChangesFromTimestamp([chromiumsync.EXPERIMENTS], version1)) + self.assertEqual(len(changes), 1) + self.assertEqual(changes[0].id_string, keystore_encryption_id_string) + self.assertNotEqual(version1, version2) + + # Verify the experiment was created properly and is enabled. + self.assertEqual(chromiumsync.KEYSTORE_ENCRYPTION_EXPERIMENT_TAG, + changes[0].client_defined_unique_tag) + self.assertTrue(changes[0].HasField("specifics")) + self.assertTrue(changes[0].specifics.HasField("experiments")) + self.assertTrue( + changes[0].specifics.experiments.HasField("keystore_encryption")) + self.assertTrue( + changes[0].specifics.experiments.keystore_encryption.enabled) if __name__ == '__main__': unittest.main() diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py index 0ab49c0..4ee0b38 100755 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py @@ -1769,7 +1769,8 @@ class SyncPageHandler(BasePageHandler): self.ChromiumSyncTransientErrorOpHandler, self.ChromiumSyncErrorOpHandler, self.ChromiumSyncSyncTabFaviconsOpHandler, - self.ChromiumSyncCreateSyncedBookmarksOpHandler] + self.ChromiumSyncCreateSyncedBookmarksOpHandler, + self.ChromiumSyncEnableKeystoreEncryptionOpHandler] post_handlers = [self.ChromiumSyncCommandHandler, self.ChromiumSyncTimeHandler] @@ -1983,6 +1984,19 @@ class SyncPageHandler(BasePageHandler): self.wfile.write(raw_reply) return True + def ChromiumSyncEnableKeystoreEncryptionOpHandler(self): + test_name = "/chromiumsync/enablekeystoreencryption" + if not self._ShouldHandleRequest(test_name): + return False + result, raw_reply = ( + self.server._sync_handler.HandleEnableKeystoreEncryption()) + self.send_response(result) + self.send_header('Content-Type', 'text/html') + self.send_header('Content-Length', len(raw_reply)) + self.end_headers() + self.wfile.write(raw_reply) + return True + class OCSPHandler(BasePageHandler): def __init__(self, request, client_address, socket_server): |