]> 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 4f8f3fc2178d3831e18de07010de8456fa205b65..63f4099d413c22820e1ae299809941af2eba7bdd 100644 (file)
@@ -1,4 +1,3 @@
-/*global Proxmox*/
 Ext.define('PMG.LoginView', {
     extend: 'Ext.container.Container',
     xtype: 'loginview',
@@ -7,100 +6,184 @@ Ext.define('PMG.LoginView', {
        xclass: 'Ext.app.ViewController',
 
        init: function(view) {
-           var loginForm = this.lookupReference('loginForm');
+           let me = this;
+
+           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
 
-           var qs = Ext.Object.fromQueryString(location.search);
-           if (qs.ticket == undefined) { return; }
-           var ticket = decodeURIComponent(qs.ticket);
-           var match = ticket.match(/^PMGQUAR:([^\s\:]+):/);
-           if (!match) { return; }
-           var username = match[1];
-           var loginwin = this.lookupReference('loginwindow');
+           let qs = Ext.Object.fromQueryString(location.search);
+           if (qs.ticket === undefined) {
+               return;
+           }
+           let ticket = decodeURIComponent(qs.ticket);
+           let match = ticket.match(/^PMGQUAR:([^\s:]+):/);
+           if (!match) {
+               return;
+           }
+           let username = match[1];
+           let loginwin = me.lookup('loginwindow');
            loginwin.autoShow = false;
            loginwin.setVisible(false);
+           realmfield.setDisabled(true);
 
-           Proxmox.Utils.API2Request({
-               url: '/api2/extjs/access/ticket',
-               params: {
-                   username: username,
-                   password: ticket
-               },
-               method: 'POST',
-               success: function(response) {
-                   // save login data and create cookie
-                   PMG.Utils.updateLoginData(response.result.data);
-                   // change view to mainview
-                   view.destroy();
-                   PMG.view = 'quarantine';
-                   Ext.create({ xtype: 'quarantineview' });
-                   Proxmox.Utils.checked_command(function() {}); // display subscription status
-               },
-               failure: function(form, action) {
+           me.lookup('usernameField').setValue(username);
+           me.lookup('passwordField').setValue(ticket);
+
+           me.submitForm();
+       },
+
+       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');
+               }
+
+               // 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')
+                       gettext('Login failed. Please try again'),
                    );
                }
-           });
+           }
        },
 
-       submitForm: function() {
-           var me = this;
-           var loginForm = me.lookupReference('loginForm');
+       performTFAChallenge: async function(data) {
+           let me = this;
 
-           if (loginForm.isValid()) {
-               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);
-                       // change view to mainview
-                       me.getView().destroy();
-
-                       if (location.pathname === "/quarantine") {
-                           Ext.create({ xtype: 'quarantineview' });
-                           PMG.view = 'quarantine';
-                       } else {
-                           Ext.create({ xtype: 'mainview' });
-                           PMG.view = 'main';
-                       }
-                       Proxmox.Utils.checked_command(function() {}); // display subscription status
+           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: {
            'field[name=lang]': {
                change: function(f, value) {
-                   var dt = Ext.Date.add(new Date(), Ext.Date.YEAR, 10);
-                   Ext.util.Cookies.set('ProxmoxLangCookie', value, dt);
+                   let dt = Ext.Date.add(new Date(), Ext.Date.YEAR, 10);
+                   Ext.util.Cookies.set('PMGLangCookie', value, dt);
 
-                   var loginwin = this.lookupReference('loginwindow');
+                   let loginwin = this.lookupReference('loginwindow');
                    loginwin.mask(gettext('Please wait...'), 'x-mask-loading');
                    window.location.reload();
-               }
+               },
+           },
+           'button[reference=quarantineButton]': {
+               click: 'openQuarantineLinkWindow',
            },
            'button[reference=loginButton]': {
-               click: 'submitForm'
-           }
-       }
+               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();
+                       }
+                   }
+               },
+           },
+       },
     },
 
     plugins: 'viewport',
 
     layout: {
-       type: 'border'
+       type: 'border',
     },
 
     items: [
@@ -109,21 +192,22 @@ Ext.define('PMG.LoginView', {
            xtype: 'container',
            layout: {
                type: 'hbox',
-               align: 'middle'
+               align: 'middle',
            },
-           margin: '4 5 4 5',
+           margin: '2 5 2 5',
+           height: 38,
            items: [
                {
-                   xtype: 'proxmoxlogo'
+                   xtype: 'proxmoxlogo',
                },
                {
                    xtype: 'versioninfo',
-                   makeApiCall: false
-               }
-           ]
+                   makeApiCall: false,
+               },
+           ],
        },
        {
-           region: 'center'
+           region: 'center',
        },
        {
            xtype: 'window',
@@ -132,11 +216,12 @@ Ext.define('PMG.LoginView', {
            reference: 'loginwindow',
            autoShow: true,
            modal: true,
+           width: 450,
 
            defaultFocus: 'usernameField',
 
            layout: {
-               type: 'auto'
+               type: 'auto',
            },
 
            title: gettext('Proxmox Mail Gateway Login'),
@@ -145,7 +230,7 @@ Ext.define('PMG.LoginView', {
                {
                    xtype: 'form',
                    layout: {
-                       type: 'form'
+                       type: 'form',
                    },
                    defaultButton: 'loginButton',
                    url: '/api2/extjs/access/ticket',
@@ -153,7 +238,7 @@ Ext.define('PMG.LoginView', {
 
                    fieldDefaults: {
                        labelAlign: 'right',
-                       allowBlank: false
+                       allowBlank: false,
                    },
 
                    items: [
@@ -162,37 +247,53 @@ Ext.define('PMG.LoginView', {
                            fieldLabel: gettext('User name'),
                            name: 'username',
                            itemId: 'usernameField',
-                           reference: 'usernameField'
+                           reference: 'usernameField',
+                           stateId: 'login-username',
                        },
                        {
                            xtype: 'textfield',
                            inputType: 'password',
                            fieldLabel: gettext('Password'),
                            name: 'password',
-                           reference: 'passwordField'
+                           reference: 'passwordField',
                        },
                        {
                            xtype: 'proxmoxLanguageSelector',
                            fieldLabel: gettext('Language'),
-                           value: Ext.util.Cookies.get('ProxmoxLangCookie') || 'en',
+                           value: Ext.util.Cookies.get('PMGLangCookie') || 'en',
                            name: 'lang',
-                           submitValue: false
+                           submitValue: false,
                        },
                        {
                            xtype: 'hiddenfield',
+                           reference: 'realmfield',
                            name: 'realm',
-                           value: 'pam'
-                       }
+                           value: 'pmg',
+                        },
                    ],
                    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',
-                           formBind: true
-                       }
-                   ]
-               }
-           ]
-       }
-    ]
+                           formBind: true,
+                       },
+                   ],
+               },
+           ],
+       },
+    ],
 });