Skip to content

Commit 63efcb1

Browse files
authored
Merge pull request #88 from hpcloud/317-ghe
TEAMFOUR-317 - Add Github Enterprise support
2 parents 351411f + 3086fd1 commit 63efcb1

7 files changed

+328
-236
lines changed

github_oauth.go

-194
This file was deleted.

main.go

+17-10
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ func main() {
6767
}
6868
log.Println("Encryption key set.")
6969

70+
portalConfig.VCSClientMap, err = getVCSClients(portalConfig)
71+
if err != nil || len(portalConfig.VCSClientMap) == 0 {
72+
log.Printf("Exiting. No VCS clients found: %v", err)
73+
os.Exit(1)
74+
}
75+
log.Printf("VCSClientMap: %v\n", portalConfig.VCSClientMap)
76+
7077
// Establish a Postgresql connection pool
7178
var databaseConnectionPool *sql.DB
7279
databaseConnectionPool, err = initConnPool()
@@ -321,20 +328,20 @@ func (p *portalProxy) registerRoutes(e *echo.Echo) {
321328
// Version info
322329
sessionGroup.GET("/version", p.getVersions)
323330

324-
// GitHub Requests
325-
ghGroup := sessionGroup.Group("/github")
331+
// VCS Requests
332+
vcsGroup := sessionGroup.Group("/vcs")
326333

327-
// Initiate OAuth flow against GitHub on behalf of a user
328-
ghGroup.GET("/oauth/auth", p.handleGitHubAuth)
334+
// Initiate OAuth flow against VCS on behalf of a user
335+
vcsGroup.GET("/oauth/auth", p.handleVCSAuth)
329336

330-
// GitHub OAuth callback/response
331-
ghGroup.GET("/oauth/callback", p.handleGitHubCallback)
337+
// VCS OAuth callback/response
338+
vcsGroup.GET("/oauth/callback", p.handleVCSAuthCallback)
332339

333-
// Verify existence of GitHub token in Session
334-
ghGroup.GET("/oauth/verify", p.verifyGitHubAuthToken)
340+
// Verify existence of VCS token in Session
341+
vcsGroup.GET("/oauth/verify", p.verifyVCSOAuthToken)
335342

336-
// Proxy the rest to Github API
337-
ghGroup.Any("/*", p.github)
343+
// Proxy the rest to VCS API
344+
vcsGroup.Any("/*", p.vcsProxy)
338345

339346
// This is used for passthru of HCF/HCE requests
340347
group := sessionGroup.Group("/proxy")

passthrough.go

+24-29
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ type CNSIRequest struct {
3434
Error error
3535
}
3636

37-
const gitHubAPIURL = "https://api.github.com/"
38-
3937
func getEchoURL(c echo.Context) url.URL {
4038
log.Println("getEchoURL")
4139
u := c.Request().URL().(*standard.URL).URL
@@ -204,8 +202,8 @@ func (p *portalProxy) proxy(c echo.Context) error {
204202
log.Println(" ")
205203

206204
// if the following header is found, add the GH Oauth code to the body
207-
if header.Get("x-cnap-github-token-required") != "" {
208-
log.Println("--- x-cnap-github-token-required HEADER FOUND.....")
205+
if header.Get("x-cnap-vcs-token-required") != "" {
206+
log.Println("--- x-cnap-vcs-token-required HEADER FOUND.....")
209207
body, err = p.addTokenToPayload(c, body)
210208
if err != nil {
211209
log.Printf("Unable to add token to HCE payload: %+v\n", err)
@@ -270,9 +268,12 @@ func (p *portalProxy) proxy(c echo.Context) error {
270268
func (p *portalProxy) addTokenToPayload(c echo.Context, body []byte) ([]byte, error) {
271269
log.Println("addTokenToPayload")
272270

273-
token := p.getGitHubAuthToken(c)
274-
275-
log.Printf("Token: %+v\n", token)
271+
token, ok := p.getVCSOAuthToken(c)
272+
if !ok {
273+
msg := "Unable to retrieve VCS OAuth token to add to payload"
274+
log.Println(msg)
275+
return nil, fmt.Errorf(msg)
276+
}
276277

277278
var projData map[string]interface{}
278279
if err := json.Unmarshal(body, &projData); err != nil {
@@ -327,44 +328,38 @@ End:
327328
}
328329
}
329330

330-
func (p *portalProxy) github(c echo.Context) error {
331-
332-
log.Println("github passthru ...")
333-
log.Printf("GitHub API URL: %s", gitHubAPIURL)
331+
func (p *portalProxy) vcsProxy(c echo.Context) error {
332+
log.Println("VCS proxy passthru ...")
334333

335334
var (
336-
uri *url.URL
337-
headers http.Header
335+
uri *url.URL
336+
vcsEndpoint string
338337
)
339338

340339
uri = makeRequestURI(c)
341-
log.Printf("URI: %+v\n", uri)
342340

343-
headers = getEchoHeaders(c)
344-
log.Printf("Headers: %+v\n", headers)
341+
vcsEndpoint = c.Request().Header().Get("x-cnap-vcs-api-url")
345342

346-
url := fmt.Sprintf("%s%s", gitHubAPIURL, uri)
347-
log.Printf("URL: %s", url)
343+
url := fmt.Sprintf("%s/%s", vcsEndpoint, uri)
344+
log.Printf("VCS Endpoint URL: %s", url)
348345

349-
token := p.getGitHubAuthToken(c)
350-
tokenHeader := fmt.Sprintf("token %s", token)
346+
token, ok := p.getVCSOAuthToken(c)
347+
if !ok {
348+
msg := fmt.Sprintf("Token not found for endpoint %s", vcsEndpoint)
349+
return echo.NewHTTPError(http.StatusBadRequest, msg)
350+
}
351351

352-
// set the token in the header
353-
log.Printf("Headers before GH call: %+v\n", headers)
352+
tokenHeader := fmt.Sprintf("token %s", token)
354353

355-
// Perform the request against GitHub
356-
client := &http.Client{
357-
Timeout: time.Duration(p.Config.HTTPClientTimeoutInSecs) * time.Second,
358-
}
354+
// Perform the request against the VCS endpoint
359355
req, err := http.NewRequest("GET", url, nil)
360356
log.Printf("Request: %+v\n", req)
361357
req.Header.Add("Authorization", tokenHeader)
362-
resp, err := client.Do(req)
358+
resp, err := httpClient.Do(req)
363359
if err != nil {
364-
log.Printf("Response from GitHub contained an error: %v", err)
360+
log.Printf("Response from VCS contained an error: %v", err)
365361
}
366362

367-
log.Printf("Response from GitHub: %+v\n", resp)
368363
body, _ := ioutil.ReadAll(resp.Body)
369364
defer resp.Body.Close()
370365

portal_config.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package main
22

3+
import "golang.org/x/oauth2"
4+
35
type portalConfig struct {
46
HTTPClientTimeoutInSecs int64 `ucp:"HTTP_CLIENT_TIMEOUT_IN_SECS"`
57
SkipTLSVerification bool `ucp:"SKIP_TLS_VERIFICATION"`
@@ -16,11 +18,10 @@ type portalConfig struct {
1618
HCPIdentityPort string `ucp:"HCP_IDENTITY_PORT"`
1719
AllowedOrigins []string `ucp:"ALLOWED_ORIGINS"`
1820
SessionStoreSecret string `ucp:"SESSION_STORE_SECRET"`
19-
GitHubOauthClientID string `ucp:"GITHUB_OAUTH_CLIENT_ID"`
20-
GitHubOAuthClientSecret string `ucp:"GITHUB_OAUTH_CLIENT_SECRET"`
21-
GitHubOAuthState string `ucp:"GITHUB_OAUTH_STATE"`
21+
VCSClients string `ucp:"VCS_CLIENTS"`
2222
EncryptionKeyVolume string `ucp:"ENCRYPTION_KEY_VOLUME"`
2323
EncryptionKeyFilename string `ucp:"ENCRYPTION_KEY_FILENAME"`
2424
EncryptionKey string `ucp:"ENCRYPTION_KEY"`
2525
EncryptionKeyInBytes []byte
26+
VCSClientMap map[VCSClientMapKey]oauth2.Config
2627
}

session.go

+12
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ func (p *portalProxy) setSessionValues(c echo.Context, values map[string]interfa
5959
return p.SessionStore.Save(req, res, session)
6060
}
6161

62+
func (p *portalProxy) unsetSessionValue(c echo.Context, sessionKey string) error {
63+
log.Println("unsetSessionValues")
64+
65+
req := c.Request().(*standard.Request).Request
66+
res := c.Response().(*standard.Response).ResponseWriter
67+
session, _ := p.SessionStore.Get(req, portalSessionName)
68+
69+
delete(session.Values, sessionKey)
70+
71+
return p.SessionStore.Save(req, res, session)
72+
}
73+
6274
func (p *portalProxy) clearSession(c echo.Context) error {
6375
log.Println("clearSession")
6476

0 commit comments

Comments
 (0)