Re: [pve-devel] [PATCH v2 manager] ui: auth: add api token authentication to login window

2020-06-30 Thread Thomas Lamprecht
On 07.05.20 14:28, Tim Marx wrote:
> Signed-off-by: Tim Marx 
> ---
> 
> 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();

please use `let` and rebase to match the rename to getStoredAuth

> + 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');

tField is not an acceptable variable name, I mean, the existing unField
isn't either but I'd rather change that too instead of adapting to it.
use something like 'tokenField'

> +
>   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',

Hmm, do I miss a access-control API patch? As uicapabilities isn't available.

> + 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();
> + }
>

[pve-devel] [PATCH v2 manager] ui: auth: add api token authentication to login window

2020-05-07 Thread Tim Marx
Signed-off-by: Tim Marx 
---

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', {
}
});