mirror of https://github.com/keeweb/keeweb.git
switch to new kdbx api
This commit is contained in:
parent
fd8028e752
commit
6ce1789953
|
@ -113,12 +113,14 @@ module.exports = function(grunt) {
|
|||
node: {
|
||||
console: false,
|
||||
process: false,
|
||||
crypto: false,
|
||||
Buffer: false,
|
||||
__filename: false,
|
||||
__dirname: false
|
||||
},
|
||||
externals: {
|
||||
xmldom: 'null'
|
||||
xmldom: 'null',
|
||||
crypto: 'null'
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -154,9 +154,9 @@ var EntryModel = Backbone.Model.extend({
|
|||
|
||||
_attachmentsToModel: function(binaries) {
|
||||
var att = [];
|
||||
_.forEach(binaries, function(data, title) {
|
||||
_.forEach(binaries, (data, title) => {
|
||||
if (data && data.ref) {
|
||||
data = this.file.db.meta.binaries[data.ref];
|
||||
data = data.value;
|
||||
}
|
||||
if (data) {
|
||||
att.push(AttachmentModel.fromAttachment({data: data, title: title}));
|
||||
|
@ -407,16 +407,10 @@ var EntryModel = Backbone.Model.extend({
|
|||
|
||||
addAttachment: function(name, data) {
|
||||
this._entryModified();
|
||||
var binaryId;
|
||||
for (var i = 0; ; i++) {
|
||||
if (!this.file.db.meta.binaries[i]) {
|
||||
binaryId = i.toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.file.db.meta.binaries[binaryId] = data;
|
||||
this.entry.binaries[name] = { ref: binaryId };
|
||||
this._fillByEntry();
|
||||
return this.file.db.createBinary(data).then(binaryRef => {
|
||||
this.entry.binaries[name] = binaryRef;
|
||||
this._fillByEntry();
|
||||
});
|
||||
},
|
||||
|
||||
removeAttachment: function(name) {
|
||||
|
|
|
@ -50,15 +50,9 @@ var FileModel = Backbone.Model.extend({
|
|||
try {
|
||||
var credentials = new kdbxweb.Credentials(password, keyFileData);
|
||||
var ts = logger.ts();
|
||||
kdbxweb.Kdbx.load(fileData, credentials, (db, err) => {
|
||||
if (err) {
|
||||
if (err.code === kdbxweb.Consts.ErrorCodes.InvalidKey && password && !password.byteLength) {
|
||||
logger.info('Error opening file with empty password, try to open with null password');
|
||||
return this.open(null, fileData, keyFileData, callback);
|
||||
}
|
||||
logger.error('Error opening file', err.code, err.message, err);
|
||||
callback(err);
|
||||
} else {
|
||||
|
||||
kdbxweb.Kdbx.load(fileData, credentials)
|
||||
.then(db => {
|
||||
this.db = db;
|
||||
this.readModel();
|
||||
this.setOpenFile({ passwordLength: password ? password.textLength : 0 });
|
||||
|
@ -68,8 +62,15 @@ var FileModel = Backbone.Model.extend({
|
|||
logger.info('Opened file ' + this.get('name') + ': ' + logger.ts(ts) + ', ' +
|
||||
db.header.keyEncryptionRounds + ' rounds, ' + Math.round(fileData.byteLength / 1024) + ' kB');
|
||||
callback();
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
if (err.code === kdbxweb.Consts.ErrorCodes.InvalidKey && password && !password.byteLength) {
|
||||
logger.info('Error opening file with empty password, try to open with null password');
|
||||
return this.open(null, fileData, keyFileData, callback);
|
||||
}
|
||||
logger.error('Error opening file', err.code, err.message, err);
|
||||
callback(err);
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error('Error opening file', e, e.code, e.message, e);
|
||||
callback(e);
|
||||
|
@ -90,18 +91,18 @@ var FileModel = Backbone.Model.extend({
|
|||
var ts = logger.ts();
|
||||
var password = kdbxweb.ProtectedValue.fromString('');
|
||||
var credentials = new kdbxweb.Credentials(password);
|
||||
kdbxweb.Kdbx.loadXml(fileXml, credentials, (db, err) => {
|
||||
if (err) {
|
||||
logger.error('Error importing file', err.code, err.message, err);
|
||||
callback(err);
|
||||
} else {
|
||||
kdbxweb.Kdbx.loadXml(fileXml, credentials)
|
||||
.then(db => {
|
||||
this.db = db;
|
||||
this.readModel();
|
||||
this.set({ open: true, created: true });
|
||||
logger.info('Imported file ' + this.get('name') + ': ' + logger.ts(ts));
|
||||
callback();
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error importing file', err.code, err.message, err);
|
||||
callback(err);
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error('Error importing file', e, e.code, e.message, e);
|
||||
callback(e);
|
||||
|
@ -112,13 +113,14 @@ var FileModel = Backbone.Model.extend({
|
|||
var password = kdbxweb.ProtectedValue.fromString('demo');
|
||||
var credentials = new kdbxweb.Credentials(password);
|
||||
var demoFile = kdbxweb.ByteUtils.arrayToBuffer(kdbxweb.ByteUtils.base64ToBytes(demoFileData));
|
||||
kdbxweb.Kdbx.load(demoFile, credentials, db => {
|
||||
this.db = db;
|
||||
this.set('name', 'Demo');
|
||||
this.readModel();
|
||||
this.setOpenFile({passwordLength: 4, demo: true});
|
||||
callback();
|
||||
});
|
||||
kdbxweb.Kdbx.load(demoFile, credentials)
|
||||
.then(db => {
|
||||
this.db = db;
|
||||
this.set('name', 'Demo');
|
||||
this.readModel();
|
||||
this.setOpenFile({passwordLength: 4, demo: true});
|
||||
callback();
|
||||
});
|
||||
},
|
||||
|
||||
setOpenFile: function(props) {
|
||||
|
@ -191,49 +193,57 @@ var FileModel = Backbone.Model.extend({
|
|||
},
|
||||
|
||||
mergeOrUpdate: function(fileData, remoteKey, callback) {
|
||||
var credentials;
|
||||
let credentials;
|
||||
let credentialsPromise = Promise.resolve();
|
||||
if (remoteKey) {
|
||||
credentials = new kdbxweb.Credentials(kdbxweb.ProtectedValue.fromString(''));
|
||||
if (remoteKey.password) {
|
||||
credentials.setPassword(remoteKey.password);
|
||||
} else {
|
||||
credentials.passwordHash = this.db.credentials.passwordHash;
|
||||
}
|
||||
if (remoteKey.keyFileName) {
|
||||
if (remoteKey.keyFileData) {
|
||||
credentials.setKeyFile(remoteKey.keyFileData);
|
||||
credentialsPromise = credentials.ready.then(() => {
|
||||
let promises = [];
|
||||
if (remoteKey.password) {
|
||||
promises.push(credentials.setPassword(remoteKey.password));
|
||||
} else {
|
||||
credentials.keyFileHash = this.db.credentials.keyFileHash;
|
||||
credentials.passwordHash = this.db.credentials.passwordHash;
|
||||
}
|
||||
}
|
||||
if (remoteKey.keyFileName) {
|
||||
if (remoteKey.keyFileData) {
|
||||
promises.push(credentials.setKeyFile(remoteKey.keyFileData));
|
||||
} else {
|
||||
credentials.keyFileHash = this.db.credentials.keyFileHash;
|
||||
}
|
||||
}
|
||||
credentialsPromise = Promise.all(promises);
|
||||
});
|
||||
} else {
|
||||
credentials = this.db.credentials;
|
||||
}
|
||||
kdbxweb.Kdbx.load(fileData, credentials, (remoteDb, err) => {
|
||||
if (err) {
|
||||
logger.error('Error opening file to merge', err.code, err.message, err);
|
||||
} else {
|
||||
if (this.get('modified')) {
|
||||
try {
|
||||
if (remoteKey && remoteDb.meta.keyChanged > this.db.meta.keyChanged) {
|
||||
this.db.credentials = remoteDb.credentials;
|
||||
this.set('keyFileName', remoteKey.keyFileName || '');
|
||||
if (remoteKey.password) {
|
||||
this.set('passwordLength', remoteKey.password.textLength);
|
||||
credentialsPromise.then(() => {
|
||||
kdbxweb.Kdbx.load(fileData, credentials)
|
||||
.then(remoteDb => {
|
||||
if (this.get('modified')) {
|
||||
try {
|
||||
if (remoteKey && remoteDb.meta.keyChanged > this.db.meta.keyChanged) {
|
||||
this.db.credentials = remoteDb.credentials;
|
||||
this.set('keyFileName', remoteKey.keyFileName || '');
|
||||
if (remoteKey.password) {
|
||||
this.set('passwordLength', remoteKey.password.textLength);
|
||||
}
|
||||
}
|
||||
this.db.merge(remoteDb);
|
||||
} catch (e) {
|
||||
logger.error('File merge error', e);
|
||||
return callback(e);
|
||||
}
|
||||
this.db.merge(remoteDb);
|
||||
} catch (e) {
|
||||
logger.error('File merge error', e);
|
||||
return callback(e);
|
||||
} else {
|
||||
this.db = remoteDb;
|
||||
}
|
||||
} else {
|
||||
this.db = remoteDb;
|
||||
}
|
||||
this.set('dirty', true);
|
||||
this.reload();
|
||||
}
|
||||
callback(err);
|
||||
this.set('dirty', true);
|
||||
this.reload();
|
||||
callback();
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error opening file to merge', err.code, err.message, err);
|
||||
callback(err);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -312,16 +322,19 @@ var FileModel = Backbone.Model.extend({
|
|||
binaries: true
|
||||
});
|
||||
this.db.cleanup({ binaries: true });
|
||||
this.db.save((data, err) => {
|
||||
if (err) {
|
||||
this.db.save()
|
||||
.then(data => {
|
||||
cb(data);
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error('Error saving file', this.get('name'), err);
|
||||
}
|
||||
cb(data, err);
|
||||
});
|
||||
cb(undefined, err);
|
||||
});
|
||||
},
|
||||
|
||||
getXml: function(cb) {
|
||||
this.db.saveXml(cb);
|
||||
this.db.saveXml()
|
||||
.then(xml => { cb(xml); });
|
||||
},
|
||||
|
||||
getKeyFileHash: function() {
|
||||
|
|
|
@ -619,8 +619,9 @@ var DetailsView = Backbone.View.extend({
|
|||
},
|
||||
|
||||
addAttachment: function(name, data) {
|
||||
this.model.addAttachment(name, data);
|
||||
this.entryUpdated();
|
||||
this.model.addAttachment(name, data).then(() => {
|
||||
this.entryUpdated();
|
||||
});
|
||||
},
|
||||
|
||||
deleteKeyPress: function(e) {
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
"bourbon": "4.2.7",
|
||||
"dropbox": "keeweb/dropbox-js#0ac0efdc2711eece73f6ac044459e1fd0d5e9390",
|
||||
"font-awesome": "4.6.3",
|
||||
"kdbxweb": "0.4.6",
|
||||
"kdbxweb": "b1ad6e6bd71e428ed7ac7ea26db156de4e4e3307",
|
||||
"normalize.css": "4.2.0",
|
||||
"pikaday": "1.4.0",
|
||||
"FileSaver.js": "eligrey/FileSaver.js",
|
||||
|
|
Loading…
Reference in New Issue