From 6467752906378b513dfb99aa482b33bf968fb352 Mon Sep 17 00:00:00 2001 From: brantje Date: Sun, 11 Sep 2016 20:47:29 +0200 Subject: [PATCH] Login to vault works --- controller/vaultcontroller.php | 10 ++++-- css/app.css | 2 ++ css/app.css.map | 2 +- js/app/app.js | 4 +++ js/app/controllers/credential.js | 42 +++++++++++++++++++++++ js/app/controllers/vault.js | 50 +++++++++++++++++++++------- js/app/services/credentialservice.js | 8 +++++ js/app/services/encryptservice.js | 9 ++--- js/templates.js | 10 ++++-- lib/Db/CredentialMapper.php | 15 +++------ lib/Service/CredentialService.php | 4 +++ sass/vaults.scss | 3 ++ templates/main.php | 1 + templates/views/show_vault.html | 5 +++ templates/views/vaults.html | 17 ++++++---- 15 files changed, 141 insertions(+), 41 deletions(-) create mode 100644 js/app/controllers/credential.js create mode 100644 templates/views/show_vault.html diff --git a/controller/vaultcontroller.php b/controller/vaultcontroller.php index 3f2cfc66..96833186 100644 --- a/controller/vaultcontroller.php +++ b/controller/vaultcontroller.php @@ -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); } /** diff --git a/css/app.css b/css/app.css index 8ae5829a..96de7c9f 100644 --- a/css/app.css +++ b/css/app.css @@ -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; diff --git a/css/app.css.map b/css/app.css.map index e8b55edc..96ee62fd 100644 --- a/css/app.css.map +++ b/css/app.css.map @@ -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" diff --git a/js/app/app.js b/js/app/app.js index cf955e10..3dccbc6e 100644 --- a/js/app/app.js +++ b/js/app/app.js @@ -25,6 +25,10 @@ angular templateUrl: 'views/vaults.html', controller: 'VaultCtrl' }) + .when('/vault/:vault_id', { + templateUrl: 'views/show_vault.html', + controller: 'CredentialCtrl' + }) .otherwise({ redirectTo: '/' }); diff --git a/js/app/controllers/credential.js b/js/app/controllers/credential.js new file mode 100644 index 00000000..9bd31757 --- /dev/null +++ b/js/app/controllers/credential.js @@ -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(); + } + }]); diff --git a/js/app/controllers/vault.js b/js/app/controllers/vault.js index a4d63bd1..ef6c1573 100644 --- a/js/app/controllers/vault.js +++ b/js/app/controllers/vault.js @@ -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 }) }); diff --git a/js/app/services/credentialservice.js b/js/app/services/credentialservice.js index ab0f19f4..3b8aadcb 100644 --- a/js/app/services/credentialservice.js +++ b/js/app/services/credentialservice.js @@ -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; } } }]); diff --git a/js/app/services/encryptservice.js b/js/app/services/encryptservice.js index b1e53881..98528475 100644 --- a/js/app/services/encryptservice.js +++ b/js/app/services/encryptservice.js @@ -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) { diff --git a/js/templates.js b/js/templates.js index 2ce42972..ac8b60b4 100644 --- a/js/templates.js +++ b/js/templates.js @@ -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', - '
  • + Create a new vault
  • {{vault.name}}
    Created: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | Last accessed: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} Never
  • No vaults found, why not create one?
  • Go back to vaults
'); + '
  • + Create a new vault
  • {{vault.name}}
    Created: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | Last accessed: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} Never
  • No vaults found, why not create one?
  • Go back to vaults
'); }]); diff --git a/lib/Db/CredentialMapper.php b/lib/Db/CredentialMapper.php index 74b889b2..f71284de 100644 --- a/lib/Db/CredentialMapper.php +++ b/lib/Db/CredentialMapper.php @@ -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){ diff --git a/lib/Service/CredentialService.php b/lib/Service/CredentialService.php index 143d43e0..d279c7c8 100644 --- a/lib/Service/CredentialService.php +++ b/lib/Service/CredentialService.php @@ -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); + } } \ No newline at end of file diff --git a/sass/vaults.scss b/sass/vaults.scss index a53b8cf6..1c8436e3 100644 --- a/sass/vaults.scss +++ b/sass/vaults.scss @@ -31,6 +31,9 @@ } .login_form{ padding: 16px; + .error{ + color: #ce3702; + } input[type="password"], input[type="text"]{ width: 100%; @include border-radius(5px); diff --git a/templates/main.php b/templates/main.php index a342fa78..67d92c5f 100644 --- a/templates/main.php +++ b/templates/main.php @@ -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'); diff --git a/templates/views/show_vault.html b/templates/views/show_vault.html new file mode 100644 index 00000000..dd73aab0 --- /dev/null +++ b/templates/views/show_vault.html @@ -0,0 +1,5 @@ +Welcome to the vault! +{{active_vault}} +Credentials: + +{{credentials}} \ No newline at end of file diff --git a/templates/views/vaults.html b/templates/views/vaults.html index 04b46491..f153a66a 100644 --- a/templates/views/vaults.html +++ b/templates/views/vaults.html @@ -34,14 +34,14 @@
Vault password - +
Repeat vault password - +
-
+
Create vault
@@ -58,10 +58,15 @@