From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 1AB7A1FF17C for <inbox@lore.proxmox.com>; Wed, 30 Apr 2025 18:54:30 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id B9D0F35E5C; Wed, 30 Apr 2025 18:54:39 +0200 (CEST) From: Alexander Abraham <a.abraham@proxmox.com> To: pve-devel@lists.proxmox.com Date: Wed, 30 Apr 2025 18:54:30 +0200 Message-Id: <20250430165430.112223-1-a.abraham@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <c.heiss@proxmox.com> References: <c.heiss@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.093 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v2] fix #4281: manager: Enabled logging in with Open ID X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> Made the neccessary changes to enable users to login with their Open ID provider from the mobile view of the PVE web frontend. Signed-off-by: Alexander Abraham <a.abraham@proxmox.com> --- www/mobile/Login.js | 146 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 114 insertions(+), 32 deletions(-) diff --git a/www/mobile/Login.js b/www/mobile/Login.js index 06c8b3d4..b03929b2 100644 --- a/www/mobile/Login.js +++ b/www/mobile/Login.js @@ -1,8 +1,8 @@ Ext.define('PVE.Login', { extend: 'Ext.form.Panel', alias: "widget.pveLogin", - - handleTFA: function(username, ticketResponse) { + id: 'loginFormPanel', + handleTFA: function(username, ticketResponse) { let me = this; let errlabel = me.down('#signInFailedLabel'); @@ -32,8 +32,7 @@ Ext.define('PVE.Login', { } else { me.mask({ xtype: 'loadmask', - message: 'Loading...', - }); + message: 'Loading...', }); Proxmox.Utils.API2Request({ url: '/api2/extjs/access/ticket', params: { @@ -57,16 +56,16 @@ Ext.define('PVE.Login', { Proxmox.Utils.authClear(); errlabel.show(); }, - }); + }) } }, }); } }, - config: { title: 'Login', padding: 10, + itemId: 'loginForm', appUrl: 'login', items: [ { @@ -78,7 +77,7 @@ Ext.define('PVE.Login', { { xtype: 'fieldset', title: 'Proxmox VE Login', - items: [ + items:[ { xtype: 'textfield', placeHolder: gettext('User name'), @@ -97,8 +96,19 @@ Ext.define('PVE.Login', { xtype: 'pveRealmSelector', itemId: 'realmSelectorField', name: 'realm', + listeners: { + change: function(field, newValue){ + let record = field.record; + let realmType = record.data.type; + let currForm = this.up("formpanel"); + let usernameField = currForm.down("#userNameTextField"); + let passwordField = currForm.down("#passwordTextField"); + usernameField.setHidden(realmType === "openid"); + passwordField.setHidden(realmType === "openid"); + } + } }, - ], + ], }, { xtype: 'label', @@ -124,35 +134,107 @@ Ext.define('PVE.Login', { errlabel.hide(); + var username = usernameField.getValue(); var password = passwordField.getValue(); - var realm = realmField.getValue(); + var realm = realmField.getValue(); - Proxmox.Utils.API2Request({ - url: '/access/ticket', - method: 'POST', - waitMsgTarget: form, - params: { username: username, password: password, realm: realm }, - failure: function(response, options) { - errlabel.show(); - }, - success: function(response, options) { - passwordField.setValue(''); - let data = response.result.data; - if (Ext.isDefined(data.NeedTFA)) { - form.handleTFA(username, data); - } else { - PVE.Workspace.updateLoginData(data); - } - }, - }); - }, - }, - ], - }, -}); + if (realmField.record.data.type === "openid"){ + const redirectUrl = location.origin; + const realmName = realmField.record.data.realm; + Proxmox.Utils.API2Request( + { + url: '/access/openid/auth-url', + method: 'POST', + waitMsgTarget: form, + params: { + realm: realmName, + "redirect-url": redirectUrl + }, + success: (resp, opts) => { + window.location = resp.result.data; + }, + failure: (resp, opts) => { + Proxmox.Utils.authClear(); + form.unmask(); + Ext.Msg.alert( + gettext('Error'), + gettext('OpenID redirect failed.') + `<br>${resp.htmlStatus}`, + ); + } + } + ); + return; + } + else { + Proxmox.Utils.API2Request({ + url: '/access/ticket', + method: 'POST', + waitMsgTarget: form, + params: { username: username, password: password, realm: realm }, + failure: function(response, options) { + errlabel.show(); + }, + success: function(response, options) { + passwordField.setValue(''); + let data = response.result.data; + if (Ext.isDefined(data.NeedTFA)) { + form.handleTFA(username, data); + } else { + PVE.Workspace.updateLoginData(data); + } + }, + }); + } + }, + }, + ], + }, + show: function(){ + let auth = Proxmox.Utils.getOpenIDRedirectionAuthorization(); + let lForm = this.callParent(); + if (auth !== undefined){ + let state = auth.state; + let code = auth.code; + Proxmox.Utils.authClear() + lForm.setMasked( + { + xtype: 'loadmask', + message: gettext('OpenID login - please wait..') + } + ); + const redirectUrl = location.origin; + Proxmox.Utils.API2Request({ + url: '/access/openid/login', + params: { + "state": auth.state, + "code": auth.code, + "redirect-url": redirectUrl, + }, + method: 'POST', + failure: function(response) { + lForm.unmask(); + let error = response.htmlStatus; + Ext.Msg.alert( + gettext('Error'), + gettext('OpenID login failed, please try again') + `<br>${error}`, + () => { window.location = redirectUrl; }, + ); + }, + success: function(response, options) { + lForm.unmask(); + let data = response.result.data; + history.replaceState(null, '', redirectUrl); + lForm.success(data) + PVE.Workspace.updateLoginData(data); + }, + }); + } + } +}); + Ext.define('PVE.field.TFACode', { extend: 'Ext.field.Text', xtype: 'tfacode', -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel