]>
Commit | Line | Data |
---|---|---|
c831fbde FG |
1 | Ext.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 | ||
217 | Ext.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 | }); |