Skip to content
This repository was archived by the owner on Nov 15, 2024. It is now read-only.

Commit 2c43a31

Browse files
committed
backend support for github enterprise
1 parent cdc4459 commit 2c43a31

33 files changed

+378
-66
lines changed

api_server/bin/api_server.js

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,29 @@
99
// load configurations
1010
const ConfigDirectory = process.env.CS_API_TOP + '/config';
1111
const ModuleDirectory = process.env.CS_API_TOP + '/modules';
12-
const ApiConfig = require(ConfigDirectory + '/api.js');
13-
const ExpressConfig = require(ConfigDirectory + '/express.js');
14-
const MongoConfig = require(ConfigDirectory + '/mongo.js');
15-
const SecretsConfig = require(ConfigDirectory + '/secrets.js');
16-
const PubNubConfig = require(ConfigDirectory + '/pubnub.js');
17-
const IpcConfig = require(ConfigDirectory + '/ipc.js');
18-
const SegmentConfig = require(ConfigDirectory + '/segment.js');
19-
const SlackConfig = require(ConfigDirectory + '/slack.js');
20-
const MSTeamsConfig = require(ConfigDirectory + '/msteams.js');
21-
const GlipConfig = require(ConfigDirectory + '/glip.js');
22-
const GithubConfig = require(ConfigDirectory + '/github.js');
23-
const AsanaConfig = require(ConfigDirectory + '/asana.js');
24-
const TrelloConfig = require(ConfigDirectory + '/trello.js');
25-
const JiraConfig = require(ConfigDirectory + '/jira.js');
26-
const BitbucketConfig = require(ConfigDirectory + '/bitbucket.js');
27-
const GitlabConfig = require(ConfigDirectory + '/gitlab.js');
28-
const LoggerConfig = require(ConfigDirectory + '/logger.js');
29-
const EmailConfig = require(ConfigDirectory + '/email.js');
30-
const AWSConfig = require(ConfigDirectory + '/aws.js');
31-
const WebClientConfig = require(ConfigDirectory + '/webclient.js');
32-
const Limits = require(ConfigDirectory + '/limits.js');
33-
const Version = require(ConfigDirectory + '/version.js');
12+
const ApiConfig = require(ConfigDirectory + '/api');
13+
const ExpressConfig = require(ConfigDirectory + '/express');
14+
const MongoConfig = require(ConfigDirectory + '/mongo');
15+
const SecretsConfig = require(ConfigDirectory + '/secrets');
16+
const PubNubConfig = require(ConfigDirectory + '/pubnub');
17+
const IpcConfig = require(ConfigDirectory + '/ipc');
18+
const SegmentConfig = require(ConfigDirectory + '/segment');
19+
const SlackConfig = require(ConfigDirectory + '/slack');
20+
const MSTeamsConfig = require(ConfigDirectory + '/msteams');
21+
const GlipConfig = require(ConfigDirectory + '/glip');
22+
const GithubConfig = require(ConfigDirectory + '/github');
23+
const GithubEnterpriseConfig = require(ConfigDirectory + '/github_enterprise');
24+
const AsanaConfig = require(ConfigDirectory + '/asana');
25+
const TrelloConfig = require(ConfigDirectory + '/trello');
26+
const JiraConfig = require(ConfigDirectory + '/jira');
27+
const BitbucketConfig = require(ConfigDirectory + '/bitbucket');
28+
const GitlabConfig = require(ConfigDirectory + '/gitlab');
29+
const LoggerConfig = require(ConfigDirectory + '/logger');
30+
const EmailConfig = require(ConfigDirectory + '/email');
31+
const AWSConfig = require(ConfigDirectory + '/aws');
32+
const WebClientConfig = require(ConfigDirectory + '/webclient');
33+
const Limits = require(ConfigDirectory + '/limits');
34+
const Version = require(ConfigDirectory + '/version');
3435
const SimpleFileLogger = require(process.env.CS_API_TOP + '/server_utils/simple_file_logger');
3536
const ClusterWrapper = require(process.env.CS_API_TOP + '/server_utils/cluster_wrapper');
3637

