Signed-off-by: Tim Marx <t.m...@proxmox.com>
---
changes since v2:
* let/var
* removed checkbox
* autodetect api token on change

 www/manager6/Workspace.js          |   5 ++
 www/manager6/window/LoginWindow.js | 106 +++++++++++++++++++++--------
 2 files changed, 81 insertions(+), 30 deletions(-)

diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
index 8d224f5b..c4917dac 100644
--- a/www/manager6/Workspace.js
+++ b/www/manager6/Workspace.js
@@ -73,6 +73,11 @@ Ext.define('PVE.Workspace', {

        me.callParent();

+       let storedAuth = Proxmox.Utils.getStoredAuth();
+       if (storedAuth.username) {
+           Proxmox.UserName = storedAuth.username;
+       }
+
         if (!Proxmox.Utils.authOK()) {
            me.showLogin();
        } else {
diff --git a/www/manager6/window/LoginWindow.js 
b/www/manager6/window/LoginWindow.js
index 6123c655..7d97cd56 100644
--- a/www/manager6/window/LoginWindow.js
+++ b/www/manager6/window/LoginWindow.js
@@ -12,6 +12,7 @@ Ext.define('PVE.window.LoginWindow', {
            var form = this.lookupReference('loginForm');
            var unField = this.lookupReference('usernameField');
            var saveunField = this.lookupReference('saveunField');
+
            var view = this.getView();

            if (!form.isValid()) {
@@ -20,38 +21,60 @@ Ext.define('PVE.window.LoginWindow', {

            view.el.mask(gettext('Please wait...'), 'x-mask-loading');

-           // set or clear username
-           var sp = Ext.state.Manager.getProvider();
-           if (saveunField.getValue() === true) {
-               sp.set(unField.getStateId(), unField.getValue());
+           if (Proxmox.Utils.APIToken_match.test(unField.value)) {
+               var splitToken = unField.value.match(/^(.*)=(.*)$/);
+               Proxmox.Utils.API2Request({
+                   url: '/api2/extjs/access/uicapabilities',
+                   headers:{
+                       Authorization: 'PVEAPIToken=' + unField.value
+                   },
+                   success: function(response, opts) {
+                       var data = {
+                           username: splitToken[1],
+                           token: 'PVEAPIToken=' + unField.value,
+                           cap: response.result.data.cap
+                       };
+                       me.success(data);
+                   },
+
+                   failure: function(response, opts) {
+                       me.failure(response);
+                   }
+               });
            } else {
-               sp.clear(unField.getStateId());
-           }
-           sp.set(saveunField.getStateId(), saveunField.getValue());
+               // set or clear username
+               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());

-           form.submit({
-               failure: function(f, resp){
-                   me.failure(resp);
-               },
-               success: function(f, resp){
-                   view.el.unmask();
+               form.submit({
+                   failure: function(f, resp){
+                       me.failure(resp);
+                   },
+                   success: function(f, resp){
+                       view.el.unmask();

-                   var data = resp.result.data;
-                   if (Ext.isDefined(data.NeedTFA)) {
-                       // Store first factor login information first:
-                       data.LoggedOut = true;
-                       Proxmox.Utils.setAuthData(data);
+                       var data = resp.result.data;
+                       if (Ext.isDefined(data.NeedTFA)) {
+                           // Store first factor login information first:
+                           data.LoggedOut = true;
+                           Proxmox.Utils.setAuthData(data);

-                       if (Ext.isDefined(data.U2FChallenge)) {
-                           me.perform_u2f(data);
+                           if (Ext.isDefined(data.U2FChallenge)) {
+                               me.perform_u2f(data);
+                           } else {
+                               me.perform_otp();
+                           }
                        } else {
-                           me.perform_otp();
+                           me.success(data);
                        }
-                   } else {
-                       me.success(data);
                    }
-               }
-           });
+               });
+           }

        },
        failure: function(resp) {
@@ -143,6 +166,27 @@ Ext.define('PVE.window.LoginWindow', {
                }
            });
        },
+       onApiTokenDetected: function(value) {
+           var usernameField = this.lookupReference('usernameField');
+           var saveUsernameField = this.lookupReference('saveunField');
+           var passwordField = this.lookupReference('passwordField');
+           var realmField = this.lookupReference('realmField');
+           let label = value ? 'API Token' : gettext('User name');
+           usernameField.setFieldLabel(label);
+           saveUsernameField.setDisabled(value);
+           passwordField.setDisabled(value);
+           realmField.setDisabled(value);
+
+
+       },
+       detectApiToken: function(field, newValue, oldValue) {
+           if (Proxmox.Utils.APIToken_match.test(newValue)) {
+               this.onApiTokenDetected(true);
+           } else {
+               this.onApiTokenDetected(false);
+           }
+
+       },

        control: {
            'field[name=username]': {
@@ -198,7 +242,6 @@ Ext.define('PVE.window.LoginWindow', {

     defaultFocus: 'usernameField',
     defaultButton: 'loginButton',
-
     items: [{
        xtype: 'form',
        layout: 'form',
@@ -209,7 +252,6 @@ Ext.define('PVE.window.LoginWindow', {
            labelAlign: 'right',
            allowBlank: false
        },
-
        items: [
            {
                xtype: 'textfield',
@@ -217,7 +259,10 @@ Ext.define('PVE.window.LoginWindow', {
                name: 'username',
                itemId: 'usernameField',
                reference: 'usernameField',
-               stateId: 'login-username'
+               stateId: 'login-username',
+               listeners: {
+                   change: 'detectApiToken'
+               }
            },
            {
                xtype: 'textfield',
@@ -228,7 +273,8 @@ Ext.define('PVE.window.LoginWindow', {
            },
            {
                xtype: 'pmxRealmComboBox',
-               name: 'realm'
+               name: 'realm',
+               reference: 'realmField'
            },
            {
                xtype: 'proxmoxLanguageSelector',
@@ -246,8 +292,8 @@ Ext.define('PVE.window.LoginWindow', {
                name: 'saveusername',
                reference: 'saveunField',
                stateId: 'login-saveusername',
-               labelWidth: 250,
                labelAlign: 'right',
+               labelWidth: 250,
                submitValue: false
            },
            {
--
2.20.1

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to