summaryrefslogtreecommitdiffstats
path: root/net/tools/testserver
diff options
context:
space:
mode:
authorzea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-15 02:43:40 +0000
committerzea@chromium.org <zea@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-15 02:43:40 +0000
commit5d90a0a29d28df268692a34183aac47967e8030a (patch)
tree2846767f16d96bcb022b46d347120da8013dcb98 /net/tools/testserver
parentcb5d01c34cbcb79a6e49e0932dba95a83e511cd3 (diff)
downloadchromium_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.py39
-rwxr-xr-xnet/tools/testserver/chromiumsync_test.py29
-rwxr-xr-xnet/tools/testserver/testserver.py16
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):