Creating vaults works, getting vaults not

This commit is contained in:
brantje 2016-09-11 12:33:09 +02:00
parent c22d335d4b
commit 2ee6df3ef0
15 changed files with 317 additions and 80 deletions

86
appinfo/database.xml Normal file
View file

@ -0,0 +1,86 @@
<database>
<name>*dbname*</name>
<create>true</create>
<overwrite>false</overwrite>
<charset>utf8</charset>
<table>
<name>*dbprefix*passman_vaults</name>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<notnull>true</notnull>
<autoincrement>true</autoincrement>
<unsigned>true</unsigned>
<primary>true</primary>
<length>8</length>
</field>
<field>
<name>guid</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>
<field>
<name>user_id</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>
<field>
<name>name</name>
<type>text</type>
<length>100</length>
<notnull>true</notnull>
</field>
<field>
<name>created</name>
<type>integer</type>
<length>8</length>
<default>0</default>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<field>
<name>last_access</name>
<type>integer</type>
<default>0</default>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<index>
<name>passman_last_access_index</name>
<field>
<name>last_access</name>
</field>
</index>
<index>
<name>passman_vault_guid_index</name>
<field>
<name>guid</name>
</field>
</index>
<index>
<name>npassman_vault_id_index</name>
<field>
<name>id</name>
</field>
</index>
<index>
<name>passman_vault_uid_id_index</name>
<field>
<name>user_id</name>
</field>
</index>
</declaration>
</table>
</database>

View file

@ -5,7 +5,7 @@
<description>A password manager for Nextcloud</description>
<licence>AGPL</licence>
<author>Sander Brand</author>
<version>1.0.1</version>
<version>1.0.2.1</version>
<namespace>Passman</namespace>
<category>other</category>
<website>https://github.com/nextcloud/passman/</website>

View file

