]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/UserView.js
ui: user view: show tfa lock status
[pve-manager.git] / www / manager6 / dc / UserView.js
1 Ext.define('PVE.dc.UserView', {
2 extend: 'Ext.grid.GridPanel',
3
4 alias: ['widget.pveUserView'],
5
6 onlineHelp: 'pveum_users',
7
8 stateful: true,
9 stateId: 'grid-users',
10
11 initComponent: function() {
12 var me = this;
13
14 var caps = Ext.state.Manager.get('GuiCap');
15
16 var store = new Ext.data.Store({
17 id: "users",
18 model: 'pmx-users',
19 sorters: {
20 property: 'userid',
21 direction: 'ASC',
22 },
23 });
24 let reload = () => store.load();
25
26 let sm = Ext.create('Ext.selection.RowModel', {});
27
28 let remove_btn = Ext.create('Proxmox.button.StdRemoveButton', {
29 selModel: sm,
30 baseurl: '/access/users/',
31 dangerous: true,
32 enableFn: rec => caps.access['User.Modify'] && rec.data.userid !== 'root@pam',
33 callback: () => reload(),
34 });
35 let run_editor = function() {
36 var rec = sm.getSelection()[0];
37 if (!rec || !caps.access['User.Modify']) {
38 return;
39 }
40 Ext.create('PVE.dc.UserEdit', {
41 userid: rec.data.userid,
42 autoShow: true,
43 listeners: {
44 destroy: () => reload(),
45 },
46 });
47 };
48 let edit_btn = new Proxmox.button.Button({
49 text: gettext('Edit'),
50 disabled: true,
51 enableFn: function(rec) {
52 return !!caps.access['User.Modify'];
53 },
54 selModel: sm,
55 handler: run_editor,
56 });
57 let pwchange_btn = new Proxmox.button.Button({
58 text: gettext('Password'),
59 disabled: true,
60 selModel: sm,
61 enableFn: function(record) {
62 let type = record.data['realm-type'];
63 if (type) {
64 if (PVE.Utils.authSchema[type]) {
65 return !!PVE.Utils.authSchema[type].pwchange;
66 }
67 }
68 return false;
69 },
70 handler: function(btn, event, rec) {
71 Ext.create('Proxmox.window.PasswordEdit', {
72 userid: rec.data.userid,
73 autoShow: true,
74 listeners: {
75 destroy: () => reload(),
76 },
77 });
78 },
79 });
80
81 var perm_btn = new Proxmox.button.Button({
82 text: gettext('Permissions'),
83 disabled: true,
84 selModel: sm,
85 handler: function(btn, event, rec) {
86 Ext.create('PVE.dc.PermissionView', {
87 userid: rec.data.userid,
88 autoShow: true,
89 listeners: {
90 destroy: () => reload(),
91 },
92 });
93 },
94 });
95
96 Ext.apply(me, {
97 store: store,
98 selModel: sm,
99 tbar: [
100 {
101 text: gettext('Add'),
102 disabled: !caps.access['User.Modify'],
103 handler: function() {
104 Ext.create('PVE.dc.UserEdit', {
105 autoShow: true,
106 listeners: {
107 destroy: () => reload(),
108 },
109 });
110 },
111 },
112 '-',
113 edit_btn,
114 remove_btn,
115 '-',
116 pwchange_btn,
117 '-',
118 perm_btn,
119 ],
120 viewConfig: {
121 trackOver: false,
122 },
123 columns: [
124 {
125 header: gettext('User name'),
126 width: 200,
127 sortable: true,
128 renderer: Proxmox.Utils.render_username,
129 dataIndex: 'userid',
130 },
131 {
132 header: gettext('Realm'),
133 width: 100,
134 sortable: true,
135 renderer: Proxmox.Utils.render_realm,
136 dataIndex: 'userid',
137 },
138 {
139 header: gettext('Enabled'),
140 width: 80,
141 sortable: true,
142 renderer: Proxmox.Utils.format_boolean,
143 dataIndex: 'enable',
144 },
145 {
146 header: gettext('Expire'),
147 width: 80,
148 sortable: true,
149 renderer: Proxmox.Utils.format_expire,
150 dataIndex: 'expire',
151 },
152 {
153 header: gettext('Name'),
154 width: 150,
155 sortable: true,
156 renderer: PVE.Utils.render_full_name,
157 dataIndex: 'firstname',
158 },
159 {
160 header: 'TFA',
161 width: 120,
162 sortable: true,
163 renderer: function(v, metaData, record) {
164 let tfa_type = PVE.Parser.parseTfaType(v);
165 if (tfa_type === undefined) {
166 return Proxmox.Utils.noText;
167 }
168
169 if (tfa_type !== 1) {
170 return tfa_type;
171 }
172
173 let locked_until = record.data['tfa-locked-until'];
174 if (locked_until !== undefined) {
175 let now = new Date().getTime() / 1000;
176 if (locked_until > now) {
177 return gettext('Locked');
178 }
179 }
180
181 if (record.data['totp-locked']) {
182 return gettext('TOTP Locked');
183 }
184
185 return Proxmox.Utils.yesText;
186 },
187 dataIndex: 'keys',
188 },
189 {
190 header: gettext('Comment'),
191 sortable: false,
192 renderer: Ext.String.htmlEncode,
193 dataIndex: 'comment',
194 flex: 1,
195 },
196 ],
197 listeners: {
198 activate: reload,
199 itemdblclick: run_editor,
200 },
201 });
202
203 me.callParent();
204
205 Proxmox.Utils.monStoreErrors(me, store);
206 },
207 });