ui: implement OpenId login
This commit is contained in:
parent
3b7b1dfb8e
commit
cd975e5787
|
@ -49,9 +49,15 @@ Ext.define('PBS.Application', {
|
|||
var provider = new Ext.state.LocalStorageProvider({ prefix: 'ext-pbs-' });
|
||||
Ext.state.Manager.setProvider(provider);
|
||||
|
||||
let openid_login = false;
|
||||
let param = PBS.Utils.openid_login_param();
|
||||
if (param !== undefined) {
|
||||
openid_login = true;
|
||||
}
|
||||
|
||||
// show login window if not loggedin
|
||||
var loggedin = Proxmox.Utils.authOK();
|
||||
if (!loggedin) {
|
||||
if (openid_login || !loggedin) {
|
||||
me.changeView('loginview', true);
|
||||
} else {
|
||||
me.changeView('mainview', true);
|
||||
|
|
100
www/LoginView.js
100
www/LoginView.js
|
@ -2,6 +2,21 @@ Ext.define('PBS.LoginView', {
|
|||
extend: 'Ext.container.Container',
|
||||
xtype: 'loginview',
|
||||
|
||||
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',
|
||||
|
||||
|
@ -15,8 +30,33 @@ Ext.define('PBS.LoginView', {
|
|||
return;
|
||||
}
|
||||
|
||||
let redirect_url = location.origin;
|
||||
|
||||
let params = loginForm.getValues();
|
||||
|
||||
if (this.getViewModel().data.openid === true) {
|
||||
let realm = params.realm;
|
||||
try {
|
||||
let resp = await PBS.Async.api2({
|
||||
url: '/api2/extjs/access/openid/auth-url',
|
||||
params: {
|
||||
realm: realm,
|
||||
"redirect-url": redirect_url,
|
||||
},
|
||||
method: 'POST',
|
||||
});
|
||||
window.location = resp.result.data;
|
||||
} catch (error) {
|
||||
Proxmox.Utils.authClear();
|
||||
loginForm.unmask();
|
||||
Ext.MessageBox.alert(
|
||||
gettext('Error'),
|
||||
gettext('OpenId redirect failed. Please try again<br>Error: ' + error),
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
params.username = params.username + '@' + params.realm;
|
||||
delete params.realm;
|
||||
|
||||
|
@ -98,6 +138,14 @@ Ext.define('PBS.LoginView', {
|
|||
window.location.reload();
|
||||
},
|
||||
},
|
||||
'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: 'submitForm',
|
||||
},
|
||||
|
@ -116,6 +164,43 @@ Ext.define('PBS.LoginView', {
|
|||
var pwField = this.lookupReference('passwordField');
|
||||
pwField.focus();
|
||||
}
|
||||
|
||||
let param = PBS.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;
|
||||
PBS.Utils.updateLoginData(data);
|
||||
PBS.app.changeView('mainview');
|
||||
history.replaceState(null, '', redirect_url + '#pbsDashboard');
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -191,6 +276,10 @@ Ext.define('PBS.LoginView', {
|
|||
itemId: 'usernameField',
|
||||
reference: 'usernameField',
|
||||
stateId: 'login-username',
|
||||
bind: {
|
||||
visible: "{!openid}",
|
||||
disabled: "{openid}",
|
||||
},
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
|
@ -199,6 +288,10 @@ Ext.define('PBS.LoginView', {
|
|||
name: 'password',
|
||||
itemId: 'passwordField',
|
||||
reference: 'passwordField',
|
||||
bind: {
|
||||
visible: "{!openid}",
|
||||
disabled: "{openid}",
|
||||
},
|
||||
},
|
||||
{
|
||||
xtype: 'pmxRealmComboBox',
|
||||
|
@ -223,9 +316,14 @@ Ext.define('PBS.LoginView', {
|
|||
labelWidth: 250,
|
||||
labelAlign: 'right',
|
||||
submitValue: false,
|
||||
bind: {
|
||||
visible: "{!openid}",
|
||||
},
|
||||
},
|
||||
{
|
||||
text: gettext('Login'),
|
||||
bind: {
|
||||
text: "{button_text}",
|
||||
},
|
||||
reference: 'loginButton',
|
||||
formBind: true,
|
||||
},
|
||||
|
|
|
@ -326,6 +326,14 @@ Ext.define('PBS.Utils', {
|
|||
};
|
||||
},
|
||||
|
||||
openid_login_param: function() {
|
||||
let param = Ext.Object.fromQueryString(window.location.search);
|
||||
if (param.state !== undefined && param.code !== undefined) {
|
||||
return param;
|
||||
}
|
||||
return undefined;
|
||||
},
|
||||
|
||||
calculate_dedup_factor: function(gcstatus) {
|
||||
let dedup = 1.0;
|
||||
if (gcstatus['disk-bytes'] > 0) {
|
||||
|
|
Loading…
Reference in New Issue