From 672975404987c048ab7c31bfc13e843c062a1a5d Mon Sep 17 00:00:00 2001 From: exromany Date: Tue, 1 Mar 2016 07:29:20 +0400 Subject: [PATCH 1/2] import db from xml file --- app/scripts/models/app-model.js | 23 ++++++++++++++ app/scripts/models/file-model.js | 24 +++++++++++++++ app/scripts/views/open-view.js | 52 ++++++++++++++++++++++++-------- app/templates/open.hbs | 4 +++ 4 files changed, 91 insertions(+), 12 deletions(-) diff --git a/app/scripts/models/app-model.js b/app/scripts/models/app-model.js index c79b91c1..9765fbc7 100644 --- a/app/scripts/models/app-model.js +++ b/app/scripts/models/app-model.js @@ -258,6 +258,13 @@ var AppModel = Backbone.Model.extend({ this.addFile(newFile); }, + importFile: function(params, callback) { + var logger = new Logger('open', params.name); + logger.info('File import request'); + logger.info('Open file from supplied content'); + this.importFileWithData(params, callback, params.fileXml); + }, + openFile: function(params, callback) { var logger = new Logger('open', params.name); logger.info('File open request'); @@ -371,6 +378,22 @@ var AppModel = Backbone.Model.extend({ }); }, + importFileWithData: function(params, callback, data) { + var file = new FileModel({ + name: params.name, + storage: params.storage, + path: params.path + }); + var that = this; + file.import(data, function(err) { + if (err) { + return callback(err); + } + that.addFile(file); + that.fileOpened(file); + }); + }, + addToLastOpenFiles: function(file, rev) { this.appLogger.debug('Add last open file', file.get('cacheId'), file.get('name'), file.get('storage'), file.get('path'), rev); var dt = new Date(); diff --git a/app/scripts/models/file-model.js b/app/scripts/models/file-model.js index acb370ce..8eca6a60 100644 --- a/app/scripts/models/file-model.js +++ b/app/scripts/models/file-model.js @@ -78,6 +78,30 @@ var FileModel = Backbone.Model.extend({ this.set({ open: true, created: true, name: name }); }, + import: function(fileXml, callback) { + try { + var ts = logger.ts(); + var password = kdbxweb.ProtectedValue.fromString(''); + var credentials = new kdbxweb.Credentials(password); + kdbxweb.Kdbx.import(fileXml, credentials, (function(db, err) { + if (err) { + logger.error('Error importing file', err.code, err.message, err); + callback(err); + } else { + this.db = db; + this.readModel(); + this.set({ open: true, created: true }); + logger.info('Imported file ' + this.get('name') + ': ' + logger.ts(ts) + ', ' + + Math.round(fileXml.byteLength / 1024) + ' kB'); + callback(); + } + }).bind(this)); + } catch (e) { + logger.error('Error importing file', e, e.code, e.message, e); + callback(e); + } + }, + openDemo: function(callback) { var password = kdbxweb.ProtectedValue.fromString('demo'); var credentials = new kdbxweb.Credentials(password); diff --git a/app/scripts/views/open-view.js b/app/scripts/views/open-view.js index f9051268..7e9ac954 100644 --- a/app/scripts/views/open-view.js +++ b/app/scripts/views/open-view.js @@ -18,6 +18,7 @@ var OpenView = Backbone.View.extend({ 'click .open__icon-open': 'openFile', 'click .open__icon-new': 'createNew', 'click .open__icon-dropbox': 'openFromDropbox', + 'click .open__icon-import': 'importFromXml', 'click .open__icon-demo': 'createDemo', 'click .open__pass-input[readonly]': 'openFile', 'input .open__pass-input': 'inputInput', @@ -123,18 +124,29 @@ var OpenView = Backbone.View.extend({ processFile: function(file, complete) { var reader = new FileReader(); reader.onload = (function(e) { - if (this.reading === 'fileData') { - this.params.id = null; - this.params.fileData = e.target.result; - this.params.name = file.name.replace(/\.\w+$/i, ''); - this.params.path = file.path || null; - this.params.storage = file.path ? 'file' : null; - this.params.rev = null; - this.displayOpenFile(); - } else { - this.params.keyFileData = e.target.result; - this.params.keyFileName = file.name; - this.displayOpenKeyFile(); + switch (this.reading) { + case 'fileData': + this.params.id = null; + this.params.fileData = e.target.result; + this.params.name = file.name.replace(/\.\w+$/i, ''); + this.params.path = file.path || null; + this.params.storage = file.path ? 'file' : null; + this.params.rev = null; + this.displayOpenFile(); + break; + case 'fileXml': + this.params.id = null; + this.params.fileXml = e.target.result; + this.params.name = file.name.replace(/\.\w+$/i, ''); + this.params.path = file.path || null; + this.params.storage = file.path ? 'file' : null; + this.params.rev = null; + this.importDb(); + break; + default: + this.params.keyFileData = e.target.result; + this.params.keyFileName = file.name; + this.displayOpenKeyFile(); } if (complete) { complete(true); @@ -179,6 +191,12 @@ var OpenView = Backbone.View.extend({ } }, + importFromXml: function() { + if (!this.busy) { + this.openAny('fileXml', 'xml'); + } + }, + openKeyFile: function(e) { if ($(e.target).hasClass('open__settings-key-file-dropbox')) { this.openKeyFileFromDropbox(); @@ -443,6 +461,16 @@ var OpenView = Backbone.View.extend({ } else { this.trigger('close'); } + }, + + importDb: function() { + if (this.busy || !this.params.name) { + return; + } + this.$el.toggleClass('open--opening', true); + this.inputEl.attr('disabled', 'disabled'); + this.busy = true; + this.afterPaint(this.model.importFile.bind(this.model, this.params, this.openDbComplete.bind(this))); } }); diff --git a/app/templates/open.hbs b/app/templates/open.hbs index e537d832..25311aee 100644 --- a/app/templates/open.hbs +++ b/app/templates/open.hbs @@ -13,6 +13,10 @@
Dropbox
+
+ +
Import from XML
+
{{res 'openDemo'}}
From d7542a44c61207e99aaa1d1c1a2425e0e4222b20 Mon Sep 17 00:00:00 2001 From: exromany Date: Wed, 2 Mar 2016 01:17:19 +0400 Subject: [PATCH 2/2] fix import --- app/scripts/models/file-model.js | 5 ++--- app/scripts/views/open-view.js | 6 +++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/scripts/models/file-model.js b/app/scripts/models/file-model.js index 8eca6a60..136d1335 100644 --- a/app/scripts/models/file-model.js +++ b/app/scripts/models/file-model.js @@ -83,7 +83,7 @@ var FileModel = Backbone.Model.extend({ var ts = logger.ts(); var password = kdbxweb.ProtectedValue.fromString(''); var credentials = new kdbxweb.Credentials(password); - kdbxweb.Kdbx.import(fileXml, credentials, (function(db, err) { + kdbxweb.Kdbx.loadXml(fileXml, credentials, (function(db, err) { if (err) { logger.error('Error importing file', err.code, err.message, err); callback(err); @@ -91,8 +91,7 @@ var FileModel = Backbone.Model.extend({ this.db = db; this.readModel(); this.set({ open: true, created: true }); - logger.info('Imported file ' + this.get('name') + ': ' + logger.ts(ts) + ', ' + - Math.round(fileXml.byteLength / 1024) + ' kB'); + logger.info('Imported file ' + this.get('name') + ': ' + logger.ts(ts)); callback(); } }).bind(this)); diff --git a/app/scripts/views/open-view.js b/app/scripts/views/open-view.js index 7e9ac954..88cca3bc 100644 --- a/app/scripts/views/open-view.js +++ b/app/scripts/views/open-view.js @@ -158,7 +158,11 @@ var OpenView = Backbone.View.extend({ complete(false); } }).bind(this); - reader.readAsArrayBuffer(file); + if (this.reading === 'fileXml') { + reader.readAsText(file); + } else { + reader.readAsArrayBuffer(file); + } }, displayOpenFile: function() {