From 26c214527d2c5b2c44bc2300424e636077814154 Mon Sep 17 00:00:00 2001 From: Pavan Kumar Date: Thu, 27 Aug 2015 14:15:08 +0000 Subject: [PATCH] fix minor messaging bugs in configure token --- configure_cmd.go | 17 ++++++++---- configure_cmd_test.go | 61 +++++++++++++++++++++++++++++++++++++++-- login.go | 42 ++++++++++++++++------------- login_test.go | 63 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 155 insertions(+), 28 deletions(-) diff --git a/configure_cmd.go b/configure_cmd.go index 7b3802c..ddb48c0 100644 --- a/configure_cmd.go +++ b/configure_cmd.go @@ -2,14 +2,16 @@ package main import ( "fmt" + "io" "github.com/facebookgo/stackerr" "github.com/spf13/cobra" ) type configureCmd struct { - login login - isDefault bool + login login + isDefault bool + tokenReader io.Reader // for testing } func (c *configureCmd) accountKey(e *env) error { @@ -28,14 +30,18 @@ func (c *configureCmd) accountKey(e *env) error { email = "" } - creds, _ := (&login{}).getTokenCredentials(e, email) + var l login + if c.tokenReader != nil { + l.tokenReader = c.tokenReader + } + foundEmail, creds, _ := l.getTokenCredentials(e, email) if creds != nil { if c.isDefault { fmt.Fprintln( e.Err, "Note: this operation will overwrite the default account key", ) - } else { + } else if foundEmail { fmt.Fprintf( e.Err, `Note: this operation will overwrite the account key: @@ -52,8 +58,9 @@ for email: %q if err == nil { if c.isDefault { fmt.Fprintln(e.Out, "Successfully stored default account key.") + } else { + fmt.Fprintf(e.Out, "Successfully stored account key for: %q.\n", email) } - fmt.Fprintf(e.Out, "Successfully stored account key for: %q.\n", email) } return stackerr.Wrap(err) } diff --git a/configure_cmd_test.go b/configure_cmd_test.go index e8d231e..cca065f 100644 --- a/configure_cmd_test.go +++ b/configure_cmd_test.go @@ -10,13 +10,14 @@ import ( "github.com/facebookgo/ensure" ) -func TestConfigureAccessToken(t *testing.T) { +func TestConfigureAccountKey(t *testing.T) { t.Parallel() h := newTokenHarness(t) defer h.Stop() c := configureCmd{login: login{tokenReader: strings.NewReader("")}} + h.env.In = ioutil.NopCloser(strings.NewReader("token\n")) ensure.Nil(t, c.accountKey(h.env)) ensure.DeepEqual( @@ -26,12 +27,68 @@ func TestConfigureAccessToken(t *testing.T) { Input your account key or press enter to generate a new one. Account Key: Successfully stored account key for: "email". `) - h.env.In = ioutil.NopCloser(strings.NewReader("email\ninvalid\n")) + + h.env.In = ioutil.NopCloser(strings.NewReader("invalid\n")) ensure.Err(t, c.accountKey(h.env), regexp.MustCompile("is not valid")) ensure.DeepEqual(t, h.Err.String(), "Could not store credentials. Please try again.\n\n", ) + + h.env.Server = "http://api.parse.com/1/" + c.tokenReader = strings.NewReader( + `machine api.parse.com#email + login default + password token2 + `, + ) + h.Err.Reset() + h.env.In = ioutil.NopCloser(strings.NewReader("token\n")) + ensure.Nil(t, c.accountKey(h.env)) + ensure.DeepEqual(t, h.Err.String(), + `Note: this operation will overwrite the account key: + "*oken" +for email: "email" +`) + + h.env.Server = "http://api.parse.com/1/" + c.tokenReader = strings.NewReader( + `machine api.parse.com#email + login default + password token2 + `, + ) + c.isDefault = true + h.Err.Reset() + h.env.In = ioutil.NopCloser(strings.NewReader("token\n")) + ensure.Nil(t, c.accountKey(h.env)) + ensure.DeepEqual(t, h.Err.String(), "") + + h.env.Server = "http://api.parse.com/1/" + c.tokenReader = strings.NewReader( + `machine api.parse.com + login default + password token2 + `, + ) + c.isDefault = true + h.Err.Reset() + h.env.In = ioutil.NopCloser(strings.NewReader("token\n")) + ensure.Nil(t, c.accountKey(h.env)) + ensure.DeepEqual(t, h.Err.String(), "Note: this operation will overwrite the default account key\n") + + h.env.Server = "http://api.parse.com/1/" + c.tokenReader = strings.NewReader( + `machine api.parse.com + login default + password token2 + `, + ) + h.Err.Reset() + c.isDefault = false + h.env.In = ioutil.NopCloser(strings.NewReader("token\n")) + ensure.Nil(t, c.accountKey(h.env)) + ensure.DeepEqual(t, h.Err.String(), "") } func TestParserEmail(t *testing.T) { diff --git a/login.go b/login.go index d68b44f..fd4f8ca 100644 --- a/login.go +++ b/login.go @@ -42,7 +42,7 @@ to reset your password`) tokenErrMsgf = `Sorry, the account key: %q you provided is not valid. Please follow instructions at %q to generate a new one. ` - keyNotFound = regexp.MustCompile("Could not find access key") + keyNotFound = regexp.MustCompile("Could not find account key") parseNetrc = filepath.Join(".parse", "netrc") ) @@ -95,49 +95,53 @@ func (l *login) getTokensReader() (io.Reader, error) { return file, nil } -func (l *login) getTokenCredentials(e *env, email string) (*credentials, error) { +func (l *login) getTokenCredentials(e *env, email string) (bool, *credentials, error) { reader, err := l.getTokensReader() if err != nil { - return nil, stackerr.Wrap(err) + return false, nil, stackerr.Wrap(err) } tokens, err := netrc.Parse(reader) if err != nil { - return nil, stackerr.Wrap(err) + return false, nil, stackerr.Wrap(err) } server, err := getHostFromURL(e.Server, email) if err != nil { - return nil, err + return false, nil, err } machine := tokens.FindMachine(server) if machine != nil { - return &credentials{ - token: machine.Password, - }, nil + return true, + &credentials{ + token: machine.Password, + }, nil } if email == "" { - return nil, stackerr.Newf("Could not find access key for %q", server) + return false, nil, stackerr.Newf("Could not find account key for %q", server) } // check for system default account key for the given server // since we could not find account key for the given account (email) server, err = getHostFromURL(e.Server, "") if err != nil { - return nil, err + return false, nil, err } machine = tokens.FindMachine(server) if machine != nil { - return &credentials{ - token: machine.Password, - }, nil + return false, + &credentials{ + token: machine.Password, + }, nil } - return nil, stackerr.Newf( - `Could not find access key for email: %q, + return false, + nil, + stackerr.Newf( + `Could not find account key for email: %q, and default access key not configured for %q `, - email, - e.Server, - ) + email, + e.Server, + ) } func (l *login) updatedNetrcContent( @@ -228,7 +232,7 @@ func (l *login) authToken(e *env, token string) (string, error) { } func (l *login) authUserWithToken(e *env) (string, error) { - tokenCredentials, err := l.getTokenCredentials(e, e.ParserEmail) + _, tokenCredentials, err := l.getTokenCredentials(e, e.ParserEmail) if err != nil { if stackerr.HasUnderlying(err, stackerr.MatcherFunc(accessKeyNotFound)) { fmt.Fprintln(e.Err, errorString(e, err)) diff --git a/login_test.go b/login_test.go index e693405..3ae1379 100644 --- a/login_test.go +++ b/login_test.go @@ -67,13 +67,72 @@ func TestGetTokenCredentials(t *testing.T) { password token `, ) - credentials, err := l.getTokenCredentials(h.env, "") + _, credentials, err := l.getTokenCredentials(h.env, "") ensure.Nil(t, err) ensure.DeepEqual(t, credentials.token, "token") + l.tokenReader = strings.NewReader( + `machine api.example.com + login default + password token + `, + ) h.env.Server = "http://api.parse.com" - credentials, err = l.getTokenCredentials(h.env, "") + _, credentials, err = l.getTokenCredentials(h.env, "") ensure.Err(t, err, keyNotFound) + + l = &login{} + h.env.Server = "http://api.example.com/1/" + + l.tokenReader = strings.NewReader( + `machine api.example.com#email + login default + password token + `, + ) + _, credentials, err = l.getTokenCredentials(h.env, "email") + ensure.Nil(t, err) + ensure.DeepEqual(t, credentials.token, "token") + + l.tokenReader = strings.NewReader( + `machine api.example.com#email + login default + password token + `, + ) + h.env.Server = "http://api.parse.com" + _, credentials, err = l.getTokenCredentials(h.env, "email") + ensure.Err(t, err, keyNotFound) + + l = &login{} + h.env.Server = "http://api.example.com/1/" + + l.tokenReader = strings.NewReader( + `machine api.example.com#email + login default + password token1 +machine api.example.com + login default + password token2 +`, + ) + _, credentials, err = l.getTokenCredentials(h.env, "email") + ensure.Nil(t, err) + ensure.DeepEqual(t, credentials.token, "token1") + + l.tokenReader = strings.NewReader( + `machine api.example.com#email + login default + password token1 +machine api.example.com + login default + password token2 +`, + ) + + _, credentials, err = l.getTokenCredentials(h.env, "xmail") + ensure.Nil(t, err) + ensure.DeepEqual(t, credentials.token, "token2") } func TestAuthUserWithToken(t *testing.T) {