gui: add API token ACLs
and the needed API token selector. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
b2da7fbd1c
commit
184a37635b
@ -6,6 +6,7 @@ IMAGES := \
|
|||||||
|
|
||||||
JSSRC= \
|
JSSRC= \
|
||||||
form/UserSelector.js \
|
form/UserSelector.js \
|
||||||
|
form/TokenSelector.js \
|
||||||
form/RemoteSelector.js \
|
form/RemoteSelector.js \
|
||||||
form/DataStoreSelector.js \
|
form/DataStoreSelector.js \
|
||||||
form/CalendarEvent.js \
|
form/CalendarEvent.js \
|
||||||
|
@ -31,19 +31,35 @@ Ext.define('PBS.config.ACLView', {
|
|||||||
controller: {
|
controller: {
|
||||||
xclass: 'Ext.app.ViewController',
|
xclass: 'Ext.app.ViewController',
|
||||||
|
|
||||||
addACL: function() {
|
addUserACL: function() {
|
||||||
let me = this;
|
let me = this;
|
||||||
let view = me.getView();
|
let view = me.getView();
|
||||||
Ext.create('PBS.window.ACLEdit', {
|
Ext.create('PBS.window.ACLEdit', {
|
||||||
path: view.aclPath,
|
path: view.aclPath,
|
||||||
|
aclType: 'user',
|
||||||
listeners: {
|
listeners: {
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
me.reload();
|
me.reload();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}).show();
|
}).show();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addTokenACL: function() {
|
||||||
|
let me = this;
|
||||||
|
let view = me.getView();
|
||||||
|
Ext.create('PBS.window.ACLEdit', {
|
||||||
|
path: view.aclPath,
|
||||||
|
aclType: 'token',
|
||||||
|
listeners: {
|
||||||
|
destroy: function() {
|
||||||
|
me.reload();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).show();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
removeACL: function(btn, event, rec) {
|
removeACL: function(btn, event, rec) {
|
||||||
let me = this;
|
let me = this;
|
||||||
Proxmox.Utils.API2Request({
|
Proxmox.Utils.API2Request({
|
||||||
@ -106,10 +122,22 @@ Ext.define('PBS.config.ACLView', {
|
|||||||
|
|
||||||
tbar: [
|
tbar: [
|
||||||
{
|
{
|
||||||
xtype: 'proxmoxButton',
|
|
||||||
text: gettext('Add'),
|
text: gettext('Add'),
|
||||||
handler: 'addACL',
|
menu: {
|
||||||
selModel: false,
|
xtype: 'menu',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
text: gettext('User Permission'),
|
||||||
|
iconCls: 'fa fa-fw fa-user',
|
||||||
|
handler: 'addUserACL',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: gettext('API Token Permission'),
|
||||||
|
iconCls: 'fa fa-fw fa-user-o',
|
||||||
|
handler: 'addTokenACL',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
xtype: 'proxmoxStdRemoveButton',
|
xtype: 'proxmoxStdRemoveButton',
|
||||||
@ -127,7 +155,7 @@ Ext.define('PBS.config.ACLView', {
|
|||||||
dataIndex: 'path',
|
dataIndex: 'path',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: gettext('User/Group'),
|
header: gettext('User/Group/API Token'),
|
||||||
width: 100,
|
width: 100,
|
||||||
sortable: true,
|
sortable: true,
|
||||||
renderer: Ext.String.htmlEncode,
|
renderer: Ext.String.htmlEncode,
|
||||||
|
72
www/form/TokenSelector.js
Normal file
72
www/form/TokenSelector.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
Ext.define('PBS.form.TokenSelector', {
|
||||||
|
extend: 'Proxmox.form.ComboGrid',
|
||||||
|
alias: 'widget.pbsTokenSelector',
|
||||||
|
|
||||||
|
allowBlank: false,
|
||||||
|
autoSelect: false,
|
||||||
|
valueField: 'tokenid',
|
||||||
|
displayField: 'tokenid',
|
||||||
|
|
||||||
|
editable: true,
|
||||||
|
anyMatch: true,
|
||||||
|
forceSelection: true,
|
||||||
|
|
||||||
|
store: {
|
||||||
|
model: 'pbs-tokens',
|
||||||
|
params: {
|
||||||
|
enabled: 1,
|
||||||
|
},
|
||||||
|
sorters: 'tokenid',
|
||||||
|
},
|
||||||
|
|
||||||
|
initComponent: function() {
|
||||||
|
let me = this;
|
||||||
|
me.userStore = Ext.create('Ext.data.Store', {
|
||||||
|
model: 'pbs-users-with-tokens',
|
||||||
|
});
|
||||||
|
me.userStore.on('load', this.onLoad, this);
|
||||||
|
me.userStore.load();
|
||||||
|
|
||||||
|
me.callParent();
|
||||||
|
},
|
||||||
|
|
||||||
|
onLoad: function(store, data, success) {
|
||||||
|
if (!success) return;
|
||||||
|
|
||||||
|
let tokenStore = this.store;
|
||||||
|
|
||||||
|
let records = [];
|
||||||
|
Ext.Array.each(data, function(user) {
|
||||||
|
let tokens = user.data.tokens || [];
|
||||||
|
Ext.Array.each(tokens, function(token) {
|
||||||
|
let r = {};
|
||||||
|
r.tokenid = token.tokenid;
|
||||||
|
r.comment = token.comment;
|
||||||
|
r.expire = token.expire;
|
||||||
|
r.enable = token.enable;
|
||||||
|
records.push(r);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
tokenStore.loadData(records);
|
||||||
|
},
|
||||||
|
|
||||||
|
listConfig: {
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: gettext('API Token'),
|
||||||
|
sortable: true,
|
||||||
|
dataIndex: 'tokenid',
|
||||||
|
renderer: Ext.String.htmlEncode,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: gettext('Comment'),
|
||||||
|
sortable: false,
|
||||||
|
dataIndex: 'comment',
|
||||||
|
renderer: Ext.String.htmlEncode,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
@ -14,7 +14,53 @@ Ext.define('PBS.window.ACLEdit', {
|
|||||||
// caller can give a static path
|
// caller can give a static path
|
||||||
path: undefined,
|
path: undefined,
|
||||||
|
|
||||||
subject: gettext('User Permission'),
|
initComponent: function() {
|
||||||
|
let me = this;
|
||||||
|
|
||||||
|
me.items = [];
|
||||||
|
|
||||||
|
me.items.push({
|
||||||
|
xtype: 'pbsPermissionPathSelector',
|
||||||
|
fieldLabel: gettext('Path'),
|
||||||
|
editable: !me.path,
|
||||||
|
value: me.path,
|
||||||
|
name: 'path',
|
||||||
|
allowBlank: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (me.aclType === 'user') {
|
||||||
|
me.subject = gettext('User Permission');
|
||||||
|
me.items.push({
|
||||||
|
xtype: 'pbsUserSelector',
|
||||||
|
fieldLabel: gettext('User'),
|
||||||
|
name: 'auth_id',
|
||||||
|
allowBlank: false,
|
||||||
|
});
|
||||||
|
} else if (me.aclType === 'token') {
|
||||||
|
me.subject = gettext('API Token Permission');
|
||||||
|
me.items.push({
|
||||||
|
xtype: 'pbsTokenSelector',
|
||||||
|
fieldLabel: gettext('API Token'),
|
||||||
|
name: 'auth_id',
|
||||||
|
allowBlank: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
me.items.push({
|
||||||
|
xtype: 'pmxRoleSelector',
|
||||||
|
name: 'role',
|
||||||
|
value: 'NoAccess',
|
||||||
|
fieldLabel: gettext('Role'),
|
||||||
|
});
|
||||||
|
me.items.push({
|
||||||
|
xtype: 'proxmoxcheckbox',
|
||||||
|
name: 'propagate',
|
||||||
|
checked: true,
|
||||||
|
uncheckedValue: 0,
|
||||||
|
fieldLabel: gettext('Propagate'),
|
||||||
|
});
|
||||||
|
|
||||||
|
me.callParent();
|
||||||
|
},
|
||||||
|
|
||||||
getValues: function(dirtyOnly) {
|
getValues: function(dirtyOnly) {
|
||||||
let me = this;
|
let me = this;
|
||||||
@ -26,35 +72,4 @@ Ext.define('PBS.window.ACLEdit', {
|
|||||||
return values;
|
return values;
|
||||||
},
|
},
|
||||||
|
|
||||||
items: [
|
|
||||||
{
|
|
||||||
xtype: 'pbsPermissionPathSelector',
|
|
||||||
fieldLabel: gettext('Path'),
|
|
||||||
cbind: {
|
|
||||||
editable: '{!path}',
|
|
||||||
value: '{path}',
|
|
||||||
},
|
|
||||||
name: 'path',
|
|
||||||
allowBlank: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
xtype: 'pbsUserSelector',
|
|
||||||
fieldLabel: gettext('User'),
|
|
||||||
name: 'auth_id',
|
|
||||||
allowBlank: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
xtype: 'pmxRoleSelector',
|
|
||||||
name: 'role',
|
|
||||||
value: 'NoAccess',
|
|
||||||
fieldLabel: gettext('Role'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
xtype: 'proxmoxcheckbox',
|
|
||||||
name: 'propagate',
|
|
||||||
checked: true,
|
|
||||||
uncheckedValue: 0,
|
|
||||||
fieldLabel: gettext('Propagate'),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user