From 6c930f9ac6513132195caf2c4f96c4257947d001 Mon Sep 17 00:00:00 2001 From: antelle Date: Sat, 19 Mar 2016 15:43:50 +0300 Subject: [PATCH] encrypt stored webdav password --- app/scripts/models/app-model.js | 21 +++++++++++++++++--- app/scripts/storage/storage-webdav.js | 28 +++++++++++++++++++++++++++ app/scripts/views/open-view.js | 2 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/scripts/models/app-model.js b/app/scripts/models/app-model.js index ba94fd41..96a12209 100644 --- a/app/scripts/models/app-model.js +++ b/app/scripts/models/app-model.js @@ -379,7 +379,6 @@ var AppModel = Backbone.Model.extend({ name: params.name, storage: params.storage, path: params.path, - opts: params.opts, keyFileName: params.keyFileName }); var that = this; @@ -408,6 +407,7 @@ var AppModel = Backbone.Model.extend({ Storage.cache.save(cacheId, null, params.fileData); } var rev = params.rev || fileInfo && fileInfo.get('rev'); + that.setFileOpts(file, params.opts); that.addToLastOpenFiles(file, rev); that.addFile(file); that.fileOpened(file); @@ -442,7 +442,7 @@ var AppModel = Backbone.Model.extend({ name: file.get('name'), storage: file.get('storage'), path: file.get('path'), - opts: file.get('opts'), + opts: this.getStoreOpts(file), modified: file.get('modified'), editState: file.getLocalEditState(), rev: rev, @@ -460,6 +460,21 @@ var AppModel = Backbone.Model.extend({ this.fileInfos.save(); }, + getStoreOpts: function(file) { + var opts = file.get('opts'), storage = file.get('storage'); + if (Storage[storage]&& Storage[storage].fileOptsToStoreOpts && opts) { + return Storage[storage].fileOptsToStoreOpts(opts, file); + } + return null; + }, + + setFileOpts: function(file, opts) { + var storage = file.get('storage'); + if (Storage[storage]&& Storage[storage].storeOptsToFileOpts && opts) { + file.set('opts', Storage[storage].storeOptsToFileOpts(opts)); + } + }, + fileOpened: function(file) { var that = this; if (file.get('storage') === 'file') { @@ -514,7 +529,7 @@ var AppModel = Backbone.Model.extend({ name: file.get('name'), storage: file.get('storage'), path: file.get('path'), - opts: file.get('opts'), + opts: this.getStoreOpts(file), modified: file.get('modified'), editState: null, rev: null, diff --git a/app/scripts/storage/storage-webdav.js b/app/scripts/storage/storage-webdav.js index a96163c0..4fffb57c 100644 --- a/app/scripts/storage/storage-webdav.js +++ b/app/scripts/storage/storage-webdav.js @@ -102,6 +102,34 @@ var StorageWebDav = { }); }, + fileOptsToStoreOpts: function(opts, file) { + var result = {user: opts.user, encpass: opts.encpass}; + if (opts.password) { + var fileId = file.get('id'); + var password = opts.password; + var encpass = ''; + for (var i = 0; i < password.length; i++) { + encpass += String.fromCharCode(password.charCodeAt(i) ^ fileId.charCodeAt(i % fileId.length)); + } + result.encpass = btoa(encpass); + } + return result; + }, + + storeOptsToFileOpts: function(opts, file) { + var result = {user: opts.user, password: opts.password}; + if (opts.encpass) { + var fileId = file.get('id'); + var encpass = atob(opts.encpass); + var password = ''; + for (var i = 0; i < encpass.length; i++) { + password += String.fromCharCode(encpass.charCodeAt(i) ^ fileId.charCodeAt(i % fileId.length)); + } + opts.password = password; + } + return result; + }, + _request: function(config, callback) { if (config.rev) { logger.debug(config.op, config.path, config.rev); diff --git a/app/scripts/views/open-view.js b/app/scripts/views/open-view.js index 98bdaf3a..c65c303b 100644 --- a/app/scripts/views/open-view.js +++ b/app/scripts/views/open-view.js @@ -600,7 +600,7 @@ var OpenView = Backbone.View.extend({ var storage = Storage[config.storage]; this.storageWaitId = Math.random(); var path = config.path; - var opts = _.omit(config, 'path'); + var opts = _.omit(config, ['path', 'storage']); var req = { waitId: this.storageWaitId, storage: config.storage,