@@ -85,6 +86,7 @@ const MyAPICluster = new ClusterWrapper(
8586
msteams: MSTeamsConfig,
8687
glip: GlipConfig,
8788
github: GithubConfig,
89+
'github-enterprise': GithubEnterpriseConfig,
8890
asana: AsanaConfig,
8991
trello: TrelloConfig,
9092
jira: JiraConfig,
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// github enterprise integration configuration
2+
3+
'use strict';
4+
5+
module.exports = {
6+
appClientId: process.env.CS_API_GITHUB_ENTERPRISE_CLIENT_ID,
7+
appClientSecret: process.env.CS_API_GITHUB_ENTERPRISE_CLIENT_SECRET
8+
};

api_server/lib/oauth2/oauth2_module.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ class OAuth2Module extends APIServerModule {
2222

2323
// get redirect parameters and url to use in the redirect response
2424
getRedirectData (options) {
25-
const { provider, authUrl, scopes, additionalAuthCodeParameters } = this.oauthConfig;
25+
const { provider, authPath, scopes, additionalAuthCodeParameters } = this.oauthConfig;
26+
const appOrigin = options.appOrigin || this.oauthConfig.appOrigin;
27+
if (!appOrigin && !options.appOrigin) {
28+
throw options.request.errorHandler.error('providerNeedsOrigin');
29+
}
2630
const { redirectUri, state } = options;
2731
const { appClientId } = this.api.config[provider];
2832
const parameters = {
@@ -37,7 +41,7 @@ class OAuth2Module extends APIServerModule {
3741
if (additionalAuthCodeParameters) {
3842
Object.assign(parameters, additionalAuthCodeParameters);
3943
}
40-
const url = authUrl;
44+
const url = `${appOrigin}/${authPath}`;
4145
return { url, parameters };
4246
}
4347

@@ -53,13 +57,18 @@ class OAuth2Module extends APIServerModule {
5357

5458
// given an auth code, exchange it for an access token
5559
async exchangeAuthCodeForToken (options) {
56-
const { tokenUrl, exchangeFormat } = this.oauthConfig;
5760
const { mockToken } = options;
61+
const { tokenPath, exchangeFormat } = this.oauthConfig;
62+
let { appOrigin } = this.oauthConfig;
63+
appOrigin = appOrigin || options.appOrigin;
64+
if (!appOrigin) {
65+
throw options.request.errorHandler.error('providerNeedsOrigin');
66+
}
5867

5968
// must exchange the provided authorization code for an access token,
6069
// prepare parameters for the token exchange request
6170
const parameters = this.prepareTokenExchangeParameters(options);
62-
const url = tokenUrl;
71+
const url = `${appOrigin}/${tokenPath}`;
6372

6473
// for testing, we do a mock reply instead of an actual call out to the provider
6574
if (mockToken) {
@@ -224,6 +233,18 @@ class OAuth2Module extends APIServerModule {
224233
async refreshToken (options) {
225234
return await this.exchangeAuthCodeForToken(options);
226235
}
236+
237+
// get the page to land on once auth is complete
238+
getAuthCompletePage () {
239+
const { provider, authCompletePage } = this.oauthConfig;
240+
return authCompletePage || provider;
241+
}
242+
243+
// return whether the service offers multi-origins (for enterprise)
244+
canHaveMultiOrigins () {
245+
const { canHaveMultiOrigins } = this.oauthConfig;
246+
return canHaveMultiOrigins;
247+
}
227248
}
228249

229250
module.exports = OAuth2Module;

api_server/modules/asana_auth/asana_auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module
66

77
const OAUTH_CONFIG = {
88
provider: 'asana',
9-
authUrl: 'https://app.asana.com/-/oauth_authorize',
10-
tokenUrl: 'https://app.asana.com/-/oauth_token',
9+
appOrigin: 'https://app.asana.com',
10+
authPath: '-/oauth_authorize',
11+
tokenPath: '-/oauth_token',
1112
exchangeFormat: 'form',
1213
accessTokenExpiresIn: 3600,
1314
supportsRefresh: true

api_server/modules/bitbucket_auth/bitbucket_auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module
66

77
const OAUTH_CONFIG = {
88
provider: 'bitbucket',
9-
authUrl: 'https://bitbucket.org/site/oauth2/authorize',
10-
tokenUrl: 'https://bitbucket.org/site/oauth2/access_token',
9+
appOrigin: 'https://bitbucket.org',
10+
authPath: 'site/oauth2/authorize',
11+
tokenPath: 'site/oauth2/access_token',
1112
exchangeFormat: 'form',
1213
scopes: 'account team repository issue:write',
1314
appIdInAuthorizationHeader: true,

api_server/modules/github_auth/github_auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module
66

77
const OAUTH_CONFIG = {
88
provider: 'github',
9-
authUrl: 'https://github.com/login/oauth/authorize',
10-
tokenUrl: 'https://github.com/login/oauth/access_token',
9+
appOrigin: 'https://github.com',
10+
authPath: 'login/oauth/authorize',
11+
tokenPath: 'login/oauth/access_token',
1112
exchangeFormat: 'query',
1213
scopes: 'repo,user',
1314
noGrantType: true
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// provide service to handle github enterprise credential authorization
2+
3+
'use strict';
4+
5+
const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module.js');
6+
7+
const OAUTH_CONFIG = {
8+
provider: 'github-enterprise',
9+
authPath: 'login/oauth/authorize',
10+
tokenPath: 'login/oauth/access_token',
11+
exchangeFormat: 'query',
12+
scopes: 'repo,user',
13+
noGrantType: true,
14+
authCompletePage: 'github',
15+
canHaveMultiOrigins: true
16+
};
17+
18+
class GithubAuth extends OAuth2Module {
19+
20+
constructor (config) {
21+
super(config);
22+
this.oauthConfig = OAUTH_CONFIG;
23+
}
24+
}
25+
26+
module.exports = GithubAuth;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use strict';
2+
3+
module.exports = require('./github_enterprise_auth.js');

api_server/modules/gitlab_auth/gitlab_auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module
66

77
const OAUTH_CONFIG = {
88
provider: 'gitlab',
9-
authUrl: 'https://gitlab.com/oauth/authorize',
10-
tokenUrl: 'https://gitlab.com/oauth/token',
9+
appOrigin: 'https://gitlab.com',
10+
authPath: 'oauth/authorize',
11+
tokenPath: 'oauth/token',
1112
exchangeFormat: 'query',
1213
mockAccessTokenExpiresIn: 7200,
1314
supportsRefresh: true

api_server/modules/glip_auth/glip_auth.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const OAuth2Module = require(process.env.CS_API_TOP + '/lib/oauth2/oauth2_module
66

77
const OAUTH_CONFIG = {
88
provider: 'glip',
9-
authUrl: 'https://api.ringcentral.com/restapi/oauth/authorize',
10-
tokenUrl: 'https://api.ringcentral.com/restapi/oauth/token',
9+
appOrigin: 'https://api.ringcentral.com',
10+
authPath: 'restapi/oauth/authorize',
11+
tokenPath: 'restapi/oauth/token',
1112
exchangeFormat: 'form',
1213
supportsRefresh: true,
1314
mockAccessTokenExpiresIn: 3600

0 commit comments

Comments
 (0)