diff --git a/src/js/dao/cloudstorage-dao.js b/src/js/dao/cloudstorage-dao.js
index 9a1613a..b46e0d1 100644
--- a/src/js/dao/cloudstorage-dao.js
+++ b/src/js/dao/cloudstorage-dao.js
@@ -6,58 +6,61 @@ app.dao.CloudStorage = function(window, $) {
'use strict';
//
- // Public Key
+ // Generic Ajax helper functions
//
/**
- * Find the user's corresponding public key
+ * GET (read) request
*/
- this.getPublicKey = function(keyId, callback) {
- var uri;
-
- uri = app.config.cloudUrl + '/publickey/key/' + keyId;
+ this.get = function(uri, callback) {
$.ajax({
url: uri,
type: 'GET',
dataType: 'json',
- success: function(key) {
- if (!key || !key._id) {
- callback({
- error: 'No public key for that user!'
- });
- return;
- }
-
- callback(null, key);
+ success: function(res) {
+ callback(null, res);
},
error: function(xhr, textStatus, err) {
callback({
- error: err,
- status: textStatus
+ errMsg: xhr.status + ': ' + xhr.statusText
});
}
});
};
/**
- * Persist the user's publc key
+ * PUT (update) request
*/
- this.putPublicKey = function(pubkey, callback) {
- var uri;
-
- uri = app.config.cloudUrl + '/publickey/user/' + pubkey.userId + '/key/' + pubkey._id;
+ this.put = function(item, uri, callback) {
$.ajax({
url: uri,
type: 'PUT',
- data: JSON.stringify(pubkey),
+ data: JSON.stringify(item),
contentType: 'application/json',
success: function() {
callback();
},
error: function(xhr, textStatus, err) {
callback({
- error: err,
- status: textStatus
+ errMsg: xhr.status + ': ' + xhr.statusText
+ });
+ }
+ });
+ };
+
+ /**
+ * DELETE (remove) request
+ */
+ this.remove = function(uri, callback) {
+ $.ajax({
+ url: uri,
+ type: 'DELETE',
+ success: function() {
+ callback();
+ },
+ error: function(xhr, textStatus, err) {
+ callback({
+ errMsg: xhr.status + ': ' + xhr.statusText
});
}
});
@@ -72,24 +75,8 @@ app.dao.CloudStorage = function(window, $) {
* @param type [String] The type of item e.g. 'email'
*/
this.putEncryptedItem = function(item, type, emailAddress, folderName, callback) {
- var uri;
-
- uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName + '/' + item.id;
- $.ajax({
- url: uri,
- type: 'PUT',
- data: JSON.stringify(item),
- contentType: 'application/json',
- success: function() {
- callback();
- },
- error: function(xhr, textStatus, err) {
- callback({
- error: err,
- status: textStatus
- });
- }
- });
+ var uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName + '/' + item.id;
+ this.put(item, uri, callback);
};
/**
@@ -97,22 +84,8 @@ app.dao.CloudStorage = function(window, $) {
* @param type [String] The type of item e.g. 'email'
*/
this.deleteEncryptedItem = function(id, type, emailAddress, folderName, callback) {
- var uri;
-
- uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName + '/' + id;
- $.ajax({
- url: uri,
- type: 'DELETE',
- success: function() {
- callback();
- },
- error: function(xhr, textStatus, err) {
- callback({
- error: err,
- status: textStatus
- });
- }
- });
+ var uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName + '/' + id;
+ this.remove(uri, callback);
};
/**
@@ -122,53 +95,93 @@ app.dao.CloudStorage = function(window, $) {
* @param num [Number] The number of items to fetch (null means fetch all)
*/
this.listEncryptedItems = function(type, emailAddress, folderName, callback) {
- var uri;
+ var uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName;
+ this.get(uri, callback);
+ };
- // fetch encrypted json objects from cloud service
- uri = app.config.cloudUrl + '/' + type + '/user/' + emailAddress + '/folder/' + folderName;
- $.ajax({
- url: uri,
- type: 'GET',
- dataType: 'json',
- success: function(list) {
- callback(null, list);
- },
- error: function(xhr, textStatus, err) {
- callback({
- error: err,
- status: textStatus
- });
+ //
+ // Public Key
+ //
+
+ /**
+ * Find the user's corresponding public key
+ */
+ this.getPublicKey = function(keyId, callback) {
+ var uri = app.config.cloudUrl + '/publickey/key/' + keyId;
+
+ this.get(uri, function(err, key) {
+ if (err) {
+ callback(err);
+ return;
}
+
+ if (!key || !key._id) {
+ callback({
+ errMsg: 'No public key for that user!'
+ });
+ return;
+ }
+
+ callback(null, key);
});
};
+ /**
+ * Persist the user's publc key
+ */
+ this.putPublicKey = function(pubkey, callback) {
+ var uri = app.config.cloudUrl + '/publickey/user/' + pubkey.userId + '/key/' + pubkey._id;
+ this.put(pubkey, uri, callback);
+ };
+
+ /**
+ * Delete the public key from the cloud storage service
+ */
+ this.removePublicKey = function(keyId, callback) {
+ var uri = app.config.cloudUrl + '/publickey/key/' + keyId;
+ this.remove(uri, callback);
+ };
+
//
// Ecrypted Private Key
//
+ /**
+ * Fetch private key by id
+ */
+ this.getPrivateKey = function(keyId, callback) {
+ var uri = app.config.cloudUrl + '/privatekey/key/' + keyId;
+ this.get(uri, function(err, key) {
+ if (err) {
+ callback(err);
+ return;
+ }
+
+ if (!key || !key._id) {
+ callback({
+ errMsg: 'No private key for that user!'
+ });
+ return;
+ }
+
+ callback(null, key);
+ });
+ };
+
/**
* Persist encrypted private key to cloud service
*/
this.putPrivateKey = function(privkey, callback) {
- // fetch user's encrypted secret key from keychain/storage
- var uri;
+ var uri = app.config.cloudUrl + '/privatekey/user/' + privkey.userId + '/key/' + privkey._id;
+ this.put(privkey, uri, callback);
+ };
- uri = app.config.cloudUrl + '/privatekey/user/' + privkey.userId + '/key/' + privkey._id;
- $.ajax({
- url: uri,
- type: 'PUT',
- data: JSON.stringify(privkey),
- contentType: 'application/json',
- success: function() {
- callback();
- },
- error: function(xhr, textStatus, err) {
- callback({
- error: err,
- status: textStatus
- });
- }
- });
+ /**
+ * Delete the private key from the cloud storage service
+ */
+ this.removePrivateKey = function(keyId, callback) {
+ var uri = app.config.cloudUrl + '/privatekey/key/' + keyId;
+ this.remove(uri, callback);
};
/**
@@ -180,32 +193,24 @@ app.dao.CloudStorage = function(window, $) {
gottenKey, uri;
uri = app.config.cloudUrl + '/privatekey/user/' + emailAddress;
- $.ajax({
- url: uri,
- type: 'GET',
- dataType: 'json',
- success: function(keys) {
- if (!keys) {
- callback({
- error: 'err',
- status: 'Key not synced!'
- });
- return;
- }
-
- // use first key, if it exists
- if (keys.length > 0) {
- gottenKey = keys[0];
- }
-
- handleKey(gottenKey, callback);
- },
- error: function(xhr, textStatus, err) {
- callback({
- error: err,
- status: textStatus
- });
+ self.get(uri, function(err, keys) {
+ if (err) {
+ callback(err);
+ return;
}
+ if (!keys) {
+ callback({
+ errMsg: 'Key not synced!'
+ });
+ return;
+ }
+
+ // use first key, if it exists
+ if (keys.length > 0) {
+ gottenKey = keys[0];
+ }
+
+ handleKey(gottenKey, callback);
});
function handleKey(fetchedKey, callback) {
diff --git a/src/js/dao/keychain-dao.js b/src/js/dao/keychain-dao.js
index 4b66529..890022e 100644
--- a/src/js/dao/keychain-dao.js
+++ b/src/js/dao/keychain-dao.js
@@ -19,12 +19,12 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
});
_.each(ids, function(i) {
- // try to read public key from local storage
- jsonDao.read('publickey_' + i._id, function(pubkey) {
- if (!pubkey) {
- // TODO: fetch from cloud storage
+ // lookup locally and in storage
+ lookupPublicKey(i._id, function(err, pubkey) {
+ if (err || !pubkey) {
callback({
- errMsg: 'Not implemented yet!'
+ errMsg: 'Error looking up public key!',
+ err: err
});
return;
}
@@ -43,6 +43,37 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
});
};
+ /**
+ * Helper function that looks for public key in local storage
+ * and then in cloud storage
+ */
+
+ function lookupPublicKey(id, callback) {
+ // lookup in local storage
+ jsonDao.read('publickey_' + id, function(pubkey) {
+ if (!pubkey) {
+ // fetch from cloud storage
+ cloudstorage.getPublicKey(id, callback);
+
+ } else {
+ callback(null, pubkey);
+ }
+ });
+ }
+
+ function lookupPrivateKey(id, callback) {
+ // lookup in local storage
+ jsonDao.read('privatekey_' + id, function(privkey) {
+ if (!privkey) {
+ // fetch from cloud storage
+ cloudstorage.getPrivateKey(id, callback);
+
+ } else {
+ callback(null, privkey);
+ }
+ });
+ }
+
/**
* Gets the local user's key either from local storage
* or fetches it from the cloud. The private key is encrypted.
@@ -53,15 +84,23 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
// lookup public key id
jsonDao.read('publickey_' + userId, function(pubkeyId) {
if (!pubkeyId || !pubkeyId._id) {
- // no public key in storage
- // TODO: fetch from cloud
+ // no public key by that id in storage
+ // TODO: find from cloud
// TODO: persist in local storage
callback();
return;
}
- // try to read public key from local storage
- jsonDao.read('publickey_' + pubkeyId._id, function(pubkey) {
+ // lookup public key in storage and cloud
+ lookupPublicKey(pubkeyId._id, function(err, pubkey) {
+ if (err || !pubkey) {
+ callback({
+ errMsg: 'Error looking up public key!',
+ err: err
+ });
+ return;
+ }
+
// public key found
// get corresponding private key
fetchEncryptedPrivateKey(pubkey);
@@ -70,21 +109,20 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
function fetchEncryptedPrivateKey(publicKey) {
// try to read private key from local storage
- jsonDao.read('privatekey_' + publicKey._id, function(privkey) {
- if (!privkey) {
- // no private key in storage
- // TODO: fetch from cloud
- // TODO: persist in local storage
+ lookupPrivateKey(publicKey._id, function(err, privkey) {
+ if (err || !privkey) {
callback({
- errMsg: 'Not implemented yet!'
- });
- } else {
- // private key found
- callback(null, {
- publicKey: publicKey,
- privateKey: privkey
+ errMsg: 'Error looking up private key!',
+ err: err
});
+ return;
}
+
+ // private key found
+ callback(null, {
+ publicKey: publicKey,
+ privateKey: privkey
+ });
});
}
};
@@ -103,8 +141,6 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
return;
}
- // TODO: persist in the cloud
-
// persist public key (email, _id)
var pkLookupKey = 'publickey_' + keypair.publicKey.userId;
jsonDao.persist(pkLookupKey, {
@@ -113,47 +149,68 @@ app.dao.KeychainDAO = function(jsonDao, cloudstorage) {
// validate result
if (res1.key !== pkLookupKey) {
callback({
- errMsg: 'Persisting went wrong!'
+ errMsg: 'Persisting public key in local storage went wrong!'
});
return;
}
- // persist public key
+ // persist public key in local storage
var pkKey = 'publickey_' + keypair.publicKey._id;
jsonDao.persist(pkKey, keypair.publicKey, function(res2) {
// validate result
if (res2.key !== pkKey) {
callback({
- errMsg: 'Persisting went wrong!'
+ errMsg: 'Persisting public key in local storage went wrong!'
});
return;
}
- // persist public key (email, _id)
- var prkLookupKey = 'privatekey_' + keypair.privateKey.userId;
- jsonDao.persist(prkLookupKey, {
- _id: keypair.privateKey._id
- }, function(res3) {
+ // perist in public key in cloud storage
+ cloudstorage.putPublicKey(keypair.publicKey, function(err) {
// validate result
- if (res3.key !== prkLookupKey) {
+ if (err) {
callback({
- errMsg: 'Persisting went wrong!'
+ errMsg: 'Persisting public key in cloud storage went wrong!'
});
return;
}
- // persist private key
- var prkKey = 'privatekey_' + keypair.privateKey._id;
- jsonDao.persist(prkKey, keypair.privateKey, function(res4) {
+ // persist private key (email, _id)
+ var prkLookupKey = 'privatekey_' + keypair.privateKey.userId;
+ jsonDao.persist(prkLookupKey, {
+ _id: keypair.privateKey._id
+ }, function(res3) {
// validate result
- if (res4.key !== prkKey) {
+ if (res3.key !== prkLookupKey) {
callback({
- errMsg: 'Persisting went wrong!'
+ errMsg: 'Persisting private key in local storage went wrong!'
});
return;
}
- callback(null);
+ // persist private key
+ var prkKey = 'privatekey_' + keypair.privateKey._id;
+ jsonDao.persist(prkKey, keypair.privateKey, function(res4) {
+ // validate result
+ if (res4.key !== prkKey) {
+ callback({
+ errMsg: 'Persisting private key in local storage went wrong!'
+ });
+ return;
+ }
+
+ cloudstorage.putPrivateKey(keypair.privateKey, function(err) {
+ // validate result
+ if (err) {
+ callback({
+ errMsg: 'Persisting private key in cloud storage went wrong!'
+ });
+ return;
+ }
+
+ callback(null);
+ });
+ });
});
});
});
diff --git a/test/integration/cloudstorage-dao-test.js b/test/integration/cloudstorage-dao-test.js
index 9a714e6..c350b57 100644
--- a/test/integration/cloudstorage-dao-test.js
+++ b/test/integration/cloudstorage-dao-test.js
@@ -2,20 +2,43 @@ module("CloudStorage DAO");
var cloudstoragedao_test = {
user: 'email.dao.it.test@mail.whiteout.io',
- password: 'hellosafe',
+ password: 'Xoza76645',
keySize: 128,
ivSize: 128,
rsaKeySize: 1024
};
asyncTest("Init", 1, function() {
+
+ // test keys
+ var pk = "-----BEGIN PUBLIC KEY-----\r\n" +
+ "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTIupLSuRD5gh6wHx1f4Q2Qv61\r\n" +
+ "trOWgqfi/eJUtheoOWkW6KGoLqo5xdklPVIqyP9702PDQtf1upwVB8MCGSiYMDyj\r\n" +
+ "Fr0XlYJnJM2ERVrSGkDNSI2+6bVq1k2TB4YeZoMVhel/igCr5Rbr8LyNswCQMIXl\r\n" +
+ "oiMEqmiN/YtLwD1z+QIDAQAB\r\n" +
+ "-----END PUBLIC KEY-----";
+ cloudstoragedao_test.keypair = {
+ publicKey: {
+ _id: "01ca6e54-a6b3-4b5f-bb43-ede30aaccc9e",
+ userId: cloudstoragedao_test.user,
+ publicKey: pk
+ },
+ privateKey: {
+ _id: "01ca6e54-a6b3-4b5f-bb43-ede30aaccc9e",
+ userId: cloudstoragedao_test.user,
+ encryptedKey: "zXBmmR7fz6sfR0AIeOzvwKOb6BrBQBgyweJ4c0LZS9h7C18SgPSMcvpSgBIwJadi577DPmwfXPl6zCNtwoqlLqD6xdS6P/bDY6rIWbaGbRrWzs/KXJ7UjWq0uyZSUFQK8w/woHkyQ4eLqdwj+duPZzrerDyi1XX8XXCcNDpDwR+1L2TxWlDzShN7IiA4OUeFsDbgqN3lKUBSHw5USnassv7nRwWlSNWPVaIlx3YT2T/VIaNoBbX5jDDwhDT4h/1fOOEbxTIBEN65mGGNW9GPLbi/PVgKibrF6l8bHwW5FjIkoYZdzgPe5nowhbFb2FB7mWX4gXMzqT3wuOP9fCOCEj4muxYkV7daedAGFRKl5mTPd9Cu+vSY+SnZX55m1yXQixn55J50AgW+aY/LXV+UqYwVObp7o5qs0B+OhQIRxH2Sp6IjRRFAqsQgBoRXS1qWPLCGVLMoSUkOSOCQd6rsr70fGXxGpguJFigAMWDXAzuPH98UFaB7kCiohhFLZ25vMhd/cOz1MXTKKPQJXfpBr8uX/hhhdsZReVfqLFKpvs1MzdFoV6FiTwZwyDyRnANYRHnqnP148q5s0JOkFcHaHqYdbLvVU6jm/B3QYJ/IO/uKyHoIhVobSSUBLzLDV0Eila9LhCdfWVXIVfFNUr5ut1YyOoJ23G5ItBSq5VFaZv79lNIhWjw/effq1IJd4eKeBe2X2DoYv85FZifAf/kUN38g0rTfAmKedsTGGhMLo+3Aa12MzRF93aTOMyKpHSA0G/5dA5PSVSlgDd/hwn4AlKzfo8M2PF1fh+9q5YtWqs4+mSOmyvYKxg9g+ZBhAvHbVBUN2emoNoJTC6JToB9jeRvksl1iehx+3C8nHUzXsxqApA3a79RJ+izRT2f0GguEAlAz4B6EozFRJwjNyRL2Fe7bgtadJxTNZfcG+oCgCFNCOyOvSgcpkjvj2DlFdPvw5BXXodV5D0jIg+OnszWcgLUDLFMkPPJgYrx9smRqdPjFnjWvnm6bRVZbxaU+FXKFvplmOG3XK1sR9g91bg5nnKDHRf6OuwBBgX0AyzOz2ohO3NVuIcppHjecUEY8t9QgezGal/R1PepW/uNPn/zJgGthTb4rK/KrXZTEsvC3XI55VlSnhORfNJvjn5Up/iusKeKXEGb/lhyc058GZY5UCmoIsV30TYgzXeuj6VZBEtcvAvza0mYmGvXf91ebVZR+",
+ iv: "XE4c3X134YNkapbeSXP6GA=="
+ }
+ };
+
// init dependencies
cloudstoragedao_test.util = new cryptoLib.Util(window, uuid);
- var jsonDao = new app.dao.LawnchairDAO(window);
+ var jsonDao = new app.dao.LawnchairDAO(Lawnchair);
cloudstoragedao_test.crypto = new app.crypto.Crypto(window, cloudstoragedao_test.util);
cloudstoragedao_test.storage = new app.dao.DeviceStorage(cloudstoragedao_test.util, cloudstoragedao_test.crypto, jsonDao, null);
cloudstoragedao_test.cloudstorage = new app.dao.CloudStorage(window, $);
- cloudstoragedao_test.emailDao = new app.dao.EmailDAO(_, cloudstoragedao_test.crypto, cloudstoragedao_test.storage, cloudstoragedao_test.cloudstorage, cloudstoragedao_test.util);
+ cloudstoragedao_test.keychain = new app.dao.KeychainDAO(jsonDao, cloudstoragedao_test.cloudstorage);
+ cloudstoragedao_test.emailDao = new app.dao.EmailDAO(_, cloudstoragedao_test.crypto, cloudstoragedao_test.storage, cloudstoragedao_test.cloudstorage, cloudstoragedao_test.util, cloudstoragedao_test.keychain);
// clear db before tests
jsonDao.clear(function(err) {
@@ -25,39 +48,8 @@ asyncTest("Init", 1, function() {
});
});
-asyncTest("Persist public key to cloud", 1, function() {
-
- // testdata
- cloudstoragedao_test.privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" +
- "MIICXAIBAAKBgQDK6H7BiPcwiRWnWDuqndw+t+3vIhSmwEEn38kPLenbd+iWb2dX\r\n" +
- "M5y5aBFIgqqHBrcZLwzhMQ10BUTcOgB6Kr3AK7lONKxZ+HD5hX6koj9X5uHtFYF1\r\n" +
- "NYkQv+5WKzHGHRFqoKityZ6AqTxgPss29s6EIOqF/dvvKMiFhgp+4JPsJQIDAQAB\r\n" +
- "AoGAQxIM7C44/zshBDrfJiueJMEpjhUm3GPKZcLMNA9KMPh20lsqvqFZ2dNzexNu\r\n" +
- "CMoIdfOef0V2m/Yt59noVHmSVL7itN4nvbTcD39UQacFiyzT7GRQjeaVAs8ZyeO5\r\n" +
- "2AXtJTNipEyvJ3TbJZCOCML/wOEvCimyHLNCMcoDvkjAbMECQQD81xbRonOZt/7E\r\n" +
- "fBHZQonaTQU/x88l8bXDHvcPfMfg4QkPO+pZ8dBQ4+IpuG60kl4TSmmme4frcJoj\r\n" +
- "jSqd54VVAkEAzXGon2gP+9ZjhbOWESpw+JXiRBytAgailnblFnCJt+o+UoXU8hwH\r\n" +
- "1D5rG2yOIO1vOiqGDQq/Bs61DsfeotvLkQJBAKo6tmZWFba9Jo5raij4n4+Wo54Z\r\n" +
- "jOJjJplEU9rdjEVfvZXAJTyBjlun0jF8tyxkD2q1gwRPz2c43M5q0PKXWjECQCl4\r\n" +
- "UO5khh1yyEIb3yX16Dn1n2faVf37suQmedXOv631RcFIrJR2ngn005AEmKgC5Znb\r\n" +
- "LZYCXk8UeK3UIJfFQFECQGkP1NPyd10Z76LR0lXeL15iP22M/OCaQUIsSi/S+idL\r\n" +
- "YCVcgDpdgVXef0NeNk6w821rlqUjseZyGGKpJ4VNywU=\r\n" +
- "-----END RSA PRIVATE KEY-----";
-
- var pk = "-----BEGIN PUBLIC KEY-----\r\n" +
- "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK6H7BiPcwiRWnWDuqndw+t+3v\r\n" +
- "IhSmwEEn38kPLenbd+iWb2dXM5y5aBFIgqqHBrcZLwzhMQ10BUTcOgB6Kr3AK7lO\r\n" +
- "NKxZ+HD5hX6koj9X5uHtFYF1NYkQv+5WKzHGHRFqoKityZ6AqTxgPss29s6EIOqF\r\n" +
- "/dvvKMiFhgp+4JPsJQIDAQAB\r\n" +
- "-----END PUBLIC KEY-----";
-
- cloudstoragedao_test.publicKey = new app.model.PublicKey({
- _id: "e91f04a2-a634-42df-a1a4-6a7f1448dbf6",
- userId: 'integration@atlasdev.onmicrosoft.com',
- publicKey: pk
- });
-
- cloudstoragedao_test.cloudstorage.putPublicKey(cloudstoragedao_test.publicKey.toJSON(), function(err) {
+asyncTest("Put public key to cloud", 1, function() {
+ cloudstoragedao_test.cloudstorage.putPublicKey(cloudstoragedao_test.keypair.publicKey, function(err) {
ok(!err, 'Persist key to cloud');
start();
@@ -65,76 +57,133 @@ asyncTest("Persist public key to cloud", 1, function() {
});
asyncTest("Get Public key from cloud", 2, function() {
- cloudstoragedao_test.cloudstorage.getPublicKey(cloudstoragedao_test.publicKey.get('_id'), function(err, data) {
+ cloudstoragedao_test.cloudstorage.getPublicKey(cloudstoragedao_test.keypair.publicKey._id, function(err, data) {
ok(!err && data && data.publicKey, 'Get public key from cloud');
- deepEqual(data, cloudstoragedao_test.publicKey.toJSON(), 'Public key is equal');
+ deepEqual(data, cloudstoragedao_test.keypair.publicKey, 'Public key is equal');
start();
});
});
-asyncTest("Sync private key from cloud", 1, function() {
- cloudstoragedao_test.cloudstorage.syncPrivateKey(cloudstoragedao_test.user, null, function(err) {
- ok(!err, 'Get/Sync key from cloud');
+asyncTest("Delete Public key from cloud", 1, function() {
+ cloudstoragedao_test.cloudstorage.removePublicKey(cloudstoragedao_test.keypair.publicKey._id, function(err) {
+ ok(!err, 'Delete public key from cloud');
start();
- }, function(fetchedKey) {
- // replace local key with cloud key
- cloudstoragedao_test.crypto.putEncryptedPrivateKey(fetchedKey);
- // whipe local storage
- cloudstoragedao_test.storage.clear(function(err) {
- ok(!err, 'DB cleared. Error status: ' + err);
-
- start();
- });
});
});
-asyncTest("Persist private key to cloud", 1, function() {
- var storedKey = cloudstoragedao_test.crypto.getEncryptedPrivateKey(cloudstoragedao_test.user);
+// asyncTest("Sync private key from cloud", 1, function() {
+// cloudstoragedao_test.cloudstorage.syncPrivateKey(cloudstoragedao_test.user, null, function(err) {
+// ok(!err, 'Get/Sync key from cloud');
- cloudstoragedao_test.cloudstorage.putPrivateKey(storedKey, function(err) {
+// start();
+// }, function(fetchedKey) {
+// // replace local key with cloud key
+// cloudstoragedao_test.crypto.putEncryptedPrivateKey(fetchedKey);
+// // whipe local storage
+// cloudstoragedao_test.storage.clear(function(err) {
+// ok(!err, 'DB cleared. Error status: ' + err);
+
+// start();
+// });
+// });
+// });
+
+asyncTest("Put private key to cloud", 1, function() {
+ cloudstoragedao_test.cloudstorage.putPrivateKey(cloudstoragedao_test.keypair.privateKey, function(err) {
ok(!err, 'Persist key to cloud');
start();
});
});
+asyncTest("Get Private key from cloud", 2, function() {
+ cloudstoragedao_test.cloudstorage.getPrivateKey(cloudstoragedao_test.keypair.privateKey._id, function(err, data) {
+ ok(!err && data && data.encryptedKey, 'Get private key from cloud');
+ deepEqual(data, cloudstoragedao_test.keypair.privateKey, 'Private key is equal');
+
+ start();
+ });
+});
+
+asyncTest("Delete Private key from cloud", 1, function() {
+ cloudstoragedao_test.cloudstorage.removePrivateKey(cloudstoragedao_test.keypair.privateKey._id, function(err) {
+ ok(!err, 'Delete private key from cloud');
+
+ start();
+ });
+});
+
+
+
+module("Keychain DAO");
+
+asyncTest("Put User Keypair", 1, function() {
+ cloudstoragedao_test.keychain.putUserKeyPair(cloudstoragedao_test.keypair, function(err) {
+ ok(!err);
+
+ start();
+ });
+});
+
+asyncTest("Get User Keypair", 2, function() {
+ cloudstoragedao_test.keychain.getUserKeyPair(cloudstoragedao_test.user, function(err, keypair) {
+ ok(!err);
+ ok(keypair && keypair.publicKey && keypair.privateKey);
+
+ start();
+ });
+});
+
+asyncTest("Get Public Keys", 2, function() {
+ var pubkeyIds = [{
+ _id: cloudstoragedao_test.keypair.publicKey._id
+ }];
+ cloudstoragedao_test.keychain.getPublicKeys(pubkeyIds, function(err, pubkeys) {
+ ok(!err);
+ deepEqual(pubkeys[0], cloudstoragedao_test.keypair.publicKey, "Fetch public key");
+
+ start();
+ });
+});
+
+
module("Email DAO");
-asyncTest("Init", 1, function() {
+// asyncTest("Init", 1, function() {
- var account = new app.model.Account({
- emailAddress: cloudstoragedao_test.user,
- symKeySize: cloudstoragedao_test.keySize,
- symIvSize: cloudstoragedao_test.ivSize,
- asymKeySize: cloudstoragedao_test.rsaKeySize
- });
+// var account = new app.model.Account({
+// emailAddress: cloudstoragedao_test.user,
+// symKeySize: cloudstoragedao_test.keySize,
+// symIvSize: cloudstoragedao_test.ivSize,
+// asymKeySize: cloudstoragedao_test.rsaKeySize
+// });
- cloudstoragedao_test.emailDao.init(account, cloudstoragedao_test.password, function(err) {
- ok(!err, 'Init complete');
+// cloudstoragedao_test.emailDao.init(account, cloudstoragedao_test.password, function(err) {
+// ok(!err, 'Init complete');
- start();
- });
-});
+// start();
+// });
+// });
-asyncTest("Send Plaintext Email item", 1, function() {
+// asyncTest("Send Plaintext Email item", 1, function() {
- var email = new app.model.Email({
- id: cloudstoragedao_test.util.UUID(),
- from: cloudstoragedao_test.user, // sender address
- to: [cloudstoragedao_test.user], // list of receivers
- subject: 'Client Email DAO Test', // Subject line
- body: 'Hello world' // plaintext body
- });
+// var email = new app.model.Email({
+// id: cloudstoragedao_test.util.UUID(),
+// from: cloudstoragedao_test.user, // sender address
+// to: [cloudstoragedao_test.user], // list of receivers
+// subject: 'Client Email DAO Test', // Subject line
+// body: 'Hello world' // plaintext body
+// });
- cloudstoragedao_test.emailDao.sendEmail(email, function(err) {
- ok(!err, 'Email sent');
+// cloudstoragedao_test.emailDao.sendEmail(email, function(err) {
+// ok(!err, 'Email sent');
- start();
- });
-});
+// start();
+// });
+// });
// asyncTest("Check virtual inbox, re-encrypt and push to cloud", 1, function() {
// cloudstoragedao_test.emailDao.checkVInbox(function(err) {
@@ -144,20 +193,20 @@ asyncTest("Send Plaintext Email item", 1, function() {
// });
// });
-asyncTest("Sync emails from cloud", 1, function() {
- cloudstoragedao_test.emailDao.syncFromCloud('inbox', function(err) {
- ok(!err, 'Synced items');
+// asyncTest("Sync emails from cloud", 1, function() {
+// cloudstoragedao_test.emailDao.syncFromCloud('inbox', function(err) {
+// ok(!err, 'Synced items');
- start();
- });
-});
+// start();
+// });
+// });
-asyncTest("List emails from cloud", 3, function() {
+// asyncTest("List emails from cloud", 3, function() {
- cloudstoragedao_test.emailDao.listItems('inbox', 0, null, function(err, collection) {
- ok(!err);
- ok(collection.length > 0, 'Read synced items');
+// cloudstoragedao_test.emailDao.listItems('inbox', 0, null, function(err, collection) {
+// ok(!err);
+// ok(collection.length > 0, 'Read synced items');
- start();
- });
-});
\ No newline at end of file
+// start();
+// });
+// });
\ No newline at end of file
diff --git a/test/integration/index.html b/test/integration/index.html
index 3a02c10..caa0391 100644
--- a/test/integration/index.html
+++ b/test/integration/index.html
@@ -48,6 +48,7 @@
+
diff --git a/test/unit/email-dao-test.js b/test/unit/email-dao-test.js
index 7f1f827..bf79d70 100644
--- a/test/unit/email-dao-test.js
+++ b/test/unit/email-dao-test.js
@@ -16,10 +16,10 @@ asyncTest("Init", 3, function() {
emaildao_test.storage = new app.dao.DeviceStorage(util, emaildao_test.crypto, jsonDao, null);
// cloud storage stub
var cloudstorageStub = {
- syncPrivateKey: function(emailAdress, storedKey, callback) {
+ putPublicKey: function(pk, callback) {
callback();
},
- putPublicKey: function(pk, callback) {
+ putPrivateKey: function(prk, callback) {
callback();
}
};
diff --git a/test/unit/keychain-dao-test.js b/test/unit/keychain-dao-test.js
index 67faa13..486cdfc 100644
--- a/test/unit/keychain-dao-test.js
+++ b/test/unit/keychain-dao-test.js
@@ -15,10 +15,10 @@ asyncTest("Init", 2, function() {
var crypto = new app.crypto.Crypto(window, util);
// cloud storage stub
var cloudstorageStub = {
- syncPrivateKey: function(emailAdress, storedKey, callback) {
+ putPublicKey: function(pk, callback) {
callback();
},
- putPublicKey: function(pk, callback) {
+ putPrivateKey: function(prk, callback) {
callback();
}
};