@ -14,15 +14,19 @@ namespace OCA\Passman\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\ApiController;
use OCA\Passman\Service\VaultService;
class VaultController extends ApiController {
private $userId;
private $vaultService;
public function __construct($AppName, IRequest $request, $UserId) {
public function __construct($AppName,
IRequest $request,
$UserId,
VaultService $vaultService) {
parent::__construct($AppName, $request);
$this->userId = $UserId;
$this->vaultService = $vaultService;
}
/**
@ -30,40 +34,16 @@ class VaultController extends ApiController {
*/
public function listVaults() {
$vaults = [
array(
'vault_id' => uniqid(),
'name' => 'Vault ' . rand(1, 20),
'created' => time(),
'last_access' => time()
),
array(
'id' => uniqid(),
'name' => 'Vault ' . rand(1, 20),
'created' => time(),
'last_access' => time()
),
array(
'id' => uniqid(),
'name' => 'Vault ' . rand(1, 20),
'created' => time(),
'last_access' => time()
),
array(
'id' => uniqid(),
'name' => 'Vault ' . rand(1, 20),
'created' => time(),
'last_access' => time()
)
];
$vaults = $this->vaultService->getByUser($this->userId);
return new JSONResponse($vaults);
}
/**
* @NoAdminRequired
*/
public function create() {
return;
public function create($vault_name) {
$vault = $this->vaultService->createVault($vault_name, $this->userId);
return new JSONResponse($vault);
}
/**

View file

@ -26,9 +26,15 @@ angular.module('passmanApp')
$scope.selectVault = function(vault){
$scope.list_selected_vault = vault;
}
};
$scope.newVault = function(){
$scope.creating_vault = true;
}
};
$scope.createVault = function(vault_name){
VaultService.createVault(vault_name).then(function (result) {
console.log(result)
})
};
}]);

View file

@ -21,8 +21,45 @@ angular.module('passmanApp')
}
});
},
createVault: function (vault) {
createVault: function (vaultName) {
var queryUrl = OC.generateUrl('apps/passman/api/v1/vaults');
return $http.post(queryUrl, { vault_name: vaultName }).then(function (response) {
if(response.data){
return response.data;
} else {
return response;
}
});
},
getVault: function (vault) {
var queryUrl = OC.generateUrl('apps/passman/api/v1/vaults/' + vault.vault_id);
return $http.get(queryUrl).then(function (response) {
if(response.data){
return response.data;
} else {
return response;
}
});
},
updateVault: function (vault) {
var queryUrl = OC.generateUrl('apps/passman/api/v1/vaults/' + vault.vault_id);
return $http.post(queryUrl).then(function (response) {
if(response.data){
return response.data;
} else {
return response;
}
});
},
deleteVault: function (vault) {
var queryUrl = OC.generateUrl('apps/passman/api/v1/vaults/' + vault.vault_id);
return $http.delete(queryUrl).then(function (response) {
if(response.data){
return response.data;
} else {
return response;
}
});
}
}
}]);

View file

@ -3,5 +3,5 @@ angular.module('templates-main', ['views/vaults.html']);
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: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</small></span></div></li></ul></div></div><div ng-if="creating_vault"><div class="login_form">Please give your new vault a name.<div><input type="text"></div><div class="button_wrapper"><div class="button button-geen">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"></div><div><div><label><input type="checkbox" ng-model="default_vault"> 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">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: {{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</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 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"></div><div><div><label><input type="checkbox" ng-model="default_vault"> 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">Decrypt vault</div></div></div></div>');
}]);

View file

@ -9,7 +9,7 @@
* @copyright Sander Brand 2016
*/
namespace OCA\Passman;
namespace OCA\Passman\Db;
use OCP\Activity\IManager;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;

44
lib/Db/Vault.php Normal file
View file

@ -0,0 +1,44 @@
<?php
/**
* Nextcloud - passman
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Sander Brand <brantje@gmail.com>
* @copyright Sander Brand 2016
*/
namespace OCA\Passman\Db;
use \OCP\AppFramework\Db\Entity;
/**
* @method integer getId()
* @method void setId(integer $value)
* @method void setName(string $value)
* @method string getName()
* @method void setGuid(string $value)
* @method string getGuid()
* @method void setUserId(string $value)
* @method string getUserid()
* @method void setCreated(integer $value)
* @method integer getCreated()
* @method void setlastAccess(integer $value)
* @method integer getlastAccess()
*/
class Vault extends Entity {
protected $guid;
protected $name;
protected $userId;
protected $created;
protected $lastAccess;
public function __construct() {
// add types in constructor
$this->addType('created', 'integer');
$this->addType('lastAccess', 'integer');
}
}

53
lib/Db/VaultMapper.php Normal file
View file

@ -0,0 +1,53 @@
<?php
/**
* Nextcloud - passman
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Sander Brand <brantje@gmail.com>
* @copyright Sander Brand 2016
*/
namespace OCA\Passman\Db;
use OCA\Passman\Utility\Utils;
use OCP\IDBConnection;
use OCP\AppFramework\Db\Mapper;
//use OCA\Passman\Db\Vault;
class VaultMapper extends Mapper {
private $utils;
public function __construct(IDBConnection $db, Utils $utils) {
parent::__construct($db, 'passman_vaults');
$this->utils = $utils;
}
/**
* @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` = ?';
return $this->findEntities($sql, [$vault_id]);
}
public function findVaultsFromUser($userId){
$sql = 'SELECT * FROM `*PREFIX*passman_vaults` ' .
'WHERE `user_id` = ? ';
$params = [$userId];
return $this->findEntities($sql, $params);
}
public function create($vault_name, $userId){
$vault = new Vault();
$vault->setName($vault_name);
$vault->setUserId($userId);
$vault->setGuid($this->utils->GUID());
$vault->setCreated($this->utils->getTime());
$vault->setlastAccess(0);
return parent::insert($vault);
}
}

View file

@ -0,0 +1,35 @@
<?php
/**
* Nextcloud - passman
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Sander Brand <brantje@gmail.com>
* @copyright Sander Brand 2016
*/
namespace OCA\Passman\Service;
use OCP\IConfig;
use OCP\AppFramework\Db\DoesNotExistException;
use OCA\Passman\Db\VaultMapper;
class VaultService {
private $vaultMapper;
public function __construct(VaultMapper $vaultMapper) {
$this->vaultMapper = $vaultMapper;
}
public function getByUser($userId) {
return $this->vaultMapper->findVaultsFromUser($userId);
}
public function createVault($vault_name, $userId) {
return $this->vaultMapper->create($vault_name, $userId);
}
}

33
lib/Utility/Utils.php Normal file
View file

@ -0,0 +1,33 @@
<?php
/**
* Nextcloud - passman
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Sander Brand <brantje@gmail.com>
* @copyright Sander Brand 2016
*/
namespace OCA\Passman\Utility;
class Utils {
public function getTime() {
return time();
}
/**
* @return int the current unix time in miliseconds
*/
public function getMicroTime() {
list($millisecs, $secs) = explode(" ", microtime());
return $secs . substr($millisecs, 2, 6);
}
public function GUID() {
if (function_exists('com_create_guid') === true)
{
return trim(com_create_guid(), '{}');
}
return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}
}

View file

@ -1,39 +0,0 @@
<?php
/**
* Nextcloud - passman
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Sander Brand <brantje@gmail.com>
* @copyright Sander Brand 2016
*/
namespace OCA\Passman;
use OCP\Activity\IManager;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IL10N;
/**
* @brief Class for managing the data in the activities
*/
class Vault {
/** @var IDBConnection */
protected $connection;
/**
* @param IManager $activityManager
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
public function get(){
}
public function save(Vault $vault){
}
}

View file

@ -1,5 +1,6 @@
@import 'container';
@import 'variables';
@import 'mixins';
@import 'partials/button';
@import 'vaults';

0
sass/variables.scss Normal file
View file

View file

@ -18,19 +18,20 @@
</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">
<div class="login_form" ng-init="vault_name = '' ">
Please give your new vault a name.
<div>
<input type="text">
<input type="text" ng-model="vault_name">
</div>
<div class="button_wrapper">
<div class="button button-geen">
<div class="button button-geen" ng-click="createVault(vault_name)">
Create vault
</div>
<div class="button button-red" ng-click="clearState()">