ui/lib/global-admin/addon/security/authentication/github/controller.js

191 lines
5.3 KiB
JavaScript

import { get, set, computed } from '@ember/object';
import { observer } from '@ember/object';
import { once, later } from '@ember/runloop';
import { alias } from '@ember/object/computed';
import { inject as service } from '@ember/service';
import Controller from '@ember/controller';
import C from 'ui/utils/constants';
export default Controller.extend({
github: service(),
endpoint: service(),
access: service(),
settings: service(),
githubConfig: alias('model.githubConfig'),
confirmDisable: false,
errors: null,
testing: false,
error: null,
saved: false,
saving: false,
haveToken: false,
organizations: null,
scheme: alias('githubConfig.scheme'),
isEnterprise: false,
secure: true,
isEnabled: alias('githubConfig.enabled'),
createDisabled: computed('githubConfig.{clientId,clientSecret,hostname}','testing','isEnterprise', 'haveToken', function() {
if (!get(this, 'haveToken')) {
return true;
}
if ( get(this, 'isEnterprise') && !get(this, 'githubConfig.hostname') )
{
return true;
}
if ( get(this, 'testing') )
{
return true;
}
}),
providerName: computed('githubConfig.hostname', function() {
if ( get(this, 'githubConfig.hostname') && get(this, 'githubConfig.hostname') !== 'github.com') {
return 'authPage.github.enterprise';
} else {
return 'authPage.github.standard';
}
}),
numUsers: computed('githubConfig.allowedPrincipals.@each.externalIdType','wasRestricted', function() {
return ( get(this, 'githubConfig.allowedPrincipalIds') || []).filter(principal => principal.includes(C.PROJECT.TYPE_GITHUB_USER)).get('length');
}),
numOrgs: computed('githubConfig.allowedPrincipals.@each.externalIdType','wasRestricted',function() {
return ( get(this, 'githubConfig.allowedPrincipalIds') || []).filter(principal => principal.includes(C.PROJECT.TYPE_GITHUB_ORG)).get('length');
}),
destinationUrl: computed(function() {
return window.location.origin+'/';
}),
updateEnterprise: function() {
if ( get(this, 'isEnterprise') ) {
var hostname = get(this, 'githubConfig.hostname')||'';
var match = hostname.match(/^http(s)?:\/\//i);
if ( match ) {
set(this, 'secure', ((match[1]||'').toLowerCase() === 's'));
hostname = hostname.substr(match[0].length).replace(/\/.*$/,'');
set(this, 'githubConfig.hostname', hostname);
}
}
else
{
set(this, 'githubConfig.hostname', 'github.com');
set(this, 'secure', true);
}
set(this, 'scheme', get(this, 'secure') ? 'https://' : 'http://');
},
enterpriseDidChange: observer('isEnterprise','githubConfig.hostname','secure', function() {
once(this,'updateEnterprise');
}),
protocolChoices: [
{label: 'https:// -- Requires a cert from a public CA', value: 'https://'},
{label: 'http://', value: 'http://'},
],
authenticationApplied: function(err) {
set(this, 'saving', false);
if (err) {
set(this, 'isEnabled', false);
this.send('gotError', err);
return;
}
this.send('clearError');
},
actions: {
save: function() {
this.send('clearError');
set(this, 'saving', true);
let githubConfig = get(this, 'githubConfig');
githubConfig.setProperties({
'clientId' : (githubConfig.get('clientId')||'').trim(),
'clientSecret' : (githubConfig.get('clientSecret')||'').trim(),
'enabled' : false, // It should already be, but just in case..
'accessMode' : 'restricted',
'tls': true,
'allowedPrincipalIds' : [],
});
get(this, 'github').setProperties({
hostname : githubConfig.get('hostname'),
scheme : githubConfig.get('scheme'),
clientId : githubConfig.get('clientId')
});
set(this, '_boundSucceed', this.authenticationApplied.bind(this));
get(this, 'github').test(githubConfig, get(this, '_boundSucceed'));
},
waitAndRefresh: function(url) {
$('#loading-underlay, #loading-overlay').removeClass('hide').show();
setTimeout(function() {
window.location.href = url || window.location.href;
}, 1000);
},
promptDisable: function() {
set(this, 'confirmDisable', true);
later(this, function() {
set(this, 'confirmDisable', false);
}, 10000);
},
gotError: function(err) {
if ( err.message )
{
this.send('showError', err.message + (err.detail? '('+err.detail+')' : ''));
}
else
{
this.send('showError', 'Error ('+err.status + ' - ' + err.code+')');
}
set(this, 'testing', false);
},
showError: function(msg) {
set(this, 'errors', [msg]);
window.scrollY = 10000;
},
clearError: function() {
set(this, 'errors', null);
},
disable: function() {
this.send('clearError');
let model = get(this, 'githubConfig').clone();
model.setProperties({
'enabled': false,
});
model.doAction('disable').then(() => {
this.send('waitAndRefresh');
}).catch((err) => {
this.send('gotError', err);
}).finally(() => {
set(this, 'confirmDisable', false);
});
},
},
});