]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/LoginWindow.js
fix #2745: ui: backup window: allow specifying remove parameter for manual backup
[pve-manager.git] / www / manager6 / window / LoginWindow.js
CommitLineData
6a1c9c29 1/*global u2f*/
88d5be7d
DM
2Ext.define('PVE.window.LoginWindow', {
3 extend: 'Ext.window.Window',
4
04237985
DM
5 controller: {
6
7 xclass: 'Ext.app.ViewController',
da096950
DM
8
9 onLogon: function() {
10 var me = this;
11
12 var form = this.lookupReference('loginForm');
65532495
DC
13 var unField = this.lookupReference('usernameField');
14 var saveunField = this.lookupReference('saveunField');
da096950
DM
15 var view = this.getView();
16
24d2ed8c
WB
17 if (!form.isValid()) {
18 return;
19 }
20
24d2ed8c
WB
21 view.el.mask(gettext('Please wait...'), 'x-mask-loading');
22
23 // set or clear username
24 var sp = Ext.state.Manager.getProvider();
25 if (saveunField.getValue() === true) {
26 sp.set(unField.getStateId(), unField.getValue());
27 } else {
28 sp.clear(unField.getStateId());
29 }
30 sp.set(saveunField.getStateId(), saveunField.getValue());
31
32 form.submit({
8058410f 33 failure: function(f, resp) {
4c86db12 34 me.failure(resp);
24d2ed8c 35 },
8058410f 36 success: function(f, resp) {
24d2ed8c 37 view.el.unmask();
da096950 38
24d2ed8c 39 var data = resp.result.data;
313eb589
WB
40 if (Ext.isDefined(data.NeedTFA)) {
41 // Store first factor login information first:
42 data.LoggedOut = true;
43 Proxmox.Utils.setAuthData(data);
44
45 if (Ext.isDefined(data.U2FChallenge)) {
46 me.perform_u2f(data);
47 } else {
48 me.perform_otp();
49 }
24d2ed8c 50 } else {
4c86db12 51 me.success(data);
24d2ed8c 52 }
f6710aac 53 },
24d2ed8c 54 });
4c86db12
TL
55 },
56 failure: function(resp) {
57 var me = this;
58 var view = me.getView();
59 view.el.unmask();
60 var handler = function() {
61 var uf = me.lookupReference('usernameField');
62 uf.focus(true, true);
24d2ed8c 63 };
65532495 64
f41b67ab
OB
65 let emsg = gettext("Login failed. Please try again");
66
67 if (resp.failureType === "connect") {
e5d8aebb 68 emsg = gettext("Connection failure. Network error or Proxmox VE services not running?");
f41b67ab
OB
69 }
70
71 Ext.MessageBox.alert(gettext('Error'), emsg, handler);
4c86db12
TL
72 },
73 success: function(data) {
74 var me = this;
75 var view = me.getView();
76 var handler = view.handler || Ext.emptyFn;
77 handler.call(me, data);
78 view.close();
79 },
80
313eb589
WB
81 perform_otp: function() {
82 var me = this;
83 var win = Ext.create('PVE.window.TFALoginWindow', {
84 onLogin: function(value) {
85 me.finish_tfa(value);
86 },
87 onCancel: function() {
88 Proxmox.LoggedOut = false;
89 Proxmox.Utils.authClear();
90 me.getView().show();
f6710aac 91 },
313eb589
WB
92 });
93 win.show();
94 },
95
4c86db12
TL
96 perform_u2f: function(data) {
97 var me = this;
4c86db12
TL
98 // Show the message:
99 var msg = Ext.Msg.show({
100 title: 'U2F: '+gettext('Verification'),
101 message: gettext('Please press the button on your U2F Device'),
f6710aac 102 buttons: [],
4c86db12
TL
103 });
104 var chlg = data.U2FChallenge;
105 var key = {
106 version: chlg.version,
f6710aac 107 keyHandle: chlg.keyHandle,
24d2ed8c 108 };
4c86db12
TL
109 u2f.sign(chlg.appId, chlg.challenge, [key], function(res) {
110 msg.close();
111 if (res.errorCode) {
112 Proxmox.Utils.authClear();
2d41c7e6 113 Ext.Msg.alert(gettext('Error'), PVE.Utils.render_u2f_error(res.errorCode));
4c86db12
TL
114 return;
115 }
116 delete res.errorCode;
313eb589 117 me.finish_tfa(JSON.stringify(res));
4c86db12
TL
118 });
119 },
313eb589 120 finish_tfa: function(res) {
4c86db12
TL
121 var me = this;
122 var view = me.getView();
123 view.el.mask(gettext('Please wait...'), 'x-mask-loading');
313eb589 124 var params = { response: res };
4c86db12
TL
125 Proxmox.Utils.API2Request({
126 url: '/api2/extjs/access/tfa',
127 params: params,
128 method: 'POST',
129 timeout: 5000, // it'll delay both success & failure
130 success: function(resp, opts) {
131 view.el.unmask();
132 // Fill in what we copy over from the 1st factor:
133 var data = resp.result.data;
134 data.CSRFPreventionToken = Proxmox.CSRFPreventionToken;
135 data.username = Proxmox.UserName;
136 // Finish logging in:
137 me.success(data);
138 },
139 failure: function(resp, opts) {
140 Proxmox.Utils.authClear();
141 me.failure(resp);
f6710aac 142 },
4c86db12 143 });
da096950
DM
144 },
145
146 control: {
147 'field[name=username]': {
148 specialkey: function(f, e) {
149 if (e.getKey() === e.ENTER) {
150 var pf = this.lookupReference('passwordField');
26031ab1 151 if (!pf.getValue()) {
da096950
DM
152 pf.focus(false);
153 }
154 }
f6710aac 155 },
da096950 156 },
da096950
DM
157 'field[name=lang]': {
158 change: function(f, value) {
159 var dt = Ext.Date.add(new Date(), Ext.Date.YEAR, 10);
160 Ext.util.Cookies.set('PVELangCookie', value, dt);
161 this.getView().mask(gettext('Please wait...'), 'x-mask-loading');
162 window.location.reload();
f6710aac 163 },
da096950
DM
164 },
165 'button[reference=loginButton]': {
f6710aac 166 click: 'onLogon',
65532495
DC
167 },
168 '#': {
169 show: function() {
170 var sp = Ext.state.Manager.getProvider();
171 var checkboxField = this.lookupReference('saveunField');
172 var unField = this.lookupReference('usernameField');
173
174 var checked = sp.get(checkboxField.getStateId());
175 checkboxField.setValue(checked);
176
8058410f 177 if (checked === true) {
65532495 178 var username = sp.get(unField.getStateId());
65532495
DC
179 unField.setValue(username);
180 var pwField = this.lookupReference('passwordField');
181 pwField.focus();
182 }
f6710aac
TL
183 },
184 },
185 },
04237985 186 },
da096950 187
3262415b 188 width: 400,
3262415b 189 modal: true,
3262415b 190 border: false,
3262415b 191 draggable: true,
3262415b 192 closable: false,
3262415b 193 resizable: false,
3262415b
DM
194 layout: 'auto',
195
196 title: gettext('Proxmox VE Login'),
197
a765aeca 198 defaultFocus: 'usernameField',
551456ff
DC
199 defaultButton: 'loginButton',
200
da096950
DM
201 items: [{
202 xtype: 'form',
203 layout: 'form',
204 url: '/api2/extjs/access/ticket',
205 reference: 'loginForm',
206
207 fieldDefaults: {
208 labelAlign: 'right',
f6710aac 209 allowBlank: false,
da096950
DM
210 },
211
212 items: [
213 {
214 xtype: 'textfield',
215 fieldLabel: gettext('User name'),
216 name: 'username',
a765aeca 217 itemId: 'usernameField',
da096950 218 reference: 'usernameField',
f6710aac 219 stateId: 'login-username',
da096950
DM
220 },
221 {
222 xtype: 'textfield',
223 inputType: 'password',
224 fieldLabel: gettext('Password'),
225 name: 'password',
f6710aac 226 reference: 'passwordField',
da096950 227 },
da096950 228 {
2892e744 229 xtype: 'pmxRealmComboBox',
f6710aac 230 name: 'realm',
da096950
DM
231 },
232 {
14580653 233 xtype: 'proxmoxLanguageSelector',
da096950 234 fieldLabel: gettext('Language'),
f4aa76c5 235 value: Ext.util.Cookies.get('PVELangCookie') || Proxmox.defaultLang || 'en',
da096950
DM
236 name: 'lang',
237 reference: 'langField',
f6710aac
TL
238 submitValue: false,
239 },
da096950
DM
240 ],
241 buttons: [
65532495
DC
242 {
243 xtype: 'checkbox',
244 fieldLabel: gettext('Save User name'),
245 name: 'saveusername',
246 reference: 'saveunField',
247 stateId: 'login-saveusername',
ecf4b557 248 labelWidth: 250,
65532495 249 labelAlign: 'right',
f6710aac 250 submitValue: false,
65532495 251 },
da096950
DM
252 {
253 text: gettext('Login'),
f6710aac
TL
254 reference: 'loginButton',
255 },
256 ],
257 }],
da096950 258 });
313eb589
WB
259Ext.define('PVE.window.TFALoginWindow', {
260 extend: 'Ext.window.Window',
261
262 modal: true,
263 resizable: false,
1102bcb1 264 title: 'Two-Factor Authentication',
313eb589
WB
265 layout: 'form',
266 defaultButton: 'loginButton',
267 defaultFocus: 'otpField',
268
269 controller: {
270 xclass: 'Ext.app.ViewController',
271 login: function() {
272 var me = this;
273 var view = me.getView();
6db00a09 274 view.onLogin(me.lookup('otpField').getValue());
313eb589
WB
275 view.close();
276 },
277 cancel: function() {
278 var me = this;
279 var view = me.getView();
280 view.onCancel();
281 view.close();
f6710aac 282 },
313eb589
WB
283 },
284
285 items: [
286 {
287 xtype: 'textfield',
1102bcb1 288 fieldLabel: gettext('Please enter your OTP verification code:'),
313eb589
WB
289 name: 'otp',
290 itemId: 'otpField',
291 reference: 'otpField',
f6710aac
TL
292 allowBlank: false,
293 },
313eb589
WB
294 ],
295
296 buttons: [
297 {
298 text: gettext('Login'),
299 reference: 'loginButton',
f6710aac 300 handler: 'login',
313eb589
WB
301 },
302 {
303 text: gettext('Cancel'),
f6710aac
TL
304 handler: 'cancel',
305 },
306 ],
313eb589 307});