]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/LoginWindow.js
60955e0599150907b4c4309821b0b46ca797f91a
2 Ext
.define('PVE.window.LoginWindow', {
3 extend
: 'Ext.window.Window',
10 button_text: function(get) {
11 if (get("openid") === true) {
12 return gettext("Login (OpenID redirect)");
14 return gettext("Login");
22 xclass
: 'Ext.app.ViewController',
27 var form
= this.lookupReference('loginForm');
28 var unField
= this.lookupReference('usernameField');
29 var saveunField
= this.lookupReference('saveunField');
30 var view
= this.getView();
32 if (!form
.isValid()) {
36 let creds
= form
.getValues();
38 if (this.getViewModel().data
.openid
=== true) {
39 const redirectURL
= location
.origin
;
40 Proxmox
.Utils
.API2Request({
41 url
: '/api2/extjs/access/openid/auth-url',
44 "redirect-url": redirectURL
,
47 success: function(resp
, opts
) {
48 window
.location
= resp
.result
.data
;
50 failure: function(resp
, opts
) {
51 Proxmox
.Utils
.authClear();
55 gettext('OpenId redirect failed. Please try again<br>Error: ' + resp
.htmlStatus
),
62 view
.el
.mask(gettext('Please wait...'), 'x-mask-loading');
64 // set or clear username
65 var sp
= Ext
.state
.Manager
.getProvider();
66 if (saveunField
.getValue() === true) {
67 sp
.set(unField
.getStateId(), unField
.getValue());
69 sp
.clear(unField
.getStateId());
71 sp
.set(saveunField
.getStateId(), saveunField
.getValue());
74 failure: function(f
, resp
) {
77 success: function(f
, resp
) {
80 var data
= resp
.result
.data
;
81 if (Ext
.isDefined(data
.NeedTFA
)) {
82 // Store first factor login information first:
83 data
.LoggedOut
= true;
84 Proxmox
.Utils
.setAuthData(data
);
86 if (Ext
.isDefined(data
.U2FChallenge
)) {
97 failure: function(resp
) {
99 var view
= me
.getView();
101 var handler = function() {
102 var uf
= me
.lookupReference('usernameField');
103 uf
.focus(true, true);
106 let emsg
= gettext("Login failed. Please try again");
108 if (resp
.failureType
=== "connect") {
109 emsg
= gettext("Connection failure. Network error or Proxmox VE services not running?");
112 Ext
.MessageBox
.alert(gettext('Error'), emsg
, handler
);
114 success: function(data
) {
116 var view
= me
.getView();
117 var handler
= view
.handler
|| Ext
.emptyFn
;
118 handler
.call(me
, data
);
122 perform_otp: function() {
124 var win
= Ext
.create('PVE.window.TFALoginWindow', {
125 onLogin: function(value
) {
126 me
.finish_tfa(value
);
128 onCancel: function() {
129 Proxmox
.LoggedOut
= false;
130 Proxmox
.Utils
.authClear();
137 perform_u2f: function(data
) {
140 var msg
= Ext
.Msg
.show({
141 title
: 'U2F: '+gettext('Verification'),
142 message
: gettext('Please press the button on your U2F Device'),
145 var chlg
= data
.U2FChallenge
;
147 version
: chlg
.version
,
148 keyHandle
: chlg
.keyHandle
,
150 u2f
.sign(chlg
.appId
, chlg
.challenge
, [key
], function(res
) {
153 Proxmox
.Utils
.authClear();
154 Ext
.Msg
.alert(gettext('Error'), PVE
.Utils
.render_u2f_error(res
.errorCode
));
157 delete res
.errorCode
;
158 me
.finish_tfa(JSON
.stringify(res
));
161 finish_tfa: function(res
) {
163 var view
= me
.getView();
164 view
.el
.mask(gettext('Please wait...'), 'x-mask-loading');
165 Proxmox
.Utils
.API2Request({
166 url
: '/api2/extjs/access/tfa',
171 timeout
: 5000, // it'll delay both success & failure
172 success: function(resp
, opts
) {
174 // Fill in what we copy over from the 1st factor:
175 var data
= resp
.result
.data
;
176 data
.CSRFPreventionToken
= Proxmox
.CSRFPreventionToken
;
177 data
.username
= Proxmox
.UserName
;
178 // Finish logging in:
181 failure: function(resp
, opts
) {
182 Proxmox
.Utils
.authClear();
189 'field[name=username]': {
190 specialkey: function(f
, e
) {
191 if (e
.getKey() === e
.ENTER
) {
192 var pf
= this.lookupReference('passwordField');
193 if (!pf
.getValue()) {
199 'field[name=lang]': {
200 change: function(f
, value
) {
201 var dt
= Ext
.Date
.add(new Date(), Ext
.Date
.YEAR
, 10);
202 Ext
.util
.Cookies
.set('PVELangCookie', value
, dt
);
203 this.getView().mask(gettext('Please wait...'), 'x-mask-loading');
204 window
.location
.reload();
207 'field[name=realm]': {
208 change: function(f
, value
) {
209 let record
= f
.store
.getById(value
);
210 if (record
=== undefined) return;
211 let data
= record
.data
;
212 this.getViewModel().set("openid", data
.type
=== "openid");
215 'button[reference=loginButton]': {
222 var sp
= Ext
.state
.Manager
.getProvider();
223 var checkboxField
= this.lookupReference('saveunField');
224 var unField
= this.lookupReference('usernameField');
226 var checked
= sp
.get(checkboxField
.getStateId());
227 checkboxField
.setValue(checked
);
229 if (checked
=== true) {
230 var username
= sp
.get(unField
.getStateId());
231 unField
.setValue(username
);
232 var pwField
= this.lookupReference('passwordField');
236 let auth
= Proxmox
.Utils
.getOpenIDRedirectionAuthorization();
237 if (auth
!== undefined) {
238 Proxmox
.Utils
.authClear();
240 let loginForm
= this.lookupReference('loginForm');
241 loginForm
.mask(gettext('OpenID login - please wait...'), 'x-mask-loading');
243 const redirectURL
= location
.origin
;
245 Proxmox
.Utils
.API2Request({
246 url
: '/api2/extjs/access/openid/login',
250 "redirect-url": redirectURL
,
253 failure: function(response
) {
255 let error
= response
.htmlStatus
;
256 Ext
.MessageBox
.alert(
258 gettext('OpenID login failed, please try again') + `<br>${error}`,
259 () => { window
.location
= redirectURL
; },
262 success: function(response
, options
) {
264 let data
= response
.result
.data
;
265 history
.replaceState(null, '', redirectURL
);
283 title
: gettext('Proxmox VE Login'),
285 defaultFocus
: 'usernameField',
286 defaultButton
: 'loginButton',
291 url
: '/api2/extjs/access/ticket',
292 reference
: 'loginForm',
302 fieldLabel
: gettext('User name'),
304 itemId
: 'usernameField',
305 reference
: 'usernameField',
306 stateId
: 'login-username',
308 visible
: "{!openid}",
309 disabled
: "{openid}",
314 inputType
: 'password',
315 fieldLabel
: gettext('Password'),
317 reference
: 'passwordField',
319 visible
: "{!openid}",
320 disabled
: "{openid}",
324 xtype
: 'pmxRealmComboBox',
328 xtype
: 'proxmoxLanguageSelector',
329 fieldLabel
: gettext('Language'),
330 value
: Ext
.util
.Cookies
.get('PVELangCookie') || Proxmox
.defaultLang
|| 'en',
332 reference
: 'langField',
339 fieldLabel
: gettext('Save User name'),
340 name
: 'saveusername',
341 reference
: 'saveunField',
342 stateId
: 'login-saveusername',
347 visible
: "{!openid}",
352 text
: "{button_text}",
354 reference
: 'loginButton',
359 Ext
.define('PVE.window.TFALoginWindow', {
360 extend
: 'Ext.window.Window',
364 title
: 'Two-Factor Authentication',
366 defaultButton
: 'loginButton',
367 defaultFocus
: 'otpField',
370 xclass
: 'Ext.app.ViewController',
373 var view
= me
.getView();
374 view
.onLogin(me
.lookup('otpField').getValue());
379 var view
= me
.getView();
388 fieldLabel
: gettext('Please enter your OTP verification code:'),
391 reference
: 'otpField',
398 text
: gettext('Login'),
399 reference
: 'loginButton',
403 text
: gettext('Cancel'),