Skip to content
This repository was archived by the owner on Jan 16, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions configure_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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:
Expand All @@ -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)
}
Expand Down
61 changes: 59 additions & 2 deletions configure_cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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) {
Expand Down
42 changes: 23 additions & 19 deletions login.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
)

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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))
Expand Down
63 changes: 61 additions & 2 deletions login_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down