Ability to change passcode, passcode with ephemeral sessions
This commit is contained in:
@@ -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?";
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user