ui/lib/shared/addon/azure-ad/service.js

122 lines
3.1 KiB
JavaScript

import Service, { inject as service } from '@ember/service';
import Util from 'shared/utils/util';
import { get, set } from '@ember/object';
const additionalRedirectParams = {
response_mode: 'query',
response_type: 'code',
// prompt: "consent",
};
export default Service.extend({
access: service(),
cookies: service(),
session: service(),
globalStore: service(),
app: service(),
intl: service(),
oauth: service(),
testConfig(config) {
return config.doAction('configureTest', config);
},
saveConfig(config, opt) {
return config.doAction('testAndApply', opt);
},
login() {
const provider = get(this, 'access.providers').findBy('id', 'azuread');
const authRedirect = get(provider, 'redirectUrl');
let redirect = Util.addQueryParams(authRedirect, additionalRedirectParams);
redirect = Util.addQueryParams(redirect, { state: this.oauth.encodeState(this.oauth.generateState('azuread')) });
window.location.href = redirect;
},
test(config, url, cb) {
let responded = false;
window.onAzureTest = (err, code) => {
if ( !responded ) {
let azureADConfig = config;
responded = true;
this.finishTest(azureADConfig, code, cb);
}
};
url = Util.addQueryParams(url, additionalRedirectParams);
const state = this.oauth.encodeState(this.oauth.generateState('azuread'))
url = Util.addQueryParams(url, { state });
const popup = window.open(url, 'rancherAuth', Util.popupWindowOptions());
const intl = get(this, 'intl');
const timer = setInterval(() => {
if (popup && popup.closed ) {
clearInterval(timer);
if ( !responded ) {
responded = true;
cb({
type: 'error',
message: intl.t('authPage.azuread.test.authError')
});
}
} else if (popup === null || typeof (popup) === 'undefined') {
clearInterval(timer);
if ( !responded ) {
responded = true;
cb({
type: 'error',
message: intl.t('authPage.azuread.test.popupError')
});
}
}
}, 500);
},
finishTest(config, code, cb) {
const azureADConfig = config;
set(azureADConfig, 'enabled', true);
let out = {
code,
config: azureADConfig,
};
return this.saveConfig(config, out).then(() => {
return get(this, 'globalStore').find('principal', null, {
filter: {
me: true,
provider: 'azuread'
}
}).then(( resp ) => {
let aps = get(out, 'config.allowedPrincipalIds') ? get(out, 'config.allowedPrincipalIds') : set(out, 'config.allowedPrincipalIds', []);
let me = resp.find( (p) => {
return get(p, 'me') && get(p, 'provider') === 'azuread';// TODO filters do not work but craig knows
});
if (!aps.includes(get(me, 'id'))) {
aps.pushObject(get(me, 'id'));
}
return azureADConfig.save().then(() => {
window.location.href = window.location.href; // eslint-disable-line no-self-assign
});
});
}).catch((err) => cb(err));
},
});