From 8fc4fec3c2899ddf7733babeae53c2a41293c233 Mon Sep 17 00:00:00 2001 From: Antelle Date: Sun, 14 Feb 2016 15:05:31 +0300 Subject: [PATCH] fix #75: option to lock on password copy --- app/scripts/const/timeouts.js | 3 +- app/scripts/models/app-settings-model.js | 1 + app/scripts/util/locale.js | 5 +- app/scripts/views/details/details-view.js | 48 ++++++++++++------- app/scripts/views/fields/field-view.js | 16 ++++++- .../views/settings/settings-general-view.js | 7 +++ app/templates/settings/settings-general.hbs | 5 ++ release-notes.md | 1 + 8 files changed, 64 insertions(+), 22 deletions(-) diff --git a/app/scripts/const/timeouts.js b/app/scripts/const/timeouts.js index 64087f6c..d10a1d50 100644 --- a/app/scripts/const/timeouts.js +++ b/app/scripts/const/timeouts.js @@ -4,7 +4,8 @@ var Timeouts = { AutoSync: 30 * 1000 * 60, CopyTip: 1500, AutoHideHint: 3000, - FileChangeSync: 3000 + FileChangeSync: 3000, + BeforeAutoLock: 300 }; module.exports = Timeouts; diff --git a/app/scripts/models/app-settings-model.js b/app/scripts/models/app-settings-model.js index 9cba9db03..dc2373d0 100644 --- a/app/scripts/models/app-settings-model.js +++ b/app/scripts/models/app-settings-model.js @@ -19,6 +19,7 @@ var AppSettingsModel = Backbone.Model.extend({ tableView: false, colorfulIcons: false, lockOnMinimize: true, + lockOnCopy: false, helpTipCopyShown: false }, diff --git a/app/scripts/util/locale.js b/app/scripts/util/locale.js index 2f95cacb..aa45298e 100644 --- a/app/scripts/util/locale.js +++ b/app/scripts/util/locale.js @@ -146,8 +146,8 @@ var Locale = { detDelFromTrash: 'Delete from trash?', detDelFromTrashBody: 'You will not be able to put it back.', detDelFromTrashBodyHint: 'To quickly remove all items from trash, click empty icon in Trash menu.', - detPassCopied: 'Password copied', - detPassCopiedTime: 'Password copied for {} seconds', + detFieldCopied: 'Copied', + detFieldCopiedTime: 'Copied for {} seconds', detCopyHint: 'You can copy field value with click on its title', appSecWarn: 'Not Secure!', @@ -213,6 +213,7 @@ var Locale = { setGenClearMinute: 'In a minute', setGenMinInstead: 'Minimize app instead of close', setGenLockMinimize: 'Auto-lock on minimize', + setGenLockCopy: 'Auto-lock on password copy', setGenAdvanced: 'Advanced', setGenDevTools: 'Show dev tools', diff --git a/app/scripts/views/details/details-view.js b/app/scripts/views/details/details-view.js index 40a3be0b..1cb8fc0b 100644 --- a/app/scripts/views/details/details-view.js +++ b/app/scripts/views/details/details-view.js @@ -34,7 +34,7 @@ var DetailsView = Backbone.View.extend({ views: null, passEditView: null, addNewFieldView: null, - passCopyTip: null, + fieldCopyTip: null, events: { 'click .details__colors-popup-item': 'selectColor', @@ -71,9 +71,9 @@ var DetailsView = Backbone.View.extend({ removeFieldViews: function() { this.fieldViews.forEach(function(fieldView) { fieldView.remove(); }); this.fieldViews = []; - if (this.passCopyTip) { - this.passCopyTip.hide(); - this.passCopyTip = null; + if (this.fieldCopyTip) { + this.fieldCopyTip.hide(); + this.fieldCopyTip = null; } }, @@ -159,6 +159,7 @@ var DetailsView = Backbone.View.extend({ this.fieldViews.forEach(function(fieldView) { fieldView.setElement(fieldView.readonly ? fieldsAsideEl : fieldsMainEl).render(); fieldView.on('change', this.fieldChanged.bind(this)); + fieldView.on('copy', this.fieldCopied.bind(this)); }, this); }, @@ -277,19 +278,8 @@ var DetailsView = Backbone.View.extend({ CopyPaste.createHiddenInput(password); } var copyRes = CopyPaste.copy(password); - if (copyRes && !this.passCopyTip) { - var passLabel = this.passEditView.labelEl; - var clipboardTime = copyRes.seconds; - var msg = clipboardTime ? Locale.detPassCopiedTime.replace('{}', clipboardTime) - : Locale.detPassCopied; - var tip = new Tip(passLabel, { title: msg, placement: 'right', fast: true }); - this.passCopyTip = tip; - tip.show(); - var that = this; - setTimeout(function() { - tip.hide(); - that.passCopyTip = null; - }, Timeouts.CopyTip); + if (copyRes) { + this.fieldCopied({ source: this.passEditView, copyRes: copyRes }); } } }, @@ -355,6 +345,30 @@ var DetailsView = Backbone.View.extend({ } }, + fieldCopied: function(e) { + if (this.fieldCopyTip) { + this.fieldCopyTip.hide(); + this.fieldCopyTip = null; + } + var fieldLabel = e.source.labelEl; + var clipboardTime = e.copyRes.seconds; + var msg = clipboardTime ? Locale.detFieldCopiedTime.replace('{}', clipboardTime) + : Locale.detFieldCopied; + var tip = new Tip(fieldLabel, { title: msg, placement: 'right', fast: true }); + this.fieldCopyTip = tip; + tip.show(); + var that = this; + setTimeout(function() { + tip.hide(); + that.fieldCopyTip = null; + if (e.source.model.name === '$Password' && AppSettingsModel.instance.get('lockOnCopy')) { + setTimeout(function() { + Backbone.trigger('lock-workspace'); + }, Timeouts.BeforeAutoLock); + } + }, Timeouts.CopyTip); + }, + dragover: function(e) { e.preventDefault(); if (this.dragTimeout) { diff --git a/app/scripts/views/fields/field-view.js b/app/scripts/views/fields/field-view.js index ecf25348..6cadf187 100644 --- a/app/scripts/views/fields/field-view.js +++ b/app/scripts/views/fields/field-view.js @@ -44,24 +44,36 @@ var FieldView = Backbone.View.extend({ //CopyPaste.copy(); // maybe Apple will ever support this? return; } + var copyRes; if (field) { var value = this.value || ''; if (value && value.isProtected) { var text = value.getText(); + if (!text) { + return; + } if (!CopyPaste.simpleCopy) { CopyPaste.createHiddenInput(text); } - CopyPaste.copy(text); + copyRes = CopyPaste.copy(text); + if (copyRes) { + this.trigger('copy', { source: this, copyRes: copyRes }); + } return; } } + if (!this.value) { + return; + } var selection = window.getSelection(); var range = document.createRange(); range.selectNodeContents(this.valueEl[0]); selection.removeAllRanges(); selection.addRange(range); - if (CopyPaste.copy(this.valueEl.text())) { + copyRes = CopyPaste.copy(this.valueEl.text()); + if (copyRes) { selection.removeAllRanges(); + this.trigger('copy', { source: this, copyRes: copyRes }); } }, diff --git a/app/scripts/views/settings/settings-general-view.js b/app/scripts/views/settings/settings-general-view.js index 8ac75385..2b82b091 100644 --- a/app/scripts/views/settings/settings-general-view.js +++ b/app/scripts/views/settings/settings-general-view.js @@ -24,6 +24,7 @@ var SettingsGeneralView = Backbone.View.extend({ 'change .settings__general-remember-key-files': 'changeRememberKeyFiles', 'change .settings__general-minimize': 'changeMinimize', 'change .settings__general-lock-on-minimize': 'changeLockOnMinimize', + 'change .settings__general-lock-on-copy': 'changeLockOnCopy', 'change .settings__general-table-view': 'changeTableView', 'change .settings__general-colorful-icons': 'changeColorfulIcons', 'click .settings__general-update-btn': 'checkUpdate', @@ -62,6 +63,7 @@ var SettingsGeneralView = Backbone.View.extend({ canAutoUpdate: Updater.enabled, canMinimize: Launcher && Launcher.canMinimize(), lockOnMinimize: Launcher && AppSettingsModel.instance.get('lockOnMinimize'), + lockOnCopy: AppSettingsModel.instance.get('lockOnCopy'), tableView: AppSettingsModel.instance.get('tableView'), canSetTableView: FeatureDetector.isDesktop(), autoUpdate: Updater.getAutoUpdateType(), @@ -164,6 +166,11 @@ var SettingsGeneralView = Backbone.View.extend({ AppSettingsModel.instance.set('lockOnMinimize', lockOnMinimize); }, + changeLockOnCopy: function(e) { + var lockOnCopy = e.target.checked || false; + AppSettingsModel.instance.set('lockOnCopy', lockOnCopy); + }, + changeTableView: function(e) { var tableView = e.target.checked || false; AppSettingsModel.instance.set('tableView', tableView); diff --git a/app/templates/settings/settings-general.hbs b/app/templates/settings/settings-general.hbs index d3d50ea6..7b475daf 100644 --- a/app/templates/settings/settings-general.hbs +++ b/app/templates/settings/settings-general.hbs @@ -105,6 +105,11 @@ {{/if}} +
+ + +
{{#if devTools}}

{{res 'setGenAdvanced'}}

diff --git a/release-notes.md b/release-notes.md index 34f65352..45cae65f 100644 --- a/release-notes.md +++ b/release-notes.md @@ -4,6 +4,7 @@ Release notes Storage providers, usability improvements `+` option to remember keyfiles `+` beta version app +`+` option to lock on password copy ##### v1.0.0 (2016-02-12) Performance, stability and quality improvements