ui/lib/pipeline/addon/components/github-setting/component.js

140 lines
4.1 KiB
JavaScript

import Component from '@ember/component';
import { inject as service } from '@ember/service';
import { once } from '@ember/runloop';
import { set, get, observer, setProperties } from '@ember/object';
export default Component.extend({
router: service(),
gitService: service('pipeline-github'),
oauthType: 'github',
oauthHost: 'github.com',
provider: null,
errors: null,
useGloableConfig: true,
githubAuthConfig: null,
testing: false,
secure: true,
isEnterprise: false,
didReceiveAttrs() {
setProperties(this, {
homePageURL: window.location.origin,
destinationUrl: window.location.origin
});
},
actions: {
changeOauthSource(useGloableConfig) {
set(this, 'useGloableConfig', useGloableConfig);
},
githubAuthConfigAuthenticate() {
const githubAuthConfig = get(this, 'githubAuthConfig');
this.send('authenticate', null, get(githubAuthConfig, 'clientId'), get(githubAuthConfig, 'hostName'), get(githubAuthConfig, 'tls'), true)
},
authenticate(cb, client, host, isTls, inheritAuth, callBack) {
const clientId = client || get(this, 'oauthModel.clientId');
let hostname = host || get(this, 'oauthModel.hostName') || get(this, 'oauthHost');
const tls = isTls === undefined ? get(this, 'oauthModel.scheme') : isTls;
const scheme = tls ? 'https://' : 'http://';
const authorizeURL = `${ scheme }${ hostname }${ this.getOauthUrl(clientId) }`;
set(this, 'testing', true);
get(this, 'gitService').authorizeTest(
authorizeURL,
(err, code) => {
if (err) {
this.send('gotError', err);
set(this, 'testing', false);
if ( cb ) {
cb();
}
} else {
callBack && callBack(code) || this.send('gotCode', code, hostname, tls, inheritAuth, cb);
}
}
);
},
gotCode(code, hostname, tls, inheritAuth, cb) {
const provider = get(this, 'provider');
const oauthModel = get(this, 'oauthModel');
const param = {
code,
clientId: oauthModel.clientId,
clientSecret: oauthModel.clientSecret,
redirectUrl: `${ get(this, 'destinationUrl') }/verify-auth`,
inheritAuth: !!inheritAuth,
hostname,
tls,
};
provider.doAction('testAndApply', param).then(() => {
set(this, 'testing', false);
if ( cb ) {
cb();
}
get(this, 'router').transitionTo('authenticated.project.pipeline.repositories');
}).catch((res) => {
this.send('gotError', res);
set(this, 'testing', false);
if ( cb ) {
cb();
}
});
},
gotError(err) {
if ( get(err, 'message') ) {
this.send('showError', get(err, 'message') + (get(err, 'detail') ? `(${ get(err, 'detail') })` : ''));
} else if (typeof err === 'object') {
this.send('showError', `Error (${ get(err, 'status') } - ${ get(err, 'code') })`);
} else {
this.send('showError', `Error (${ err })`);
}
set(this, 'testing', false);
},
showError(msg) {
set(this, 'errors', [msg]);
window.scrollY = 10000;
},
},
enterpriseDidChange: observer('isEnterprise', 'oauthModel.hostName', 'secure', function() {
if (get(this, 'oauthModel.isAuth')) {
return
}
once(this, 'updateEnterprise');
}),
getOauthUrl(clientId) {
return `/login/oauth/authorize?client_id=${ clientId }&response_type=code&scope=repo+admin%3Arepo_hook`;
},
updateEnterprise() {
if (get(this, 'isEnterprise')) {
let hostname = get(this, 'oauthModel.hostName') || '';
const match = hostname.match(/^http(s)?:\/\//i);
if (match) {
setProperties(this, {
secure: (match[1] || '').toLowerCase() === 's',
'oauthModel.hostName': hostname.substr(match[0].length).replace(/\/.*$/, '')
});
}
} else {
setProperties(this, {
secure: true,
'oauthModel.hostName': null
});
}
set(this, 'oauthModel.scheme', get(this, 'secure'));
},
});