mirror of
https://github.com/nextcloud/passman.git
synced 2025-11-08 05:04:04 +08:00
Login to vault works
This commit is contained in:
parent
6773486059
commit
6467752906
15 changed files with 141 additions and 41 deletions
|
|
@ -15,19 +15,22 @@ use OCP\IRequest;
|
|||
use OCP\AppFramework\Http\JSONResponse;
|
||||
use OCP\AppFramework\ApiController;
|
||||
use OCA\Passman\Service\VaultService;
|
||||
|
||||
use OCA\Passman\Service\CredentialService;
|
||||
|
||||
class VaultController extends ApiController {
|
||||
private $userId;
|
||||
private $vaultService;
|
||||
private $credentialService;
|
||||
|
||||
public function __construct($AppName,
|
||||
IRequest $request,
|
||||
$UserId,
|
||||
VaultService $vaultService) {
|
||||
VaultService $vaultService,
|
||||
CredentialService $credentialService) {
|
||||
parent::__construct($AppName, $request);
|
||||
$this->userId = $UserId;
|
||||
$this->vaultService = $vaultService;
|
||||
$this->credentialService = $credentialService;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -51,7 +54,8 @@ class VaultController extends ApiController {
|
|||
* @NoAdminRequired
|
||||
*/
|
||||
public function get($vault_id) {
|
||||
return;
|
||||
$credentials = $this->credentialService->getCredentialsByVaultId($vault_id, $this->userId);
|
||||
return new JSONResponse($credentials);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@
|
|||
background-color: #f7f7f7; }
|
||||
.vault_wrapper .login_form {
|
||||
padding: 16px; }
|
||||
.vault_wrapper .login_form .error {
|
||||
color: #ce3702; }
|
||||
.vault_wrapper .login_form input[type="password"], .vault_wrapper .login_form input[type="text"] {
|
||||
width: 100%;
|
||||
-webkit-border-radius: 5px;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"version": 3,
|
||||
"mappings": "AAAA,YAAY;EACV,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,IAAI;;AAEb,kBAAkB;EAChB,UAAU,EAAE,OAAoB;EAChC,KAAK,EAAE,IAAI;;AAGb,WAAW;EACT,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,IAAI;;AAEb,iBAAiB;EACf,UAAU,EAAE,OAAoB;EAChC,KAAK,EAAE,IAAI;;ACdb,cAAc;EACZ,MAAM,EAAE,MAAM;EACd,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,KAAK;ECMhB,qBAAqB,EDLE,GAAG;ECM1B,aAAa,EDNU,GAAG;ECO1B,eAAe,EAAE,WAAW;EAAG,qDAAqD;EDNpF,UAAU,EAAE,cAAc;EAC1B,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,KAAK;EACd,yBAAU;IAER,OAAO,EAAE,GAAG;IACZ,4HAAiB;MACf,MAAM,EAAE,OAAO;IAEjB,+BAAK;MACH,KAAK,EAAE,OAAO;IAEhB,qCAAW;MACT,gBAAgB,EAAE,kBAAkB;MACpC,KAAK,EAAE,IAAI;IAEb,4BAAE;MACA,aAAa,EAAE,iBAAiB;MAChC,OAAO,EAAE,IAAI;IAEf,kCAAQ;MACN,gBAAgB,EAAE,OAAO;EAG7B,0BAAW;IACT,OAAO,EAAE,IAAI;IACb,gGAA0C;MACxC,KAAK,EAAE,IAAI;MCvBf,qBAAqB,EDwBM,GAAG;MCvB9B,aAAa,EDuBc,GAAG;MCtB9B,eAAe,EAAE,WAAW;MAAG,qDAAqD;IDyBhF,kDAAO;MACL,KAAK,EAAE,GAAG;MACV,OAAO,EAAE,YAAY;IAGzB,kCAAO;MACL,UAAU,EAAE,IAAI;;AAKtB,oCAAoC;EAClC,cAAc;IACZ,KAAK,EAAE,GAAG",
|
||||
"mappings": "AAAA,YAAY;EACV,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,IAAI;;AAEb,kBAAkB;EAChB,UAAU,EAAE,OAAoB;EAChC,KAAK,EAAE,IAAI;;AAGb,WAAW;EACT,UAAU,EAAE,OAAO;EACnB,KAAK,EAAE,IAAI;;AAEb,iBAAiB;EACf,UAAU,EAAE,OAAoB;EAChC,KAAK,EAAE,IAAI;;ACdb,cAAc;EACZ,MAAM,EAAE,MAAM;EACd,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,KAAK;ECMhB,qBAAqB,EDLE,GAAG;ECM1B,aAAa,EDNU,GAAG;ECO1B,eAAe,EAAE,WAAW;EAAG,qDAAqD;EDNpF,UAAU,EAAE,cAAc;EAC1B,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,KAAK;EACd,yBAAU;IAER,OAAO,EAAE,GAAG;IACZ,4HAAiB;MACf,MAAM,EAAE,OAAO;IAEjB,+BAAK;MACH,KAAK,EAAE,OAAO;IAEhB,qCAAW;MACT,gBAAgB,EAAE,kBAAkB;MACpC,KAAK,EAAE,IAAI;IAEb,4BAAE;MACA,aAAa,EAAE,iBAAiB;MAChC,OAAO,EAAE,IAAI;IAEf,kCAAQ;MACN,gBAAgB,EAAE,OAAO;EAG7B,0BAAW;IACT,OAAO,EAAE,IAAI;IACb,iCAAM;MACJ,KAAK,EAAE,OAAO;IAEhB,gGAA0C;MACxC,KAAK,EAAE,IAAI;MC1Bf,qBAAqB,ED2BM,GAAG;MC1B9B,aAAa,ED0Bc,GAAG;MCzB9B,eAAe,EAAE,WAAW;MAAG,qDAAqD;ID4BhF,kDAAO;MACL,KAAK,EAAE,GAAG;MACV,OAAO,EAAE,YAAY;IAGzB,kCAAO;MACL,UAAU,EAAE,IAAI;;AAKtB,oCAAoC;EAClC,cAAc;IACZ,KAAK,EAAE,GAAG",
|
||||
"sources": ["../sass/partials/button.scss","../sass/vaults.scss","../sass/mixins.scss"],
|
||||
"names": [],
|
||||
"file": "app.css"
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@ angular
|
|||
templateUrl: 'views/vaults.html',
|
||||
controller: 'VaultCtrl'
|
||||
})
|
||||
.when('/vault/:vault_id', {
|
||||
templateUrl: 'views/show_vault.html',
|
||||
controller: 'CredentialCtrl'
|
||||
})
|
||||
.otherwise({
|
||||
redirectTo: '/'
|
||||
});
|
||||
|
|
|
|||
42
js/app/controllers/credential.js
Normal file
42
js/app/controllers/credential.js
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
'use strict';
|
||||
|
||||
/**
|
||||
* @ngdoc function
|
||||
* @name passmanApp.controller:MainCtrl
|
||||
* @description
|
||||
* # MainCtrl
|
||||
* Controller of the passmanApp
|
||||
*/
|
||||
angular.module('passmanApp')
|
||||
.controller('CredentialCtrl', ['$scope', 'VaultService', 'SettingsService', '$location', 'CredentialService', function ($scope, VaultService, SettingsService, $location, CredentialService) {
|
||||
$scope.active_vault = VaultService.getActiveVault();
|
||||
if(! SettingsService.getSetting('defaultVault') || ! SettingsService.getSetting('defaultVaultPass')){
|
||||
if(!$scope.active_vault){
|
||||
$location.path('/')
|
||||
}
|
||||
} else {
|
||||
if(SettingsService.getSetting('defaultVault') && SettingsService.getSetting('defaultVaultPass')){
|
||||
var _vault = angular.copy(SettingsService.getSetting('defaultVault'))
|
||||
_vault.vaultKey = angular.copy(SettingsService.getSetting('defaultVaultPass'));
|
||||
VaultService.setActiveVault(_vault);
|
||||
$scope.active_vault = _vault;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var fetchCredentials = function(){
|
||||
VaultService.getVault($scope.active_vault).then(function(credentials) {
|
||||
var _credentials = [];
|
||||
for(var i = 0; i < credentials.length; i++){
|
||||
var credential = CredentialService.decryptCredential(angular.copy(credentials[i]));
|
||||
_credentials.push(credential);
|
||||
}
|
||||
$scope.credentials = _credentials;
|
||||
});
|
||||
};
|
||||
|
||||
if($scope.active_vault){
|
||||
$scope.$parent.selectedVault = true;
|
||||
fetchCredentials();
|
||||
}
|
||||
}]);
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
* Controller of the passmanApp
|
||||
*/
|
||||
angular.module('passmanApp')
|
||||
.controller('VaultCtrl', ['$scope', 'VaultService', 'SettingsService', 'CredentialService', function ($scope, VaultService, SettingsService, CredentialService) {
|
||||
.controller('VaultCtrl', ['$scope', 'VaultService', 'SettingsService', 'CredentialService', '$location', function ($scope, VaultService, SettingsService, CredentialService, $location) {
|
||||
VaultService.getVaults().then(function (vaults) {
|
||||
$scope.vaults = vaults;
|
||||
if(SettingsService.getSetting('defaultVault') != null){
|
||||
|
|
@ -43,6 +43,13 @@ angular.module('passmanApp')
|
|||
}
|
||||
};
|
||||
|
||||
$scope.toggleRememberPassword = function(){
|
||||
$scope.remember_vault_password = !$scope.remember_vault_password;
|
||||
if($scope.remember_vault_password != true){
|
||||
SettingsService.setSetting('defaultVault', null);
|
||||
}
|
||||
};
|
||||
|
||||
$scope.clearState = function () {
|
||||
$scope.list_selected_vault = false;
|
||||
$scope.creating_vault = false;
|
||||
|
|
@ -56,31 +63,51 @@ angular.module('passmanApp')
|
|||
$scope.creating_vault = true;
|
||||
};
|
||||
|
||||
|
||||
var _loginToVault = function (vault, vault_key) {
|
||||
var _vault = angular.copy(vault)
|
||||
_vault.vaultKey = angular.copy(vault_key);
|
||||
VaultService.setActiveVault(_vault);
|
||||
$location.path('/vault/'+ vault.vault_id);
|
||||
}
|
||||
|
||||
$scope.vaultDecryptionKey = '';
|
||||
$scope.loginToVault = function (vault) {
|
||||
$scope.loginToVault = function (vault, vault_key) {
|
||||
$scope.error = false;
|
||||
var _vault = angular.copy(vault)
|
||||
_vault.vaultKey = angular.copy(vault_key);
|
||||
VaultService.setActiveVault(_vault);
|
||||
VaultService.getVault(vault).then(function(credentials){
|
||||
for(var i = 0; i < credentials.length; i++){
|
||||
var credential = credentials[i];
|
||||
console.log(credential);
|
||||
if(credential.hidden = true){
|
||||
console.log(credential);
|
||||
try {
|
||||
var c = CredentialService.decryptCredential(credential);
|
||||
if(c.password === 'lorum ipsum'){
|
||||
console.log($scope.remember_vault_password);
|
||||
if($scope.remember_vault_password ){
|
||||
SettingsService.setSetting('defaultVaultPass', vault_key);
|
||||
}
|
||||
_loginToVault(vault, vault_key);
|
||||
}
|
||||
} catch (e){
|
||||
$scope.error = 'Incorrect vault password!'
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
$scope.vaultKey = '';
|
||||
$scope.vaultKey_2 = '';
|
||||
$scope.createVault = function(vault_name){
|
||||
$scope.createVault = function(vault_name, vault_key, vault_key2){
|
||||
if($scope.vaultKey != $scope.vaultKey_2){
|
||||
//@todo Show an message
|
||||
return;
|
||||
}
|
||||
VaultService.createVault(vault_name).then(function (vault) {
|
||||
$scope.vaults.push(vault)
|
||||
var _vault = angular.copy(vault)
|
||||
_vault.vaultKey = angular.copy($scope.vaultKey);
|
||||
$scope.vaults.push(vault);
|
||||
var _vault = angular.copy(vault);
|
||||
_vault.vaultKey = angular.copy(vault_key);
|
||||
VaultService.setActiveVault(_vault);
|
||||
var test_credential = CredentialService.newCredential();
|
||||
test_credential.label = 'Test key for vault '+ vault_name;
|
||||
|
|
@ -88,8 +115,7 @@ angular.module('passmanApp')
|
|||
test_credential.vault_id = vault.vault_id;
|
||||
test_credential.password = 'lorum ipsum';
|
||||
CredentialService.createCredential(test_credential).then(function (result) {
|
||||
console.log('succes =)')
|
||||
console.log(result)
|
||||
_loginToVault(vault, vault_key);
|
||||
//@TODO Redirect to newly created vault
|
||||
})
|
||||
});
|
||||
|
|
|
|||
|
|
@ -67,6 +67,14 @@ angular.module('passmanApp')
|
|||
return response;
|
||||
}
|
||||
});
|
||||
},
|
||||
decryptCredential: function (credential) {
|
||||
for(var i = 0; i < _encryptedFields.length; i++){
|
||||
var field = _encryptedFields[i];
|
||||
var fieldValue = angular.copy(credential[field]);
|
||||
credential[field] = JSON.parse(EncryptService.decryptString(fieldValue));
|
||||
}
|
||||
return credential;
|
||||
}
|
||||
}
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -21,18 +21,15 @@ angular.module('passmanApp')
|
|||
return {
|
||||
encryptString: function(string){
|
||||
var _key = VaultService.getActiveVault().vaultKey;
|
||||
var rp = {
|
||||
|
||||
};
|
||||
console.log(_key);
|
||||
var rp = {};
|
||||
var ct = sjcl.encrypt(_key, string, encryption_config, rp);
|
||||
return window.btoa(ct);
|
||||
},
|
||||
decryptString: function(ciphertext){
|
||||
ciphertext = window.atob(ciphertext);
|
||||
var _key = VaultService.getActiveVault().vaultKey;
|
||||
var rp = {
|
||||
|
||||
};
|
||||
var rp = {};
|
||||
try {
|
||||
return sjcl.decrypt(_key, ciphertext, encryption_config, rp)
|
||||
} catch(e) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,13 @@
|
|||
angular.module('templates-main', ['views/vaults.html']);
|
||||
angular.module('templates-main', ['views/show_vault.html', 'views/vaults.html']);
|
||||
|
||||
angular.module('views/show_vault.html', []).run(['$templateCache', function($templateCache) {
|
||||
'use strict';
|
||||
$templateCache.put('views/show_vault.html',
|
||||
'Welcome to the vault! {{active_vault}} Credentials: {{credentials}}');
|
||||
}]);
|
||||
|
||||
angular.module('views/vaults.html', []).run(['$templateCache', function($templateCache) {
|
||||
'use strict';
|
||||
$templateCache.put('views/vaults.html',
|
||||
'<div class="vault_wrapper"><div class="vaults" ng-if="!list_selected_vault && !creating_vault"><div class="ui-select-container ui-select-bootstrap vaultlist"><ul><li ng-click="newVault()">+ Create a new vault</li><li ng-repeat="vault in vaults" ng-class="{\'selected\': vault == list_selected_vault }" ng-click="selectVault(vault)"><div><span class="ui-select-choices-row-inner"><div class="ng-binding ng-scope">{{vault.name}}</div><small class="ng-binding ng-scope">Created: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | Last accessed: <span ng-if="vault.last_access > 0">{{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="vault.last_access === 0">Never</span></small></span></div></li><li ng-if="vaults.length === 0">No vaults found, why not create one?</li></ul></div></div><div ng-if="creating_vault"><div class="login_form" ng-init="vault_name = \'\' ">Please give your new vault a name.<div><input type="text" ng-model="vault_name"></div><div>Vault password <input type="text" ng-model="vaultKey"></div><div>Repeat vault password <input type="text" ng-model="vaultKey_2"></div><div class="button_wrapper"><div class="button button-geen" ng-click="createVault(vault_name)">Create vault</div><div class="button button-red" ng-click="clearState()">Cancel</div></div></div></div><div ng-if="list_selected_vault != false"><div class="vaultlist"><ul><li ng-click="clearState()">Go back to vaults</li></ul></div><div class="login_form">Please input the password for {{list_selected_vault.name}}<div><input type="password" ng-model="vaultDecryptionKey"></div><div><div><label><input type="checkbox" ng-checked="default_vault" ng-click="toggleDefaultVault()"> Set this vault as default.</label></div><div><label><input type="checkbox" ng-model="remember_vault_password"> Login automatically to this vault.</label></div></div><div class="button button-geen" ng-click="loginToVault(list_selected_vault)">Decrypt vault</div></div></div></div>');
|
||||
'<div class="vault_wrapper"><div class="vaults" ng-if="!list_selected_vault && !creating_vault"><div class="ui-select-container ui-select-bootstrap vaultlist"><ul><li ng-click="newVault()">+ Create a new vault</li><li ng-repeat="vault in vaults" ng-class="{\'selected\': vault == list_selected_vault }" ng-click="selectVault(vault)"><div><span class="ui-select-choices-row-inner"><div class="ng-binding ng-scope">{{vault.name}}</div><small class="ng-binding ng-scope">Created: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | Last accessed: <span ng-if="vault.last_access > 0">{{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="vault.last_access === 0">Never</span></small></span></div></li><li ng-if="vaults.length === 0">No vaults found, why not create one?</li></ul></div></div><div ng-if="creating_vault"><div class="login_form" ng-init="vault_name = \'\' ">Please give your new vault a name.<div><input type="text" ng-model="vault_name"></div><div>Vault password <input type="text" ng-model="vault_key"></div><div>Repeat vault password <input type="text" ng-model="vault_key2"></div><div class="button_wrapper"><div class="button button-geen" ng-click="createVault(vault_name, vault_key, vault_key2)">Create vault</div><div class="button button-red" ng-click="clearState()">Cancel</div></div></div></div><div ng-if="list_selected_vault != false"><div class="vaultlist"><ul><li ng-click="clearState()">Go back to vaults</li></ul></div><div class="login_form"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div>Please input the password for {{list_selected_vault.name}}<div><input type="password" ng-model="vault_key"></div><div><div><label><input type="checkbox" ng-checked="default_vault" ng-click="toggleDefaultVault()"> Set this vault as default.</label></div><div><label><input type="checkbox" ng-checked="remember_vault_password" ng-click="toggleRememberPassword()"> Login automatically to this vault.</label></div></div><div class="button button-geen" ng-click="loginToVault(list_selected_vault, vault_key)">Decrypt vault</div></div></div></div>');
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -26,17 +26,10 @@ class CredentialMapper extends Mapper {
|
|||
* @throws \OCP\AppFramework\Db\DoesNotExistException if not found
|
||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result
|
||||
*/
|
||||
public function find($vault_id) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*passman_vaults` ' .
|
||||
'WHERE `user_id` = ? LIMIT 1';
|
||||
return $this->findEntity($sql, [$vault_id]);
|
||||
}
|
||||
|
||||
public function findVaultsFromUser($userId){
|
||||
$sql = 'SELECT id, name, created, guid, last_access FROM `*PREFIX*passman_vaults` ' .
|
||||
'WHERE `user_id` = ? ';
|
||||
$params = [$userId];
|
||||
return $this->findEntities($sql, $params);
|
||||
public function getCredentialsByVaultId($vault_id, $user_id) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' .
|
||||
'WHERE `user_id` = ? and vault_id = ? LIMIT 1';
|
||||
return $this->findEntities($sql, [$user_id, $vault_id]);
|
||||
}
|
||||
|
||||
public function create($raw_credential){
|
||||
|
|
|
|||
|
|
@ -28,4 +28,8 @@ class CredentialService {
|
|||
public function createCredential($credential) {
|
||||
return $this->credentialMapper->create($credential);
|
||||
}
|
||||
|
||||
public function getCredentialsByVaultId($vault_id, $user_id){
|
||||
return $this->credentialMapper->getCredentialsByVaultId($vault_id, $user_id);
|
||||
}
|
||||
}
|
||||
|
|
@ -31,6 +31,9 @@
|
|||
}
|
||||
.login_form{
|
||||
padding: 16px;
|
||||
.error{
|
||||
color: #ce3702;
|
||||
}
|
||||
input[type="password"], input[type="text"]{
|
||||
width: 100%;
|
||||
@include border-radius(5px);
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ script('passman', 'app/app');
|
|||
script('passman', 'templates');
|
||||
script('passman', 'app/controllers/main');
|
||||
script('passman', 'app/controllers/vault');
|
||||
script('passman', 'app/controllers/credential');
|
||||
script('passman', 'app/filters/propsfilter');
|
||||
script('passman', 'app/services/cacheservice');
|
||||
script('passman', 'app/services/vaultservice');
|
||||
|
|
|
|||
5
templates/views/show_vault.html
Normal file
5
templates/views/show_vault.html
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Welcome to the vault!
|
||||
{{active_vault}}
|
||||
Credentials:
|
||||
|
||||
{{credentials}}
|
||||
|
|
@ -34,14 +34,14 @@
|
|||
</div>
|
||||
<div>
|
||||
Vault password
|
||||
<input type="text" ng-model="vaultKey">
|
||||
<input type="text" ng-model="vault_key">
|
||||
</div>
|
||||
<div>
|
||||
Repeat vault password
|
||||
<input type="text" ng-model="vaultKey_2">
|
||||
<input type="text" ng-model="vault_key2">
|
||||
</div>
|
||||
<div class="button_wrapper">
|
||||
<div class="button button-geen" ng-click="createVault(vault_name)">
|
||||
<div class="button button-geen" ng-click="createVault(vault_name, vault_key, vault_key2)">
|
||||
Create vault
|
||||
</div>
|
||||
<div class="button button-red" ng-click="clearState()">
|
||||
|
|
@ -58,10 +58,15 @@
|
|||
</ul>
|
||||
</div>
|
||||
<div class="login_form">
|
||||
<div ng-show="error" class="error">
|
||||
<ul>
|
||||
<li>{{error}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
Please input the password for {{list_selected_vault.name}}
|
||||
|
||||
<div>
|
||||
<input type="password" ng-model="vaultDecryptionKey">
|
||||
<input type="password" ng-model="vault_key">
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
|
|
@ -72,12 +77,12 @@
|
|||
</div>
|
||||
<div>
|
||||
<label>
|
||||
<input type="checkbox" ng-model="remember_vault_password">
|
||||
<input type="checkbox" ng-checked="remember_vault_password" ng-click="toggleRememberPassword()">
|
||||
Login automatically to this vault.
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="button button-geen" ng-click="loginToVault(list_selected_vault)">
|
||||
<div class="button button-geen" ng-click="loginToVault(list_selected_vault, vault_key)">
|
||||
Decrypt vault
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue