Signed-off-by: Tim Marx <t.m...@proxmox.com>
---

Notes:
    changed since v1:
    * store token including the product prefix
    * add token id to username to make it more obvious that it's note the 
actual user

 www/manager6/Workspace.js          |   5 ++
 www/manager6/window/LoginWindow.js | 129 ++++++++++++++++++++++-------
 2 files changed, 105 insertions(+), 29 deletions(-)

diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
index 57cb1bb9..b03443cb 100644
--- a/www/manager6/Workspace.js
+++ b/www/manager6/Workspace.js
@@ -73,6 +73,11 @@ Ext.define('PVE.Workspace', {
 
        me.callParent();
 
+       var storedUser = Proxmox.Utils.getStoredUser();
+       if (storedUser.username) {
+           Proxmox.UserName = storedUser.username;
+       }
+
         if (!Proxmox.Utils.authOK()) {
            me.showLogin();
        } else {
diff --git a/www/manager6/window/LoginWindow.js 
b/www/manager6/window/LoginWindow.js
index e29b7352..223ad581 100644
--- a/www/manager6/window/LoginWindow.js
+++ b/www/manager6/window/LoginWindow.js
@@ -12,6 +12,8 @@ Ext.define('PVE.window.LoginWindow', {
            var form = this.lookupReference('loginForm');
            var unField = this.lookupReference('usernameField');
            var saveunField = this.lookupReference('saveunField');
+           var tField = this.lookupReference('apitokenField');
+
            var view = this.getView();
 
            if (!form.isValid()) {
@@ -20,38 +22,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 (tField.value !== '') {
+               var splitToken = tField.value.match(/^(.*)=(.*)$/);
+               Proxmox.Utils.API2Request({
+                   url: '/api2/extjs/access/uicapabilities',
+                   headers:{
+                       Authorization: 'PVEAPIToken=' + tField.value
+                   },
+                   success: function(response, opts) {
+                       var data = {
+                           username: splitToken[1],
+                           token: 'PVEAPIToken=' + tField.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 +167,31 @@ Ext.define('PVE.window.LoginWindow', {
                }
            });
        },
+       onUsetokenChange: function(value) {
+           var uField = this.lookupReference('usernameField');
+           var svunField = this.lookupReference('saveunField');
+           var pField = this.lookupReference('passwordField');
+           var rField = this.lookupReference('realmField');
+           var tField = this.lookupReference('apitokenField');
+
+           uField.setVisible(!value.checked);
+           uField.setDisabled(value.checked);
+
+           svunField.setVisible(!value.checked);
+           svunField.setDisabled(value.checked);
+
+           pField.setVisible(!value.checked);
+           pField.setDisabled(value.checked);
+
+           rField.setVisible(!value.checked);
+           rField.setDisabled(value.checked);
+
+
+
+           tField.setVisible(value.checked);
+           tField.setDisabled(!value.checked);
+
+       },
 
        control: {
            'field[name=username]': {
@@ -198,7 +247,20 @@ Ext.define('PVE.window.LoginWindow', {
 
     defaultFocus: 'usernameField',
     defaultButton: 'loginButton',
-
+    tools: [
+       {
+           xtype: 'checkbox',
+           fieldLabel: gettext('Use API Token'),
+           name: 'usetoken',
+           reference: 'usetoken',
+           stateId: 'login-usetoken',
+           labelAlign: 'right',
+           submitValue: false,
+           listeners: {
+               change: 'onUsetokenChange'
+           }
+       }
+    ],
     items: [{
        xtype: 'form',
        layout: 'form',
@@ -209,7 +271,6 @@ Ext.define('PVE.window.LoginWindow', {
            labelAlign: 'right',
            allowBlank: false
        },
-
        items: [
            {
                xtype: 'textfield',
@@ -228,7 +289,17 @@ Ext.define('PVE.window.LoginWindow', {
            },
            {
                xtype: 'pveRealmComboBox',
-               name: 'realm'
+               name: 'realm',
+               reference: 'realmField'
+           },
+           {
+               xtype: 'textfield',
+               fieldLabel: gettext('API Token'),
+               name: 'apitoken',
+               reference: 'apitokenField',
+               emptyText: 'USER@REALM!TOKENID=UUID',
+               hidden: true,
+               disabled: true
            },
            {
                xtype: 'proxmoxLanguageSelector',
@@ -246,8 +317,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