mirror of
https://github.com/nextcloud/passman.git
synced 2025-10-26 13:26:41 +08:00
Creating vaults works, getting vaults not
This commit is contained in:
parent
c22d335d4b
commit
2ee6df3ef0
15 changed files with 317 additions and 80 deletions
86
appinfo/database.xml
Normal file
86
appinfo/database.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
})
|
||||
};
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -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>');
|
||||
}]);
|
||||
|
|
|
|||
|
|
@ -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
44
lib/Db/Vault.php
Normal 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
53
lib/Db/VaultMapper.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
35
lib/Service/VaultService.php
Normal file
35
lib/Service/VaultService.php
Normal 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
33
lib/Utility/Utils.php
Normal 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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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){
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
@import 'container';
|
||||
@import 'variables';
|
||||
@import 'mixins';
|
||||
@import 'partials/button';
|
||||
@import 'vaults';
|
||||
|
|
|
|||
0
sass/variables.scss
Normal file
0
sass/variables.scss
Normal 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()">
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue