diff options
author | Josh Bialkowski <josh.bialkowski@gmail.com> | 2019-12-04 22:50:35 -0800 |
---|---|---|
committer | Josh Bialkowski <josh.bialkowski@gmail.com> | 2019-12-18 07:42:16 -0800 |
commit | a59aaebc7e2fb6b1d14d6637cad7522463c0b25f (patch) | |
tree | e0f480918a4b16e0ac336e9ac46e6f3ce2007742 /bridge/jira/client.go | |
parent | cd889572f7870a62758240b323a9086a76c5120a (diff) | |
download | git-bug-a59aaebc7e2fb6b1d14d6637cad7522463c0b25f.tar.gz |
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
Diffstat (limited to 'bridge/jira/client.go')
-rw-r--r-- | bridge/jira/client.go | 63 |
1 files changed, 54 insertions, 9 deletions
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)) |