also missing in pve-manager - code to add/edit openid realms via the GUI..
On June 24, 2021 10:17 am, Dietmar Maurer wrote: > --- > PVE/HTTPServer.pm | 4 +- > www/manager6/Utils.js | 8 +++ > www/manager6/window/LoginWindow.js | 105 ++++++++++++++++++++++++++++- > 3 files changed, 114 insertions(+), 3 deletions(-) > > diff --git a/PVE/HTTPServer.pm b/PVE/HTTPServer.pm > index 636b562b..dabdf7f3 100755 > --- a/PVE/HTTPServer.pm > +++ b/PVE/HTTPServer.pm > @@ -68,7 +68,9 @@ sub auth_handler { > > # explicitly allow some calls without auth > if (($rel_uri eq '/access/domains' && $method eq 'GET') || > - ($rel_uri eq '/access/ticket' && ($method eq 'GET' || $method eq > 'POST'))) { > + ($rel_uri eq '/access/ticket' && ($method eq 'GET' || $method eq > 'POST')) || > + ($rel_uri eq '/access/openid/login' && $method eq 'POST') || > + ($rel_uri eq '/access/openid/auth-url' && $method eq 'POST')) { > $require_auth = 0; > } > > diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js > index 3415c9eb..c2d139f9 100644 > --- a/www/manager6/Utils.js > +++ b/www/manager6/Utils.js > @@ -1742,6 +1742,14 @@ Ext.define('PVE.Utils', { > > return true; > }, > + > + openid_login_param: function() { > + let param = Ext.Object.fromQueryString(window.location.search); > + if (param.state !== undefined && param.code !== undefined) { > + return param; > + } > + return undefined; > + }, > }, > > singleton: true, > diff --git a/www/manager6/window/LoginWindow.js > b/www/manager6/window/LoginWindow.js > index 72078080..5d3d06b8 100644 > --- a/www/manager6/window/LoginWindow.js > +++ b/www/manager6/window/LoginWindow.js > @@ -2,6 +2,21 @@ > Ext.define('PVE.window.LoginWindow', { > extend: 'Ext.window.Window', > > + viewModel: { > + data: { > + openid: false, > + }, > + formulas: { > + button_text: function(get) { > + if (get("openid") === true) { > + return gettext("Login (OpenID redirect)"); > + } else { > + return gettext("Login"); > + } > + }, > + }, > + }, > + > controller: { > > xclass: 'Ext.app.ViewController', > @@ -18,6 +33,33 @@ Ext.define('PVE.window.LoginWindow', { > return; > } > > + let redirect_url = location.origin; > + let params = form.getValues(); > + > + if (this.getViewModel().data.openid === true) { > + let realm = params.realm; > + Proxmox.Utils.API2Request({ > + url: '/api2/extjs/access/openid/auth-url', > + params: { > + realm: realm, > + "redirect-url": redirect_url, > + }, > + method: 'POST', > + success: function(resp, opts) { > + window.location = resp.result.data; > + }, > + failure: function(resp, opts) { > + Proxmox.Utils.authClear(); > + form.unmask(); > + Ext.MessageBox.alert( > + gettext('Error'), > + gettext('OpenId redirect failed. Please try > again<br>Error: ' + resp.htmlStatus), > + ); > + }, > + }); > + return; > + } > + > view.el.mask(gettext('Please wait...'), 'x-mask-loading'); > > // set or clear username > @@ -162,11 +204,21 @@ Ext.define('PVE.window.LoginWindow', { > window.location.reload(); > }, > }, > - 'button[reference=loginButton]': { > + 'field[name=realm]': { > + change: function(f, value) { > + let record = f.store.getById(value); > + if (record === undefined) return; > + let data = record.data; > + this.getViewModel().set("openid", data.type === "openid"); > + }, > + }, > + 'button[reference=loginButton]': { > click: 'onLogon', > }, > '#': { > show: function() { > + var me = this; > + > var sp = Ext.state.Manager.getProvider(); > var checkboxField = this.lookupReference('saveunField'); > var unField = this.lookupReference('usernameField'); > @@ -180,6 +232,42 @@ Ext.define('PVE.window.LoginWindow', { > var pwField = this.lookupReference('passwordField'); > pwField.focus(); > } > + > + let param = PVE.Utils.openid_login_param(); > + if (param !== undefined) { > + Proxmox.Utils.authClear(); > + > + let loginForm = this.lookupReference('loginForm'); > + loginForm.mask(gettext('OpenID login - please > wait...'), 'x-mask-loading'); > + > + let redirect_url = location.origin; > + > + Proxmox.Utils.API2Request({ > + url: '/api2/extjs/access/openid/login', > + params: { > + state: param.state, > + code: param.code, > + "redirect-url": redirect_url, > + }, > + method: 'POST', > + failure: function(response) { > + loginForm.unmask(); > + Ext.MessageBox.alert( > + gettext('Error'), > + gettext('Login failed. Please try > again<br>Error: ' + response.htmlStatus), > + function() { > + window.location = redirect_url; > + }, > + ); > + }, > + success: function(response, options) { > + loginForm.unmask(); > + let data = response.result.data; > + history.replaceState(null, '', redirect_url); > + me.success(data); > + }, > + }); > + } > }, > }, > }, > @@ -217,6 +305,10 @@ Ext.define('PVE.window.LoginWindow', { > itemId: 'usernameField', > reference: 'usernameField', > stateId: 'login-username', > + bind: { > + visible: "{!openid}", > + disabled: "{openid}", > + }, > }, > { > xtype: 'textfield', > @@ -224,6 +316,10 @@ Ext.define('PVE.window.LoginWindow', { > fieldLabel: gettext('Password'), > name: 'password', > reference: 'passwordField', > + bind: { > + visible: "{!openid}", > + disabled: "{openid}", > + }, > }, > { > xtype: 'pmxRealmComboBox', > @@ -248,9 +344,14 @@ Ext.define('PVE.window.LoginWindow', { > labelWidth: 250, > labelAlign: 'right', > submitValue: false, > + bind: { > + visible: "{!openid}", > + }, > }, > { > - text: gettext('Login'), > + bind: { > + text: "{button_text}", > + }, > reference: 'loginButton', > }, > ], > -- > 2.30.2 > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > > > _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel