Login to vault works

This commit is contained in:
brantje 2016-09-11 20:47:29 +02:00
parent 6773486059
commit 6467752906
15 changed files with 141 additions and 41 deletions

View file

@ -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);
}
/**

View file

@ -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;

View file

@ -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"

View file

@ -25,6 +25,10 @@ angular
templateUrl: 'views/vaults.html',
controller: 'VaultCtrl'
})
.when('/vault/:vault_id', {
templateUrl: 'views/show_vault.html',
controller: 'CredentialCtrl'
})
.otherwise({
redirectTo: '/'
});

View 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();
}
}]);

View file

@ -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
})
});

View file

@ -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;
}
}
}]);

View file

@ -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) {

View file

@ -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>');
}]);

View file

@ -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){

View file

@ -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);
}
}

View file

@ -31,6 +31,9 @@
}
.login_form{
padding: 16px;
.error{
color: #ce3702;
}
input[type="password"], input[type="text"]{
width: 100%;
@include border-radius(5px);

View file

@ -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');

View file

@ -0,0 +1,5 @@
Welcome to the vault!
{{active_vault}}
Credentials:
{{credentials}}

View file

@ -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>