]> git.proxmox.com Git - pmg-gui.git/blame - js/LoginView.js
fix #5251: login: set autocomplete on password and user
[pmg-gui.git] / js / LoginView.js
CommitLineData
cd6bb503
DC
1Ext.define('PMG.LoginView', {
2 extend: 'Ext.container.Container',
3 xtype: 'loginview',
4
5 controller: {
6 xclass: 'Ext.app.ViewController',
4bc1cbd8
DM
7
8 init: function(view) {
28eb60c0 9 let me = this;
c1e4fa2a 10
28eb60c0 11 let realmfield = me.lookup('realmfield');
c1e4fa2a 12
83c036b4
DC
13 me.lookup('quarantineButton').setVisible(!!Proxmox.QuarantineLink);
14
c17f9fe4
DC
15 if (view.targetview !== 'quarantineview') {
16 return;
17 }
c1e4fa2a 18
31f5e458
DC
19 // hide save username field for quarantine view
20 me.lookup('saveunField').setVisible(false);
21
ab01cd95 22 realmfield.setValue('quarantine');
4bc1cbd8
DM
23
24 // try autologin with quarantine ticket from URL
25
28eb60c0
TL
26 let qs = Ext.Object.fromQueryString(location.search);
27 if (qs.ticket === undefined) {
28 return;
29 }
30 let ticket = decodeURIComponent(qs.ticket);
31 let match = ticket.match(/^PMGQUAR:([^\s:]+):/);
32 if (!match) {
33 return;
34 }
35 let username = match[1];
36 let loginwin = me.lookup('loginwindow');
216bbcd5
DC
37 loginwin.autoShow = false;
38 loginwin.setVisible(false);
c1e4fa2a 39 realmfield.setDisabled(true);
4bc1cbd8 40
99bba12c
DC
41 me.lookup('usernameField').setValue(username);
42 me.lookup('passwordField').setValue(ticket);
43
44 me.submitForm();
4bc1cbd8
DM
45 },
46
77854c16 47 submitForm: async function() {
28eb60c0
TL
48 let me = this;
49 let view = me.getView();
50 let loginForm = me.lookupReference('loginForm');
31f5e458
DC
51 var unField = me.lookupReference('usernameField');
52 var saveunField = me.lookupReference('saveunField');
cd6bb503
DC
53
54 if (loginForm.isValid()) {
99bba12c
DC
55 if (loginForm.isVisible()) {
56 loginForm.mask(gettext('Please wait...'), 'x-mask-loading');
57 }
31f5e458
DC
58
59 // set or clear username for admin view
60 if (view.targetview !== 'quarantineview') {
61 var sp = Ext.state.Manager.getProvider();
62 if (saveunField.getValue() === true) {
63 sp.set(unField.getStateId(), unField.getValue());
64 } else {
65 sp.clear(unField.getStateId());
66 }
67 sp.set(saveunField.getStateId(), saveunField.getValue());
68 }
69
77854c16
WB
70 let creds = loginForm.getValues();
71
72 try {
73 let resp = await Proxmox.Async.api2({
74 url: '/api2/extjs/access/ticket',
75 params: creds,
76 method: 'POST',
77 });
78
79 let data = resp.result.data;
80 if (data.ticket.startsWith('PMG:!tfa!')) {
81 data = await me.performTFAChallenge(data);
82 }
83 PMG.Utils.updateLoginData(data);
84 PMG.app.changeView(view.targetview);
85 } catch (error) {
86 Proxmox.Utils.authClear();
87 loginForm.unmask();
88 Ext.MessageBox.alert(
89 gettext('Error'),
90 gettext('Login failed. Please try again'),
91 );
92 }
cd6bb503
DC
93 }
94 },
95
77854c16
WB
96 performTFAChallenge: async function(data) {
97 let me = this;
98
99 let userid = data.username;
100 let ticket = data.ticket;
101 let challenge = JSON.parse(decodeURIComponent(
102 ticket.split(':')[1].slice("!tfa!".length),
103 ));
104
105 let resp = await new Promise((resolve, reject) => {
106 Ext.create('Proxmox.window.TfaLoginWindow', {
107 userid,
108 ticket,
109 challenge,
110 onResolve: value => resolve(value),
111 onReject: reject,
112 }).show();
113 });
114
115 return resp.result.data;
116 },
117
83c036b4
DC
118 openQuarantineLinkWindow: function() {
119 let me = this;
120 me.lookup('loginwindow').setVisible(false);
121 Ext.create('Proxmox.window.Edit', {
122 title: gettext('Request Quarantine Link'),
123 url: '/quarantine/sendlink',
124 isCreate: true,
125 submitText: gettext('OK'),
126 method: 'POST',
127 items: [
128 {
129 xtype: 'proxmoxtextfield',
130 name: 'mail',
131 fieldLabel: gettext('Your E-Mail'),
132 },
133 ],
134 listeners: {
135 destroy: function() {
136 me.lookup('loginwindow').show(true);
137 },
138 },
139 }).show();
140 },
141
cd6bb503 142 control: {
775b9a7d
DM
143 'field[name=lang]': {
144 change: function(f, value) {
28eb60c0 145 let dt = Ext.Date.add(new Date(), Ext.Date.YEAR, 10);
282d45fb 146 Ext.util.Cookies.set('PMGLangCookie', value, dt);
65921b40 147
28eb60c0 148 let loginwin = this.lookupReference('loginwindow');
65921b40 149 loginwin.mask(gettext('Please wait...'), 'x-mask-loading');
775b9a7d 150 window.location.reload();
c87d46fb 151 },
775b9a7d 152 },
83c036b4
DC
153 'button[reference=quarantineButton]': {
154 click: 'openQuarantineLinkWindow',
155 },
cd6bb503 156 'button[reference=loginButton]': {
c87d46fb
TL
157 click: 'submitForm',
158 },
31f5e458
DC
159 'window[reference=loginwindow]': {
160 show: function() {
161 let me = this;
162 let view = me.getView();
163 if (view.targetview !== 'quarantineview') {
164 var sp = Ext.state.Manager.getProvider();
165 var checkboxField = this.lookupReference('saveunField');
166 var unField = this.lookupReference('usernameField');
167
168 var checked = sp.get(checkboxField.getStateId());
169 checkboxField.setValue(checked);
170
171 if (checked === true) {
172 var username = sp.get(unField.getStateId());
173 unField.setValue(username);
174 var pwField = this.lookupReference('passwordField');
175 pwField.focus();
176 }
177 }
178 },
179 },
c87d46fb 180 },
cd6bb503
DC
181 },
182
183 plugins: 'viewport',
184
ea07c9aa 185 layout: {
c87d46fb 186 type: 'border',
ea07c9aa 187 },
cd6bb503
DC
188
189 items: [
190 {
191 region: 'north',
192 xtype: 'container',
193 layout: {
194 type: 'hbox',
c87d46fb 195 align: 'middle',
cd6bb503 196 },
c45e23e4
DC
197 margin: '2 5 2 5',
198 height: 38,
cd6bb503
DC
199 items: [
200 {
c87d46fb 201 xtype: 'proxmoxlogo',
cd6bb503
DC
202 },
203 {
204 xtype: 'versioninfo',
c87d46fb
TL
205 makeApiCall: false,
206 },
207 ],
cd6bb503
DC
208 },
209 {
c87d46fb 210 region: 'center',
cd6bb503
DC
211 },
212 {
213 xtype: 'window',
214 closable: false,
215 resizable: false,
216bbcd5 216 reference: 'loginwindow',
cd6bb503
DC
217 autoShow: true,
218 modal: true,
31f5e458 219 width: 450,
cd6bb503 220
7d48b138
DC
221 defaultFocus: 'usernameField',
222
ea07c9aa 223 layout: {
c87d46fb 224 type: 'auto',
ea07c9aa 225 },
cd6bb503
DC
226
227 title: gettext('Proxmox Mail Gateway Login'),
228
229 items: [
230 {
231 xtype: 'form',
ea07c9aa 232 layout: {
c87d46fb 233 type: 'form',
ea07c9aa 234 },
cd6bb503
DC
235 defaultButton: 'loginButton',
236 url: '/api2/extjs/access/ticket',
237 reference: 'loginForm',
238
239 fieldDefaults: {
240 labelAlign: 'right',
c87d46fb 241 allowBlank: false,
cd6bb503
DC
242 },
243
244 items: [
245 {
246 xtype: 'textfield',
247 fieldLabel: gettext('User name'),
248 name: 'username',
249 itemId: 'usernameField',
c87d46fb 250 reference: 'usernameField',
31f5e458 251 stateId: 'login-username',
e4fc927b 252 inputAttrTpl: 'autocomplete=username',
cd6bb503
DC
253 },
254 {
255 xtype: 'textfield',
256 inputType: 'password',
257 fieldLabel: gettext('Password'),
258 name: 'password',
c87d46fb 259 reference: 'passwordField',
e4fc927b 260 inputAttrTpl: 'autocomplete=current-password',
cd6bb503 261 },
775b9a7d
DM
262 {
263 xtype: 'proxmoxLanguageSelector',
264 fieldLabel: gettext('Language'),
282d45fb 265 value: Ext.util.Cookies.get('PMGLangCookie') || 'en',
775b9a7d 266 name: 'lang',
c87d46fb 267 submitValue: false,
ab01cd95
DM
268 },
269 {
270 xtype: 'hiddenfield',
271 reference: 'realmfield',
272 name: 'realm',
c87d46fb
TL
273 value: 'pmg',
274 },
cd6bb503
DC
275 ],
276 buttons: [
31f5e458
DC
277 {
278 xtype: 'checkbox',
279 fieldLabel: gettext('Save User name'),
280 name: 'saveusername',
281 reference: 'saveunField',
282 stateId: 'login-saveusername',
283 labelAlign: 'right',
284 labelWidth: 150,
285 submitValue: false,
286 },
83c036b4
DC
287 {
288 text: gettext('Request Quarantine Link'),
289 reference: 'quarantineButton',
290 },
cd6bb503
DC
291 {
292 text: gettext('Login'),
293 reference: 'loginButton',
c87d46fb
TL
294 formBind: true,
295 },
296 ],
297 },
298 ],
299 },
300 ],
cd6bb503 301});