This commit is contained in:
Mo Bitar
2017-01-08 21:59:09 -06:00
parent ca3eff7f15
commit 5e1d045847
7 changed files with 293 additions and 156 deletions

View File

@@ -45,6 +45,11 @@ class Item {
}
}
alternateUUID() {
this.uuid = Neeto.crypto.generateUUID();
console.log("Generating new UUID", this.uuid);
}
setDirty(dirty) {
this.dirty = dirty;
@@ -101,6 +106,11 @@ class Item {
_.merge(this, _.omit(item, ["content"]));
}
allReferencedObjects() {
// must override
return null;
}
referencesAffectedBySharingChange() {
// should be overriden to determine which references should be decrypted/encrypted
return null;

View File

@@ -61,6 +61,10 @@ class Note extends Item {
return filtered;
}
allReferencedObjects() {
return this.tags;
}
referencesAffectedBySharingChange() {
return super.referencesAffectedBySharingChange();
}

View File

@@ -59,6 +59,10 @@ class Tag extends Item {
return "Tag";
}
allReferencedObjects() {
return this.notes;
}
referencesAffectedBySharingChange() {
return this.notes;
}

View File

@@ -120,16 +120,16 @@ angular.module('app.frontend')
}
this.register = function(email, password, callback) {
Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){
Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){
this.setMk(keys.mk);
keys.mk = null;
var request = Restangular.one("auth");
var params = _.merge({password: keys.pw, email: email}, keys);
var params = _.merge({password: keys.pw, email: email}, authParams);
_.merge(request, params);
request.post().then(function(response){
localStorage.setItem("jwt", response.token);
localStorage.setItem("uuid", response.uuid);
localStorage.setItem("auth_params", JSON.stringify(authParams));
localStorage.setItem("auth_params", JSON.stringify(_.omit(authParams, ["pw_nonce"])));
callback(response);
})
.catch(function(response){
@@ -216,6 +216,13 @@ angular.module('app.frontend')
this.writeAllItemsToLocalStorage(function(responseItems){
if(!this.isUserSignedIn()) {
// is not signed in
var dirtyItems = modelManager.getDirtyItems();
// delete anything needing to be deleted
dirtyItems.forEach(function(item){
if(item.deleted) {
modelManager.removeItemLocally(item);
}
}.bind(this))
modelManager.clearDirtyItems();
if(callback) {
callback();
@@ -249,6 +256,8 @@ angular.module('app.frontend')
var omitFields = ["content", "enc_item_key", "auth_hash"];
this.handleItemsResponse(response.saved_items, omitFields);
this.handleUnsavedItemsResponse(response.unsaved)
this.writeAllItemsToLocalStorage();
if(callback) {
@@ -267,6 +276,28 @@ angular.module('app.frontend')
this.syncWithOptions(callback, undefined);
}
this.handleUnsavedItemsResponse = function(unsaved) {
if(unsaved.length == 0) {
return;
}
console.log("handle unsaved", unsaved);
for(var mapping of unsaved) {
var itemResponse = mapping.item;
var item = modelManager.findItem(itemResponse.uuid);
var error = mapping.error;
if(error.tag == "uuid_conflict") {
item.alternateUUID();
item.setDirty(true);
item.allReferencedObjects().forEach(function(reference){
reference.setDirty(true);
})
}
}
this.sync(null);
}
this.handleItemsResponse = function(responseItems, omitFields) {
this.decryptItems(responseItems);
return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);
@@ -374,6 +405,11 @@ angular.module('app.frontend')
var mk = keys.mk;
try {
this.decryptItemsWithKey(data.items, mk);
// delete items enc_item_key since the user's actually key will do the encrypting once its passed off
data.items.forEach(function(item){
item.enc_item_key = null;
item.auth_hash = null;
})
onDataReady();
}
catch (e) {
@@ -454,6 +490,7 @@ angular.module('app.frontend')
localStorage.removeItem("jwt");
localStorage.removeItem("uuid");
localStorage.removeItem("syncToken");
localStorage.removeItem("auth_params");
}
this.staticifyObject = function(object) {

View File

@@ -95,11 +95,12 @@ class SNCrypto {
var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;
var pw_nonce = this.generateRandomKey();
var pw_salt = this.sha1(email + "SN" + pw_nonce);
_.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})
this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){
var pw = keys[0];
var mk = keys[1];
callback({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults);
callback({pw: pw, mk: mk}, defaults);
});
}
}