mirror of
https://github.com/nextcloud/passman.git
synced 2025-12-11 14:16:07 +08:00
Merge branch 'master' of github.com:nextcloud/passman
This commit is contained in:
commit
e60ed02621
14 changed files with 158 additions and 29 deletions
|
|
@ -27,6 +27,7 @@ return [
|
|||
['name' => 'vault#get', 'url' => '/api/v2/vaults/{vault_id}', 'verb' => 'GET'],
|
||||
['name' => 'vault#update', 'url' => '/api/v2/vaults/{vault_id}', 'verb' => 'PATCH'],
|
||||
['name' => 'vault#delete', 'url' => '/api/v2/vaults/{vault_id}', 'verb' => 'DELETE'],
|
||||
['name' => 'vault#updateSharingKeys', 'url' => '/api/v2/vaults/{vault_id}/sharing-keys', 'verb' => 'POST'],
|
||||
|
||||
//Credential
|
||||
['name' => 'credential#createCredential', 'url' => '/api/v2/credentials', 'verb' => 'POST'],
|
||||
|
|
|
|||
|
|
@ -67,6 +67,14 @@ class VaultController extends ApiController {
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function updateSharingKeys($vault_id, $private_sharing_key, $public_sharing_key) {
|
||||
$this->vaultService->updateSharingKeys($vault_id, $private_sharing_key, $public_sharing_key);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
|
|
|
|||
45
css/app.css
45
css/app.css
|
|
@ -147,6 +147,7 @@
|
|||
#app-content #app-content-wrapper #controls {
|
||||
border-bottom: 1px solid #c9c9c9; }
|
||||
#app-content #app-content-wrapper .actions.creatable {
|
||||
float: left;
|
||||
overflow: hidden; }
|
||||
#app-content #app-content-wrapper .actions.creatable .bubble {
|
||||
position: relative;
|
||||
|
|
@ -170,12 +171,12 @@
|
|||
text-align: center;
|
||||
display: inline-block;
|
||||
font-weight: bold; }
|
||||
#app-content #app-content-wrapper .actions.creatable .searchboxContainer {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 0; }
|
||||
#app-content #app-content-wrapper .actions.creatable .searchboxContainer .searchbox {
|
||||
display: inline-block; }
|
||||
#app-content #app-content-wrapper .searchboxContainer {
|
||||
display: inline-block;
|
||||
margin-right: 14px;
|
||||
float: right; }
|
||||
#app-content #app-content-wrapper .searchboxContainer .searchbox {
|
||||
display: inline-block; }
|
||||
#app-content #app-content-wrapper .credential-table {
|
||||
width: 100%;
|
||||
margin-top: 44px; }
|
||||
|
|
@ -397,4 +398,36 @@
|
|||
margin-left: 0 !important;
|
||||
margin-right: 0 !important; }
|
||||
|
||||
#app-content #app-content-wrapper #passman-controls {
|
||||
border-bottom: 1px solid #c9c9c9; }
|
||||
|
||||
#passman-controls {
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
top: 45px;
|
||||
right: 0;
|
||||
left: 0;
|
||||
padding: 0 !important;
|
||||
margin: 0;
|
||||
background-color: rgba(255, 255, 255, 0.95);
|
||||
z-index: 50;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
height: 44px !important; }
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
#passman-controls {
|
||||
width: 100%; } }
|
||||
@media only screen and (min-width: 768px) {
|
||||
#app-navigation + #app-content #passman-controls {
|
||||
left: 250px;
|
||||
width: calc( 100% - 250px ) !important; } }
|
||||
#passman-controls .button, #passman-controls, #passman-controls input[type='submit'], #passman-controls input[type='text'], #passman-controls input[type='password'], #passman-controls select {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
height: 36px;
|
||||
padding: 7px 10px; }
|
||||
|
||||
/*# sourceMappingURL=app.css.map */
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -123,5 +123,19 @@ jQuery(document).ready(function () {
|
|||
$(window).resize(_.debounce(adjustControlsWidth, 400));
|
||||
setTimeout(function(){
|
||||
adjustControlsWidth(true)
|
||||
},200)
|
||||
},200);
|
||||
|
||||
//@Fack this
|
||||
$(document).on('click', '#app-navigation-toggle', function(){
|
||||
setTimeout(function(){
|
||||
if($('#app-content').css('transform').toString().indexOf('matrix') >= 0){
|
||||
$('#passman-controls').css('width', 'calc( 100% - 245px)');
|
||||
$('#passman-controls').css('top', '0');
|
||||
} else {
|
||||
$('#passman-controls').css('left', 0);
|
||||
$('#passman-controls').css('top', '44px');
|
||||
$('#passman-controls').css('width', '100%');
|
||||
}
|
||||
}, 350);
|
||||
})
|
||||
});
|
||||
|
|
@ -37,7 +37,7 @@ angular.module('passmanApp')
|
|||
}
|
||||
];
|
||||
|
||||
$scope.currentTab = $scope.tabs[2];
|
||||
$scope.currentTab = $scope.tabs[0];
|
||||
|
||||
$scope.onClickTab = function (tab) {
|
||||
$scope.currentTab = tab;
|
||||
|
|
|
|||
|
|
@ -2,20 +2,27 @@
|
|||
* Created by wolfi on 25/09/16.
|
||||
*/
|
||||
angular.module('passmanApp')
|
||||
.controller('SharingSettingsCtrl', ['$scope', 'VaultService', 'CredentialService', 'SettingsService', '$location', '$routeParams', 'ShareService', function ($scope, VaultService, CredentialService, SettingsService, $location, $routeParams, ShareService) {
|
||||
$scope.active_vault = VaultService.getActiveVault();
|
||||
.controller('SharingSettingsCtrl', ['$scope', 'VaultService', 'CredentialService', 'SettingsService', '$location', '$routeParams', 'ShareService',
|
||||
function ($scope, VaultService, CredentialService, SettingsService, $location, $routeParams, ShareService) {
|
||||
$scope.active_vault = VaultService.getActiveVault();
|
||||
|
||||
$scope.generateKeys = function(length) {
|
||||
$scope.generateKeys = function (length) {
|
||||
// var rsa = ShareService.rsaKeyPairToPEM(ShareService.generateRSAKeys(length));
|
||||
ShareService.generateRSAKeys(length, function(progress){
|
||||
console.log(progress);
|
||||
}, function(kp){
|
||||
console.log(kp);
|
||||
var pem = ShareService.rsaKeyPairToPEM(kp)
|
||||
$scope.active_vault.private_sharing_key = pem.privateKey;
|
||||
$scope.active_vault.public_sharing_key = pem.publicKey;
|
||||
VaultService.updateSharingKeys($scope.active_vault).then(function (result) {
|
||||
console.log('done')
|
||||
})
|
||||
});
|
||||
// console.log(rsa);
|
||||
// $scope.active_vault.private_sharing_key = rsa.privateKey;
|
||||
// $scope.active_vault.public_sharing_key = rsa.publicKey;
|
||||
// console.log(ShareService.rsaPublicKeyFromPEM(rsa.publicKey));
|
||||
// console.log(ShareService.rsaPrivateKeyFromPEM(rsa.privateKey));
|
||||
}
|
||||
}]);
|
||||
}
|
||||
}]);
|
||||
|
|
@ -58,6 +58,16 @@ angular.module('passmanApp')
|
|||
}
|
||||
});
|
||||
},
|
||||
updateSharingKeys: function (vault) {
|
||||
var queryUrl = OC.generateUrl('apps/passman/api/v2/vaults/' + vault.vault_id +'/sharing-keys');
|
||||
return $http.post(queryUrl, vault).then(function (response) {
|
||||
if(response.data){
|
||||
return response.data;
|
||||
} else {
|
||||
return response;
|
||||
}
|
||||
});
|
||||
},
|
||||
deleteVault: function (vault) {
|
||||
var queryUrl = OC.generateUrl('apps/passman/api/v2/vaults/' + vault.vault_id);
|
||||
return $http.delete(queryUrl).then(function (response) {
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ angular.module('views/share_credential.html', []).run(['$templateCache', functio
|
|||
angular.module('views/show_vault.html', []).run(['$templateCache', function($templateCache) {
|
||||
'use strict';
|
||||
$templateCache.put('views/show_vault.html',
|
||||
'<div id="controls"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last"><a>{{active_vault.name}}</a></div></div></div><div class="actions creatable"><span ng-click="menuOpen = !menuOpen" class="button new" ng-init="menuOpen = false" off-click="menuOpen = false;"><span>+</span></span><div class="actionList popovermenu bubble menu" ng-show="menuOpen"><ul><li><span ng-click="addCredential()" class="menuitem action"><span class="icon icon-rename"></span> <span>New credential</span></span></li><li><span href="#" class="menuitem action"><span class="icon icon-shared"></span> <span>New shared credential</span></span>w</li></ul></div><div class="searchboxContainer"><input type="text" ng-model="filterOptions.filterText" class="searchbox" placeholder="Search credential..."></div><span class="title" ng-if="delete_time">Showing deleted since: <span ng-if="delete_time == 1">All time</span> <span ng-if="delete_time > 1">{{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></span></div></div><div off-click="closeSelected()"><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="credential in credentials | credentialSearch:filterOptions | tagFilter:selectedtags | as:this:\'filtered_credentials\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{credential.label}}</span> <span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{tag.text}}</span></span></td></tr></table><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><table><tr ng-show="selectedCredential.label"><td>Label</td><td>{{selectedCredential.label}}</td></tr><tr ng-show="selectedCredential.username"><td>Account</td><td><span credential-field value="selectedCredential.username"></span></td></tr><tr ng-show="selectedCredential.password"><td>Password</td><td><span credential-field value="selectedCredential.password" secret="\'true\'"></span></td></tr><tr ng-show="selectedCredential.otp.secret"><td>OTP</td><td><span otp-generator secret="selectedCredential.otp.secret"></span></td></tr><tr ng-show="selectedCredential.email"><td>E-mail</td><td><span credential-field value="selectedCredential.email"></span></td></tr><tr ng-show="selectedCredential.url"><td>URL</td><td><span credential-field value="selectedCredential.url"></span></td></tr><tr ng-show="selectedCredential.files.length > 0"><td>Files</td><td><div ng-repeat="file in selectedCredential.files" class="link" ng-click="downloadFile(file)">{{file.filename}} ({{file.size | bytes}})</div></td></tr><tr ng-repeat="field in selectedCredential.custom_fields"><td>{{field.label}}</td><td><span credential-field value="field.value" secret="field.secret"></span></td></tr><tr ng-show="selectedCredential.expire_time > 0"><td>Expire time</td><td>{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr><tr ng-show="selectedCredential.changed"><td>Changed</td><td>{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr><tr ng-show="selectedCredential.created"><td>Created</td><td>{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr></table><div class="tags"><span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span></div><div ng-show="selectedCredential"><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-edit"></span> Edit</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-trash"></span> Delete</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-share"></span> Share</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-undo"></span> Revisions</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential)"><span class="fa fa-recycle"></span> Recover</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> Destroy</button></div></div></div>');
|
||||
'<div id="passman-controls"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a><i class="fa fa-home"></i></a></div><div class="crumb svg last"><a>{{active_vault.name}}</a></div></div></div><div class="actions creatable"><span ng-click="menuOpen = !menuOpen" class="button new" ng-init="menuOpen = false" off-click="menuOpen = false;"><span>+</span></span><div class="actionList popovermenu bubble menu" ng-show="menuOpen"><ul><li><span ng-click="addCredential()" class="menuitem action"><span class="icon icon-rename"></span> <span>New credential</span></span></li><li><span href="#" class="menuitem action"><span class="icon icon-shared"></span> <span>New shared credential</span></span>w</li></ul></div><span class="title" ng-if="delete_time">Showing deleted since: <span ng-if="delete_time == 1">All time</span> <span ng-if="delete_time > 1">{{delete_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></span></div><div class="searchboxContainer"><input type="text" ng-model="filterOptions.filterText" class="searchbox" placeholder="Search credential..."></div></div><div off-click="closeSelected()"><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="credential in credentials | credentialSearch:filterOptions | tagFilter:selectedtags | as:this:\'filtered_credentials\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{credential.label}}</span> <span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{tag.text}}</span></span></td></tr></table><div id="app-sidebar" class="detailsView scroll-container app_sidebar" ng-show="selectedCredential"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><table><tr ng-show="selectedCredential.label"><td>Label</td><td>{{selectedCredential.label}}</td></tr><tr ng-show="selectedCredential.username"><td>Account</td><td><span credential-field value="selectedCredential.username"></span></td></tr><tr ng-show="selectedCredential.password"><td>Password</td><td><span credential-field value="selectedCredential.password" secret="\'true\'"></span></td></tr><tr ng-show="selectedCredential.otp.secret"><td>OTP</td><td><span otp-generator secret="selectedCredential.otp.secret"></span></td></tr><tr ng-show="selectedCredential.email"><td>E-mail</td><td><span credential-field value="selectedCredential.email"></span></td></tr><tr ng-show="selectedCredential.url"><td>URL</td><td><span credential-field value="selectedCredential.url"></span></td></tr><tr ng-show="selectedCredential.files.length > 0"><td>Files</td><td><div ng-repeat="file in selectedCredential.files" class="link" ng-click="downloadFile(file)">{{file.filename}} ({{file.size | bytes}})</div></td></tr><tr ng-repeat="field in selectedCredential.custom_fields"><td>{{field.label}}</td><td><span credential-field value="field.value" secret="field.secret"></span></td></tr><tr ng-show="selectedCredential.expire_time > 0"><td>Expire time</td><td>{{selectedCredential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr><tr ng-show="selectedCredential.changed"><td>Changed</td><td>{{selectedCredential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr><tr ng-show="selectedCredential.created"><td>Created</td><td>{{selectedCredential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td></tr></table><div class="tags"><span class="tag" ng-repeat="tag in selectedCredential.tags">{{tag.text}}</span></div><div ng-show="selectedCredential"><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-edit"></span> Edit</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-trash"></span> Delete</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-share"></span> Share</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0"><span class="fa fa-undo"></span> Revisions</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential)"><span class="fa fa-recycle"></span> Recover</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> Destroy</button></div></div></div>');
|
||||
}]);
|
||||
|
||||
angular.module('views/vaults.html', []).run(['$templateCache', function($templateCache) {
|
||||
|
|
|
|||
|
|
@ -55,4 +55,13 @@ class VaultMapper extends Mapper {
|
|||
$vault->setlastAccess(time());
|
||||
$this->update($vault);
|
||||
}
|
||||
|
||||
public function updateSharingKeys($vault_id, $privateKey, $publicKey){
|
||||
$vault = new Vault();
|
||||
$vault->setId($vault_id);
|
||||
$vault->setPrivateSharingKey($privateKey);
|
||||
$vault->setPublicSharingKey($publicKey);
|
||||
$vault->setSharingKeysGenerated($this->utils->getTime());
|
||||
$this->update($vault);
|
||||
}
|
||||
}
|
||||
|
|
@ -36,4 +36,8 @@ class VaultService {
|
|||
public function setLastAccess($vault_id){
|
||||
return $this->vaultMapper->setLastAccess($vault_id);
|
||||
}
|
||||
|
||||
public function updateSharingKeys($vault_id, $privateKey, $publicKey){
|
||||
return $this->vaultMapper->updateSharingKeys($vault_id, $privateKey, $publicKey);
|
||||
}
|
||||
}
|
||||
|
|
@ -31,4 +31,47 @@
|
|||
margin-left: 0 !important;
|
||||
margin-right: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
#app-content #app-content-wrapper #passman-controls {
|
||||
border-bottom: 1px solid #c9c9c9;
|
||||
}
|
||||
|
||||
|
||||
#passman-controls {
|
||||
box-sizing: border-box;
|
||||
position: fixed;
|
||||
top: 45px;
|
||||
right: 0;
|
||||
left: 0;
|
||||
|
||||
padding: 0 !important;
|
||||
margin: 0;
|
||||
background-color: rgba(255, 255, 255, .95);
|
||||
z-index: 50;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
height: 44px !important;
|
||||
}
|
||||
@media only screen and (max-width: 768px){
|
||||
#passman-controls{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 768px){
|
||||
#app-navigation+#app-content #passman-controls {
|
||||
left: 250px;
|
||||
width: calc( 100% - 250px ) !important;
|
||||
}
|
||||
}
|
||||
#passman-controls .button, #passman-controls, #passman-controls input[type='submit'], #passman-controls input[type='text'], #passman-controls input[type='password'], #passman-controls select {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
height: 36px;
|
||||
padding: 7px 10px;
|
||||
}
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
border-bottom: 1px solid #c9c9c9
|
||||
}
|
||||
.actions.creatable {
|
||||
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
.bubble {
|
||||
position: relative;
|
||||
|
|
@ -34,17 +34,16 @@
|
|||
display: inline-block;
|
||||
font-weight: bold;
|
||||
}
|
||||
.searchboxContainer{
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 0;
|
||||
|
||||
|
||||
.searchbox{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
.searchboxContainer{
|
||||
display: inline-block;
|
||||
margin-right: 14px;
|
||||
float: right;
|
||||
.searchbox{
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
}
|
||||
.credential-table {
|
||||
width: 100%;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div id="controls">
|
||||
<div id="passman-controls">
|
||||
<div class="breadcrumb">
|
||||
<div class="breadcrumb">
|
||||
<div class="crumb svg ui-droppable" data-dir="/">
|
||||
|
|
@ -32,10 +32,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="searchboxContainer">
|
||||
<input type="text" ng-model="filterOptions.filterText" class="searchbox"
|
||||
placeholder="Search credential...">
|
||||
</div>
|
||||
|
||||
<span class="title" ng-if="delete_time">
|
||||
Showing deleted since:
|
||||
<span ng-if="delete_time == 1">All time</span>
|
||||
|
|
@ -43,6 +40,10 @@
|
|||
|
||||
</span>
|
||||
</div>
|
||||
<div class="searchboxContainer">
|
||||
<input type="text" ng-model="filterOptions.filterText" class="searchbox"
|
||||
placeholder="Search credential...">
|
||||
</div>
|
||||
</div>
|
||||
<div off-click="closeSelected()">
|
||||
<table class="credential-table" ng-init="menuOpen = false;">
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue