ui/lib/shared/addon/shibboleth-auth/service.js

91 lines
2.6 KiB
JavaScript

import { Promise as EmberPromise } from 'rsvp';
import { observer } from '@ember/object';
import Service, { inject as service } from '@ember/service';
import C from 'shared/utils/constants';
import Util from 'shared/utils/util';
import { denormalizeName } from 'shared/settings/service';
export default Service.extend({
globalStore: service(),
session: service(),
access: service(),
app: service(),
hasToken: null,
parseIdentity: observer('hasToken', function() {
let locToken = this.get('hasToken');
if (locToken) {
let userIdent = locToken.userIdentity;
this.set(`session.${C.SESSION.IDENTITY}`, userIdent);
}
}),
getToken: function() {
return new EmberPromise((resolve, reject) => {
this.get('globalStore').rawRequest({
url: 'token',
})
.then((xhr) => {
resolve(xhr.body.data[0]);
return ;
})
.catch((err) => {
reject(err);
});
});
},
buildRedirectUrl: function(url, test=false) {
let redirect = url;
let qp = {
redirectBackBase: window.location.origin,
redirectBackPath: '/login/shibboleth-auth/',
};
if ( test ) {
qp.redirectBackPath = `${qp.redirectBackPath}?shibbolethTest=1`;
}
return Util.addQueryParams(redirect, qp);
},
waitAndRefresh: function(url) {
$('#loading-underlay, #loading-overlay').removeClass('hide').show();
setTimeout(function() {
window.location.href = url || window.location.href;
}, 1000);
},
authorizeRedirect: function(url) {
window.location.href = url;
},
authenticationSucceeded: function(model) {
let url = window.location.href;
model = model.clone();
model.setProperties({
'enabled' : true,
'accessMode' : 'restricted',
'allowedIdentities' : [],
});
model.save().then(() => {
// for some reason we can't get past here because we've set auth true?
return this.get('globalStore').find('setting', denormalizeName(C.SETTING.API_HOST)).then((setting) => {
if ( setting.get('value') ) {
this.waitAndRefresh(url);
} else {
// Default the api.host so the user won't have to set it in most cases
if ( window.location.hostname === 'localhost' ) {
this.waitAndRefresh(url);
} else {
setting.set('value', window.location.origin);
return setting.save().then(() => {
this.waitAndRefresh(url);
});
}
}
});
}).catch(() => {
this.set('access.enabled', false);
});
},
});