]> git.proxmox.com Git - pmg-gui.git/blobdiff - js/LoginView.js
fix #4818: Revert "UserEdit: add minLength of 4 to username field"
[pmg-gui.git] / js / LoginView.js
index 8e610aab79b077cc4316111eda26a564cf32afc1..63f4099d413c22820e1ae299809941af2eba7bdd 100644 (file)
@@ -10,10 +10,15 @@ Ext.define('PMG.LoginView', {
 
            let realmfield = me.lookup('realmfield');
 
+           me.lookup('quarantineButton').setVisible(!!Proxmox.QuarantineLink);
+
            if (view.targetview !== 'quarantineview') {
                return;
            }
 
+           // hide save username field for quarantine view
+           me.lookup('saveunField').setVisible(false);
+
            realmfield.setValue('quarantine');
 
            // try autologin with quarantine ticket from URL
@@ -39,30 +44,99 @@ Ext.define('PMG.LoginView', {
            me.submitForm();
        },
 
-       submitForm: function() {
+       submitForm: async function() {
            let me = this;
            let view = me.getView();
            let loginForm = me.lookupReference('loginForm');
+           var unField = me.lookupReference('usernameField');
+           var saveunField = me.lookupReference('saveunField');
 
            if (loginForm.isValid()) {
                if (loginForm.isVisible()) {
                    loginForm.mask(gettext('Please wait...'), 'x-mask-loading');
                }
-               loginForm.submit({
-                   success: function(form, action) {
-                       // save login data and create cookie
-                       PMG.Utils.updateLoginData(action.result.data);
-                       PMG.app.changeView(view.targetview);
+
+               // set or clear username for admin view
+               if (view.targetview !== 'quarantineview') {
+                   var sp = Ext.state.Manager.getProvider();
+                   if (saveunField.getValue() === true) {
+                       sp.set(unField.getStateId(), unField.getValue());
+                   } else {
+                       sp.clear(unField.getStateId());
+                   }
+                   sp.set(saveunField.getStateId(), saveunField.getValue());
+               }
+
+               let creds = loginForm.getValues();
+
+               try {
+                   let resp = await Proxmox.Async.api2({
+                       url: '/api2/extjs/access/ticket',
+                       params: creds,
+                       method: 'POST',
+                   });
+
+                   let data = resp.result.data;
+                   if (data.ticket.startsWith('PMG:!tfa!')) {
+                       data = await me.performTFAChallenge(data);
+                   }
+                   PMG.Utils.updateLoginData(data);
+                   PMG.app.changeView(view.targetview);
+               } catch (error) {
+                   Proxmox.Utils.authClear();
+                   loginForm.unmask();
+                   Ext.MessageBox.alert(
+                       gettext('Error'),
+                       gettext('Login failed. Please try again'),
+                   );
+               }
+           }
+       },
+
+       performTFAChallenge: async function(data) {
+           let me = this;
+
+           let userid = data.username;
+           let ticket = data.ticket;
+           let challenge = JSON.parse(decodeURIComponent(
+               ticket.split(':')[1].slice("!tfa!".length),
+           ));
+
+           let resp = await new Promise((resolve, reject) => {
+               Ext.create('Proxmox.window.TfaLoginWindow', {
+                   userid,
+                   ticket,
+                   challenge,
+                   onResolve: value => resolve(value),
+                   onReject: reject,
+               }).show();
+           });
+
+           return resp.result.data;
+       },
+
+       openQuarantineLinkWindow: function() {
+           let me = this;
+           me.lookup('loginwindow').setVisible(false);
+           Ext.create('Proxmox.window.Edit', {
+               title: gettext('Request Quarantine Link'),
+               url: '/quarantine/sendlink',
+               isCreate: true,
+               submitText: gettext('OK'),
+               method: 'POST',
+               items: [
+                   {
+                       xtype: 'proxmoxtextfield',
+                       name: 'mail',
+                       fieldLabel: gettext('Your E-Mail'),
                    },
-                   failure: function(form, action) {
-                       loginForm.unmask();
-                       Ext.MessageBox.alert(
-                           gettext('Error'),
-                           gettext('Login failed. Please try again'),
-                       );
+               ],
+               listeners: {
+                   destroy: function() {
+                       me.lookup('loginwindow').show(true);
                    },
-               });
-           }
+               },
+           }).show();
        },
 
        control: {
@@ -76,9 +150,33 @@ Ext.define('PMG.LoginView', {
                    window.location.reload();
                },
            },
+           'button[reference=quarantineButton]': {
+               click: 'openQuarantineLinkWindow',
+           },
            'button[reference=loginButton]': {
                click: 'submitForm',
            },
+           'window[reference=loginwindow]': {
+               show: function() {
+                   let me = this;
+                   let view = me.getView();
+                   if (view.targetview !== 'quarantineview') {
+                       var sp = Ext.state.Manager.getProvider();
+                       var checkboxField = this.lookupReference('saveunField');
+                       var unField = this.lookupReference('usernameField');
+
+                       var checked = sp.get(checkboxField.getStateId());
+                       checkboxField.setValue(checked);
+
+                       if (checked === true) {
+                           var username = sp.get(unField.getStateId());
+                           unField.setValue(username);
+                           var pwField = this.lookupReference('passwordField');
+                           pwField.focus();
+                       }
+                   }
+               },
+           },
        },
     },
 
@@ -118,6 +216,7 @@ Ext.define('PMG.LoginView', {
            reference: 'loginwindow',
            autoShow: true,
            modal: true,
+           width: 450,
 
            defaultFocus: 'usernameField',
 
@@ -149,6 +248,7 @@ Ext.define('PMG.LoginView', {
                            name: 'username',
                            itemId: 'usernameField',
                            reference: 'usernameField',
+                           stateId: 'login-username',
                        },
                        {
                            xtype: 'textfield',
@@ -172,6 +272,20 @@ Ext.define('PMG.LoginView', {
                         },
                    ],
                    buttons: [
+                       {
+                           xtype: 'checkbox',
+                           fieldLabel: gettext('Save User name'),
+                           name: 'saveusername',
+                           reference: 'saveunField',
+                           stateId: 'login-saveusername',
+                           labelAlign: 'right',
+                           labelWidth: 150,
+                           submitValue: false,
+                       },
+                       {
+                           text: gettext('Request Quarantine Link'),
+                           reference: 'quarantineButton',
+                       },
                        {
                            text: gettext('Login'),
                            reference: 'loginButton',