From a59aaebc7e2fb6b1d14d6637cad7522463c0b25f Mon Sep 17 00:00:00 2001 From: Josh Bialkowski Date: Wed, 4 Dec 2019 22:50:35 -0800 Subject: codreview #3: two credential types, more fixes * Support both token and session credential types * use getTimeDervedID in export.go * keyOrigin -> core.KeyOrigin * fix one indentation * remove project key from operation metadata * fix missing credentials codepath if not using sidecar --- bridge/jira/client.go | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 9 deletions(-) (limited to 'bridge/jira/client.go') diff --git a/bridge/jira/client.go b/bridge/jira/client.go index 6dd25ccb..adaad94d 100644 --- a/bridge/jira/client.go +++ b/bridge/jira/client.go @@ -3,6 +3,7 @@ package jira import ( "bytes" "context" + "encoding/base64" "encoding/json" "fmt" "io/ioutil" @@ -305,15 +306,27 @@ type ServerInfo struct { // "Content-Type=application/json" header type ClientTransport struct { underlyingTransport http.RoundTripper + basicAuthString string } // RoundTrip overrides the default by adding the content-type header func (self *ClientTransport) RoundTrip( req *http.Request) (*http.Response, error) { req.Header.Add("Content-Type", "application/json") + if self.basicAuthString != "" { + req.Header.Add("Authorization", + fmt.Sprintf("Basic %s", self.basicAuthString)) + } + return self.underlyingTransport.RoundTrip(req) } +func (self *ClientTransport) SetCredentials( + username string, token string) { + credString := fmt.Sprintf("%s:%s", username, token) + self.basicAuthString = base64.StdEncoding.EncodeToString([]byte(credString)) +} + // Client Thin wrapper around the http.Client providing jira-specific methods // for APIendpoints type Client struct { @@ -336,12 +349,26 @@ func NewClient(serverURL string, ctx context.Context) *Client { // Login POST credentials to the /session endpoing and get a session cookie func (client *Client) Login(conf core.Configuration) error { + credType := conf[keyCredentialsType] + if conf[keyCredentialsFile] != "" { content, err := ioutil.ReadFile(conf[keyCredentialsFile]) if err != nil { return err } - return client.RefreshTokenRaw(content) + + switch credType { + case "SESSION": + return client.RefreshSessionTokenRaw(content) + case "TOKEN": + var params SessionQuery + err := json.Unmarshal(content, ¶ms) + if err != nil { + return err + } + return client.SetTokenCredentials(params.Username, params.Password) + } + return fmt.Errorf("Unexpected credType: %s", credType) } username := conf[keyUsername] @@ -360,12 +387,18 @@ func (client *Client) Login(conf core.Configuration) error { } } - return client.RefreshToken(username, password) + switch credType { + case "SESSION": + return client.RefreshSessionToken(username, password) + case "TOKEN": + return client.SetTokenCredentials(username, password) + } + return fmt.Errorf("Unexpected credType: %s", credType) } -// RefreshToken formulate the JSON request object from the user credentials -// and POST it to the /session endpoing and get a session cookie -func (client *Client) RefreshToken(username, password string) error { +// RefreshSessionToken formulate the JSON request object from the user +// credentials and POST it to the /session endpoing and get a session cookie +func (client *Client) RefreshSessionToken(username, password string) error { params := SessionQuery{ Username: username, Password: password, @@ -376,12 +409,24 @@ func (client *Client) RefreshToken(username, password string) error { return err } - return client.RefreshTokenRaw(data) + return client.RefreshSessionTokenRaw(data) +} + +// SetTokenCredentials POST credentials to the /session endpoing and get a +// session cookie +func (client *Client) SetTokenCredentials(username, password string) error { + switch transport := client.Transport.(type) { + case *ClientTransport: + transport.SetCredentials(username, password) + default: + return fmt.Errorf("Invalid transport type") + } + return nil } -// RefreshTokenRaw POST credentials to the /session endpoing and get a session -// cookie -func (client *Client) RefreshTokenRaw(credentialsJSON []byte) error { +// RefreshSessionTokenRaw POST credentials to the /session endpoing and get a +// session cookie +func (client *Client) RefreshSessionTokenRaw(credentialsJSON []byte) error { postURL := fmt.Sprintf("%s/rest/auth/1/session", client.serverURL) req, err := http.NewRequest("POST", postURL, bytes.NewBuffer(credentialsJSON)) -- cgit