]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/dc/TokenView.js
ui: user view: show tfa lock status
[pve-manager.git] / www / manager6 / dc / TokenView.js
CommitLineData
c831fbde
FG
1Ext.define('PVE.dc.TokenView', {
2 extend: 'Ext.grid.GridPanel',
c831fbde
FG
3 alias: ['widget.pveTokenView'],
4
5 onlineHelp: 'chapter_user_management',
6
7 stateful: true,
8 stateId: 'grid-tokens',
9
10 // use fixed user
e3372697 11 fixedUser: undefined,
c831fbde 12
48a66a12
TL
13 initComponent: function() {
14 let me = this;
e3372697 15
48a66a12 16 let caps = Ext.state.Manager.get('GuiCap');
c831fbde 17
48a66a12 18 let store = new Ext.data.Store({
c831fbde
FG
19 id: "tokens",
20 model: 'pve-tokens',
48a66a12 21 sorters: 'id',
c831fbde
FG
22 });
23
48a66a12 24 let reload = function() {
e3372697
FG
25 if (me.fixedUser) {
26 Proxmox.Utils.API2Request({
48a66a12 27 url: `/access/users/${encodeURIComponent(me.fixedUser)}/token`,
e3372697
FG
28 method: 'GET',
29 failure: function(response, opts) {
30 Proxmox.Utils.setErrorMask(me, response.htmlStatus);
31 me.load_task.delay(me.load_delay);
32 },
33 success: function(response, opts) {
34 Proxmox.Utils.setErrorMask(me, false);
48a66a12
TL
35 let result = Ext.decode(response.responseText);
36 let data = result.data || [];
37 let records = [];
e3372697 38 Ext.Array.each(data, function(token) {
48a66a12 39 let r = {};
e3372697
FG
40 r.id = me.fixedUser + '!' + token.tokenid;
41 r.userid = me.fixedUser;
c831fbde
FG
42 r.tokenid = token.tokenid;
43 r.comment = token.comment;
44 r.expire = token.expire;
48a66a12 45 r.privsep = token.privsep === 1;
c831fbde
FG
46 records.push(r);
47 });
e3372697
FG
48 store.loadData(records);
49 },
50 });
48a66a12 51 return;
e3372697 52 }
48a66a12
TL
53 Proxmox.Utils.API2Request({
54 url: '/access/users/?full=1',
55 method: 'GET',
56 failure: function(response, opts) {
57 Proxmox.Utils.setErrorMask(me, response.htmlStatus);
58 me.load_task.delay(me.load_delay);
59 },
60 success: function(response, opts) {
61 Proxmox.Utils.setErrorMask(me, false);
62 let result = Ext.decode(response.responseText);
63 let data = result.data || [];
64 let records = [];
65 Ext.Array.each(data, function(user) {
66 let tokens = user.tokens || [];
67 Ext.Array.each(tokens, function(token) {
68 let r = {};
69 r.id = user.userid + '!' + token.tokenid;
70 r.userid = user.userid;
71 r.tokenid = token.tokenid;
72 r.comment = token.comment;
73 r.expire = token.expire;
74 r.privsep = token.privsep === 1;
75 records.push(r);
76 });
77 });
78 store.loadData(records);
79 },
80 });
c831fbde
FG
81 };
82
48a66a12 83 let sm = Ext.create('Ext.selection.RowModel', {});
c831fbde 84
48a66a12
TL
85 let urlFromRecord = (rec) => {
86 let uid = encodeURIComponent(rec.data.userid);
87 let tid = encodeURIComponent(rec.data.tokenid);
88 return `/access/users/${uid}/token/${tid}`;
89 };
90
91 let run_editor = function(rec) {
92 if (!caps.access['User.Modify']) {
c831fbde
FG
93 return;
94 }
95
48a66a12
TL
96 let win = Ext.create('PVE.dc.TokenEdit', {
97 method: 'PUT',
98 url: urlFromRecord(rec),
99 });
100 win.setValues(rec.data);
101 win.on('destroy', reload);
102 win.show();
c831fbde
FG
103 };
104
48a66a12 105 let tbar = [
c831fbde
FG
106 {
107 text: gettext('Add'),
108 disabled: !caps.access['User.Modify'],
48a66a12
TL
109 handler: function(btn, e, rec) {
110 let data = {};
e3372697
FG
111 if (me.fixedUser) {
112 data.userid = me.fixedUser;
113 data.fixedUser = true;
114 } else if (rec && rec.data) {
c831fbde
FG
115 data.userid = rec.data.userid;
116 }
48a66a12
TL
117 let win = Ext.create('PVE.dc.TokenEdit', {
118 isCreate: true,
119 fixedUser: me.fixedUser,
120 });
121 win.setValues(data);
c831fbde
FG
122 win.on('destroy', reload);
123 win.show();
48a66a12 124 },
c831fbde 125 },
48a66a12
TL
126 {
127 xtype: 'proxmoxButton',
128 text: gettext('Edit'),
129 disabled: true,
130 enableFn: (rec) => !!caps.access['User.Modify'],
131 selModel: sm,
132 handler: (btn, e, rec) => run_editor(rec),
133 },
134 {
135 xtype: 'proxmoxStdRemoveButton',
136 selModel: sm,
137 enableFn: (rec) => !!caps.access['User.Modify'],
138 callback: reload,
139 getUrl: urlFromRecord,
140 },
141 '-',
142 {
143 xtype: 'proxmoxButton',
144 text: gettext('Show Permissions'),
145 disabled: true,
146 selModel: sm,
147 handler: function(btn, event, rec) {
148 Ext.create('PVE.dc.PermissionView', {
149 autoShow: true,
150 userid: rec.data.id,
151 });
152 },
153 },
c831fbde
FG
154 ];
155
c831fbde
FG
156 Ext.apply(me, {
157 store: store,
158 selModel: sm,
159 tbar: tbar,
160 viewConfig: {
48a66a12 161 trackOver: false,
c831fbde
FG
162 },
163 columns: [
164 {
165 header: gettext('User name'),
e3372697 166 dataIndex: 'userid',
48a66a12
TL
167 renderer: (uid) => {
168 let realmIndex = uid.lastIndexOf('@');
1011b569
DC
169 let user = Ext.String.htmlEncode(uid.substr(0, realmIndex));
170 let realm = Ext.String.htmlEncode(uid.substr(realmIndex));
48a66a12
TL
171 return `${user} <span style='float:right;'>${realm}</span>`;
172 },
173 hidden: !!me.fixedUser,
174 flex: 2,
c831fbde
FG
175 },
176 {
48a66a12
TL
177 header: gettext('Token Name'),
178 dataIndex: 'tokenid',
179 hideable: false,
180 flex: 1,
c831fbde
FG
181 },
182 {
183 header: gettext('Expire'),
48a66a12
TL
184 dataIndex: 'expire',
185 hideable: false,
c831fbde 186 renderer: Proxmox.Utils.format_expire,
48a66a12 187 flex: 1,
c831fbde
FG
188 },
189 {
190 header: gettext('Comment'),
c831fbde 191 dataIndex: 'comment',
48a66a12
TL
192 renderer: Ext.String.htmlEncode,
193 flex: 3,
c831fbde
FG
194 },
195 {
196 header: gettext('Privilege Separation'),
48a66a12
TL
197 dataIndex: 'privsep',
198 hideable: false,
c831fbde 199 renderer: Proxmox.Utils.format_boolean,
48a66a12 200 flex: 1,
c831fbde
FG
201 },
202 ],
203 listeners: {
204 activate: reload,
48a66a12
TL
205 itemdblclick: (view, rec) => run_editor(rec),
206 },
c831fbde
FG
207 });
208
e3372697
FG
209 if (me.fixedUser) {
210 reload();
211 }
212
213 me.callParent();
48a66a12 214 },
e3372697
FG
215});
216
217Ext.define('PVE.window.TokenView', {
218 extend: 'Ext.window.Window',
48a66a12 219 mixins: ['Proxmox.Mixin.CBind'],
e3372697
FG
220
221 modal: true,
e3372697
FG
222 subject: gettext('API Tokens'),
223 scrollable: true,
224 layout: 'fit',
225 width: 800,
226 height: 400,
48a66a12
TL
227 cbind: {
228 title: gettext('API Tokens') + ' - {userid}',
229 },
230 items: [{
231 xtype: 'pveTokenView',
232 cbind: {
233 fixedUser: '{userid}',
234 },
235 }],
c831fbde 236});