]>
git.proxmox.com Git - pmg-gui.git/blob - js/UserView.js
1 Ext
.define('pmg-users', {
2 extend
: 'Ext.data.Model',
4 'userid', 'firstname', 'lastname', 'email', 'comment',
5 'role', 'keys', 'realm', 'totp-lock',
6 { type
: 'boolean', name
: 'enable' },
7 { type
: 'date', dateFormat
: 'timestamp', name
: 'expire' },
11 url
: "/api2/json/access/users",
16 Ext
.define('PMG.UserView', {
17 extend
: 'Ext.grid.GridPanel',
18 alias
: 'widget.pmgUserView',
37 xclass
: 'Ext.app.ViewController',
39 init: function(view
) {
40 Proxmox
.Utils
.monStoreErrors(view
, view
.store
);
43 renderUsername: function(userid
) {
44 return Ext
.htmlEncode(userid
.match(/^(.+)(@[^@]+)$/)[1]);
47 renderFullName: function(firstname
, metaData
, record
) {
48 var first
= firstname
|| '';
49 var last
= record
.data
.lastname
|| '';
50 return Ext
.htmlEncode(first
+ " " + last
);
54 var view
= this.getView();
56 var win
= Ext
.create('PMG.UserEdit', {});
57 win
.on('destroy', function() { view
.reload(); });
62 var view
= this.getView();
64 var rec
= view
.selModel
.getSelection()[0];
66 var win
= Ext
.create('PMG.UserEdit', {
67 userid
: rec
.data
.userid
,
69 win
.on('destroy', function() { view
.reload(); });
73 onPassword: function(btn
, event
, rec
) {
74 var view
= this.getView();
76 var win
= Ext
.create('Proxmox.window.PasswordEdit', {
77 userid
: rec
.data
.userid
,
79 win
.on('destroy', function() { view
.reload(); });
83 onAfterRemove: function(btn
, res
) {
84 var view
= this.getView();
88 onUnlockTfa: function(btn
, event
, rec
) {
90 let view
= me
.getView();
92 Ext
.String
.format(gettext('Unlock TFA authentication for {0}'), rec
.data
.userid
),
93 gettext("Locked 2nd factors can happen if the user's password was leaked. Are you sure you want to unlock the user?"),
94 function(btn_response
) {
95 if (btn_response
=== 'yes') {
96 Proxmox
.Utils
.API2Request({
97 url
: `/access/users/${rec.data.userid}/unlock-tfa`,
100 failure: function(response
, options
) {
101 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
103 success: function(response
, options
) {
115 itemdblclick
: 'onEdit',
120 text
: gettext('Add'),
125 xtype
: 'proxmoxButton',
126 text
: gettext('Edit'),
131 xtype
: 'proxmoxStdRemoveButton',
132 baseurl
: '/access/users',
133 reference
: 'removeBtn',
134 callback
: 'onAfterRemove',
138 xtype
: 'proxmoxButton',
139 text
: gettext('Password'),
141 handler
: 'onPassword',
145 xtype
: 'proxmoxButton',
146 text
: gettext('Unlock TFA'),
147 handler
: 'onUnlockTfa',
148 enableFn
: ({ data
}) =>
149 data
['totp-locked'] || (data
['tfa-locked-until'] > (new Date().getTime() / 1000)),
155 header
: gettext('User name'),
158 renderer
: 'renderUsername',
162 header
: gettext('Realm'),
168 header
: gettext('Role'),
171 renderer
: PMG
.Utils
.format_user_role
,
175 header
: gettext('Enabled'),
178 renderer
: Proxmox
.Utils
.format_boolean
,
182 header
: gettext('Expire'),
185 renderer
: Proxmox
.Utils
.format_expire
,
189 header
: gettext('Name'),
192 renderer
: 'renderFullName',
193 dataIndex
: 'firstname',
196 header
: gettext('TFA Lock'),
199 dataIndex
: 'totp-locked',
200 renderer: function(v
, metaData
, record
) {
201 let locked_until
= record
.data
['tfa-locked-until'];
202 if (locked_until
!== undefined) {
203 let now
= new Date().getTime() / 1000;
204 if (locked_until
> now
) {
205 return gettext('Locked');
209 if (record
.data
['totp-locked']) {
210 return gettext('TOTP Locked');
213 return Proxmox
.Utils
.noText
;
217 header
: gettext('Comment'),
219 renderer
: Ext
.String
.htmlEncode
,
220 dataIndex
: 'comment',