1
0
mirror of https://github.com/moparisthebest/mail synced 2024-08-13 16:43:47 -04:00
mail/src/js/dao/cloudstorage-dao.js

244 lines
5.3 KiB
JavaScript
Raw Normal View History

2013-04-02 09:02:57 -04:00
/**
* High level storage api for handling syncing of data to
* and from the cloud.
*/
app.dao.CloudStorage = function(window, $) {
'use strict';
2013-03-13 11:58:46 -04:00
//
// Public Key
//
/**
* Find the user's corresponding public key
*/
this.getPublicKey = function(keyId, callback) {
var uri;
uri = app.config.cloudUrl + '/publickey/key/' + keyId;
$.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);
},
error: function(xhr, textStatus, err) {
callback({
error: err,
status: textStatus
});
}
});
};
/**
* Persist the user's publc key
*/
this.putPublicKey = function(pubkey, callback) {
var uri;
uri = app.config.cloudUrl + '/publickey/user/' + pubkey.userId + '/key/' + pubkey._id;
$.ajax({
url: uri,
type: 'PUT',
data: JSON.stringify(pubkey),
contentType: 'application/json',
success: function() {
callback();
},
error: function(xhr, textStatus, err) {
callback({
error: err,
status: textStatus
});
}
});
};
//
// Encrypted Mail storage
//
/**
* Pushes an encrypted item to the user's cloud storage
* @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
});
}
});
};
2013-04-23 10:35:01 -04:00
/**
* Delete an encrypted item from the cloud
* @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
});
}
});
};
2013-03-13 11:58:46 -04:00
/**
2013-04-02 09:02:57 -04:00
* Lists the encrypted items
* @param type [String] The type of item e.g. 'email'
* @param offset [Number] The offset of items to fetch (0 is the last stored item)
* @param num [Number] The number of items to fetch (null means fetch all)
2013-03-13 11:58:46 -04:00
*/
2013-04-02 09:02:57 -04:00
this.listEncryptedItems = function(type, emailAddress, folderName, callback) {
var uri;
2013-03-13 11:58:46 -04:00
2013-04-02 09:02:57 -04:00
// 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);
2013-04-02 09:02:57 -04:00
},
error: function(xhr, textStatus, err) {
callback({
error: err,
status: textStatus
});
}
});
};
//
2013-05-18 22:00:53 -04:00
// Ecrypted Private Key
//
2013-04-02 09:02:57 -04:00
/**
2013-05-18 22:00:53 -04:00
* Persist encrypted private key to cloud service
2013-04-02 09:02:57 -04:00
*/
2013-05-18 22:00:53 -04:00
this.putPrivateKey = function(privkey, callback) {
2013-04-02 09:02:57 -04:00
// fetch user's encrypted secret key from keychain/storage
2013-05-18 22:00:53 -04:00
var uri;
2013-03-13 11:58:46 -04:00
2013-05-18 22:00:53 -04:00
uri = app.config.cloudUrl + '/privatekey/user/' + privkey.userId + '/key/' + privkey._id;
2013-04-02 09:02:57 -04:00
$.ajax({
url: uri,
2013-04-02 09:02:57 -04:00
type: 'PUT',
2013-05-18 22:00:53 -04:00
data: JSON.stringify(privkey),
2013-04-02 09:02:57 -04:00
contentType: 'application/json',
success: function() {
callback();
},
error: function(xhr, textStatus, err) {
callback({
error: err,
status: textStatus
});
}
});
};
2013-03-13 11:58:46 -04:00
2013-04-02 09:02:57 -04:00
/**
2013-05-18 22:00:53 -04:00
* Sync encrypted private key from cloud service
2013-04-02 09:02:57 -04:00
*/
2013-05-18 22:00:53 -04:00
this.syncPrivateKey = function(emailAddress, storedkey, callback, replaceCallback) {
2013-04-02 09:02:57 -04:00
// fetch user's encrypted secret key from keychain/storage
var self = this,
gottenKey, uri;
2013-05-18 22:00:53 -04:00
uri = app.config.cloudUrl + '/privatekey/user/' + emailAddress;
2013-04-02 09:02:57 -04:00
$.ajax({
url: uri,
2013-04-02 09:02:57 -04:00
type: 'GET',
dataType: 'json',
success: function(keys) {
if (!keys) {
callback({
error: 'err',
status: 'Key not synced!'
});
return;
2013-04-02 09:02:57 -04:00
}
// use first key, if it exists
if (keys.length > 0) {
gottenKey = keys[0];
}
handleKey(gottenKey, callback);
2013-04-02 09:02:57 -04:00
},
error: function(xhr, textStatus, err) {
callback({
error: err,
status: textStatus
});
}
});
function handleKey(fetchedKey, callback) {
2013-05-18 22:00:53 -04:00
if ((!storedkey || !storedkey.encryptedKey) && fetchedKey && fetchedKey.encryptedKey) {
// no local key... persist fetched key
2013-05-18 22:00:53 -04:00
replaceCallback(fetchedKey);
2013-05-18 22:00:53 -04:00
} else if (!fetchedKey && storedkey && storedkey.encryptedKey) {
// no key in cloud... push local key to cloud
2013-05-18 22:00:53 -04:00
self.putPrivateKey(storedkey, callback);
2013-05-18 22:00:53 -04:00
} else if (storedkey && fetchedKey && (storedkey.encryptedKey !== fetchedKey.encryptedKey || storedkey.iv !== fetchedKey.iv)) {
// local and fetched keys are not equal
if (window.confirm('Swap local key?')) {
// replace local key with fetched key
2013-05-18 22:00:53 -04:00
replaceCallback(fetchedKey);
} else {
if (window.confirm('Swap cloud key?')) {
// upload local key to cloud
2013-05-18 22:00:53 -04:00
self.putPrivateKey(emailAddress, callback);
} else {
callback({
error: 'err',
status: 'Key not synced!'
});
}
}
} else {
// local and cloud keys are equal
callback();
}
}
2013-03-13 11:58:46 -04:00
};
2013-04-02 09:02:57 -04:00
};