Ability to change passcode, passcode with ephemeral sessions

This commit is contained in:
Mo Bitar
2018-01-19 16:59:08 -06:00
parent 18b4af8c2b
commit af8cdf5a41
6 changed files with 39 additions and 30 deletions

View File

@@ -525,11 +525,6 @@ class AccountMenu {
Passcode Lock Passcode Lock
*/ */
$scope.passcodeOptionAvailable = function() {
// If you're signed in with an ephemeral session, passcode lock is unavailable
return authManager.offline() || !authManager.isEphemeralSession();
}
$scope.hasPasscode = function() { $scope.hasPasscode = function() {
return passcodeManager.hasPasscode(); return passcodeManager.hasPasscode();
} }
@@ -545,7 +540,9 @@ class AccountMenu {
return; return;
} }
passcodeManager.setPasscode(passcode, () => { let fn = $scope.formData.changingPasscode ? passcodeManager.changePasscode : passcodeManager.setPasscode;
fn(passcode, () => {
$timeout(function(){ $timeout(function(){
$scope.formData.showPasscodeForm = false; $scope.formData.showPasscodeForm = false;
var offline = authManager.offline(); var offline = authManager.offline();
@@ -559,6 +556,12 @@ class AccountMenu {
}) })
} }
$scope.changePasscodePressed = function() {
$scope.formData.changingPasscode = true;
$scope.addPasscodeClicked();
$scope.formData.changingPasscode = false;
}
$scope.removePasscodePressed = function() { $scope.removePasscodePressed = function() {
var signedIn = !authManager.offline(); var signedIn = !authManager.offline();
var message = "Are you sure you want to remove your local passcode?"; var message = "Are you sure you want to remove your local passcode?";

View File

@@ -43,11 +43,10 @@ angular.module('app')
this.ephemeral = ephemeral; this.ephemeral = ephemeral;
if(ephemeral) { if(ephemeral) {
storageManager.setModelStorageMode(StorageManager.Ephemeral); storageManager.setModelStorageMode(StorageManager.Ephemeral);
storageManager.setItemsMode(storageManager.hasPasscode() ? StorageManager.FixedEncrypted : StorageManager.Ephemeral); storageManager.setItemsMode(StorageManager.Ephemeral);
} else { } else {
storageManager.setModelStorageMode(StorageManager.Fixed); storageManager.setModelStorageMode(StorageManager.Fixed);
storageManager.setItemsMode(storageManager.hasPasscode() ? StorageManager.FixedEncrypted : StorageManager.Fixed); storageManager.setItemsMode(storageManager.hasPasscode() ? StorageManager.FixedEncrypted : StorageManager.Fixed);
storageManager.setItem("ephemeral", JSON.stringify(false), StorageManager.Fixed); storageManager.setItem("ephemeral", JSON.stringify(false), StorageManager.Fixed);
} }
} }

View File

@@ -41,7 +41,7 @@ angular.module('app')
}.bind(this)); }.bind(this));
} }
this.setPasscode = function(passcode, callback) { this.setPasscode = (passcode, callback) => {
var cost = Neeto.crypto.defaultPasswordGenerationCost(); var cost = Neeto.crypto.defaultPasswordGenerationCost();
var salt = Neeto.crypto.generateRandomKey(512); var salt = Neeto.crypto.generateRandomKey(512);
var defaultParams = {pw_cost: cost, pw_salt: salt, version: "002"}; var defaultParams = {pw_cost: cost, pw_salt: salt, version: "002"};
@@ -60,6 +60,10 @@ angular.module('app')
}.bind(this)); }.bind(this));
} }
this.changePasscode = (newPasscode, callback) => {
this.setPasscode(newPasscode, callback);
}
this.clearPasscode = function() { this.clearPasscode = function() {
storageManager.setItemsMode(authManager.isEphemeralSession() ? StorageManager.Ephemeral : StorageManager.Fixed); // Transfer from Ephemeral storageManager.setItemsMode(authManager.isEphemeralSession() ? StorageManager.Ephemeral : StorageManager.Fixed); // Transfer from Ephemeral
storageManager.removeItem("offlineParams", StorageManager.Fixed); storageManager.removeItem("offlineParams", StorageManager.Fixed);
@@ -70,7 +74,8 @@ angular.module('app')
this.encryptLocalStorage = function(keys) { this.encryptLocalStorage = function(keys) {
storageManager.setKeys(keys); storageManager.setKeys(keys);
// Switch to Ephemeral storage, wiping Fixed storage // Switch to Ephemeral storage, wiping Fixed storage
storageManager.setItemsMode(authManager.isEphemeralSession() ? StorageManager.Ephemeral : StorageManager.FixedEncrypted); // Last argument is `force`, which we set to true because in the case of changing passcode
storageManager.setItemsMode(authManager.isEphemeralSession() ? StorageManager.Ephemeral : StorageManager.FixedEncrypted, true);
} }
this.decryptLocalStorage = function(keys) { this.decryptLocalStorage = function(keys) {

View File

@@ -62,9 +62,9 @@ class StorageManager {
return this._memoryStorage; return this._memoryStorage;
} }
setItemsMode(mode) { setItemsMode(mode, force) {
var newStorage = this.getVault(mode); var newStorage = this.getVault(mode);
if(newStorage !== this.storage) { if(newStorage !== this.storage || mode !== this.itemsStorageMode || force) {
// transfer storages // transfer storages
var length = this.storage.length; var length = this.storage.length;
for(var i = 0; i < length; i++) { for(var i = 0; i < length; i++) {
@@ -101,6 +101,8 @@ class StorageManager {
var storage = this.getVault(vaultKey); var storage = this.getVault(vaultKey);
storage.setItem(key, value); storage.setItem(key, value);
console.log(this.itemsStorageMode);
if(vaultKey === StorageManager.FixedEncrypted || (!vaultKey && this.itemsStorageMode === StorageManager.FixedEncrypted)) { if(vaultKey === StorageManager.FixedEncrypted || (!vaultKey && this.itemsStorageMode === StorageManager.FixedEncrypted)) {
this.writeEncryptedStorageToDisk(); this.writeEncryptedStorageToDisk();
} }
@@ -161,7 +163,6 @@ class StorageManager {
for(var key of Object.keys(encryptedStorage.storage)) { for(var key of Object.keys(encryptedStorage.storage)) {
this.setItem(key, encryptedStorage.storage[key]); this.setItem(key, encryptedStorage.storage[key]);
} }
} }
hasPasscode() { hasPasscode() {

View File

@@ -127,29 +127,30 @@
.panel-section .panel-section
%h3.title.panel-row Passcode Lock %h3.title.panel-row Passcode Lock
%div{"ng-if" => "!hasPasscode() && passcodeOptionAvailable()"} %div{"ng-if" => "!hasPasscode()"}
.panel-row{"ng-if" => "!formData.showPasscodeForm"} .panel-row{"ng-if" => "!formData.showPasscodeForm"}
.button.info{"ng-click" => "addPasscodeClicked(); $event.stopPropagation();"} .button.info{"ng-click" => "addPasscodeClicked(); $event.stopPropagation();"}
.label Add Passcode .label Add Passcode
%p Add an app passcode to lock the app and encrypt on-device key storage. %p Add an app passcode to lock the app and encrypt on-device key storage.
%form{"ng-if" => "formData.showPasscodeForm", "ng-submit" => "submitPasscodeForm()"} %form{"ng-if" => "formData.showPasscodeForm", "ng-submit" => "submitPasscodeForm()"}
%input.form-control{:type => 'password', "ng-model" => "formData.passcode", "placeholder" => "Passcode", "sn-autofocus" => "true", "should-focus" => "true"} %input.form-control{:type => 'password', "ng-model" => "formData.passcode", "placeholder" => "Passcode", "sn-autofocus" => "true", "should-focus" => "true"}
%input.form-control{:type => 'password', "ng-model" => "formData.confirmPasscode", "placeholder" => "Confirm Passcode"} %input.form-control{:type => 'password', "ng-model" => "formData.confirmPasscode", "placeholder" => "Confirm Passcode"}
.button-group.stretch.panel-row.form-submit .button-group.stretch.panel-row.form-submit
%button.button.info{"type" => "submit"} %button.button.info{"type" => "submit"}
.label Set Passcode .label Set Passcode
%a.panel-row{"ng-click" => "formData.showPasscodeForm = false"} Cancel %a.panel-row{"ng-click" => "formData.showPasscodeForm = false"} Cancel
.panel-row{"ng-if" => "hasPasscode()"} %div{"ng-if" => "hasPasscode() && !formData.showPasscodeForm"}
%p .panel-row
Passcode lock is enabled. %p
%span{"ng-if" => "isDesktopApplication()"} Your passcode will be required on new sessions after app quit. Passcode lock is enabled.
%a.block.danger{"ng-click" => "removePasscodePressed()"} Remove Passcode %span{"ng-if" => "isDesktopApplication()"} Your passcode will be required on new sessions after app quit.
.panel-row.justify-left
.panel-row{"ng-if" => "!passcodeOptionAvailable()"} .horizontal-group
%p Passcode lock is only available to permanent sessions. (You chose not to stay signed in.) %a.info{"ng-click" => "changePasscodePressed()"} Change Passcode
%a.danger{"ng-click" => "removePasscodePressed()"} Remove Passcode

View File

@@ -2,7 +2,7 @@
#footer-bar.app-bar.no-edges #footer-bar.app-bar.no-edges
.left .left
.item{"click-outside" => "ctrl.showAccountMenu = false;", "is-open" => "ctrl.showAccountMenu"} .item{"click-outside" => "ctrl.showAccountMenu = false;", "is-open" => "ctrl.showAccountMenu"}
.column .column{"ng-click" => "ctrl.accountMenuPressed()"}
.circle.small{"ng-class" => "ctrl.error ? 'danger' : (ctrl.getUser() ? 'info' : 'default')"} .circle.small{"ng-class" => "ctrl.error ? 'danger' : (ctrl.getUser() ? 'info' : 'default')"}
.column{"ng-click" => "ctrl.accountMenuPressed()"} .column{"ng-click" => "ctrl.accountMenuPressed()"}
.label.title{"ng-class" => "{red: ctrl.error}"} Account .label.title{"ng-class" => "{red: ctrl.error}"} Account