From a85616ad5bcd6be5c4f9ca524cf1306538a6fa39 Mon Sep 17 00:00:00 2001 From: Jingwen Owen Ou Date: Thu, 30 May 2013 06:58:19 -0700 Subject: [PATCH] Fix bug that can't authenticate user --- config/config.go | 78 ++++++++++++++++++++----------------------- config/config_test.go | 17 ++++------ github/github.go | 16 +++------ github/http.go | 17 +++------- 4 files changed, 51 insertions(+), 77 deletions(-) diff --git a/config/config.go b/config/config.go index 6a984216..9a545322 100644 --- a/config/config.go +++ b/config/config.go @@ -4,64 +4,73 @@ import ( "bufio" "encoding/json" "errors" + "fmt" + "github.com/howeyc/gopass" + "github.com/jingweno/gh/utils" "os" "path/filepath" ) +const GitHubHost string = "github.com" + type Config struct { User string `json:"user"` Token string `json:"token"` } -var DefaultFile string +func (c *Config) UserName() string { + if c.User == "" { + var user string + msg := fmt.Sprintf("%s username: ", GitHubHost) + fmt.Print(msg) + fmt.Scanln(&user) + c.User = user + } -func init() { - DefaultFile = filepath.Join(os.Getenv("HOME"), ".config", "gh") + return c.User } -func LoadAll() ([]*Config, error) { - configs, err := loadFrom(DefaultFile) - if err != nil { - return nil, err +func (c *Config) Password() string { + msg := fmt.Sprintf("%s password for %s (never stored): ", GitHubHost, c.User) + fmt.Print(msg) + + pass := gopass.GetPasswd() + if len(pass) == 0 { + utils.Check(errors.New("Password cannot be empty")) } - return configs, nil + return string(pass) } -func Load(user string) (*Config, error) { - configs, err := LoadAll() - if err != nil { - return nil, err - } +var DefaultFile string - for _, c := range configs { - if c.User == user { - return c, nil - } - } +func init() { + DefaultFile = filepath.Join(os.Getenv("HOME"), ".config", "gh") +} - return nil, errors.New("There's no matching config for user: " + user) +func Load() (Config, error) { + return loadFrom(DefaultFile) } -func loadFrom(filename string) ([]*Config, error) { +func loadFrom(filename string) (Config, error) { f, err := os.Open(filename) if err != nil { - return nil, err + return Config{}, err } return doLoadFrom(f) } -func doLoadFrom(f *os.File) ([]*Config, error) { +func doLoadFrom(f *os.File) (Config, error) { defer f.Close() reader := bufio.NewReader(f) dec := json.NewDecoder(reader) - var c []*Config + var c Config err := dec.Decode(&c) if err != nil { - return nil, err + return Config{}, err } return c, nil @@ -72,8 +81,6 @@ func Save(config *Config) error { } func saveTo(filename string, config *Config) error { - configs, _ := loadFrom(filename) - err := os.MkdirAll(filepath.Dir(filename), 0771) if err != nil { return err @@ -84,25 +91,12 @@ func saveTo(filename string, config *Config) error { return err } - var foundConfig *Config - for _, c := range configs { - if c.User == config.User { - foundConfig = c - break - } - } - if foundConfig == nil { - configs = append(configs, config) - } else { - foundConfig.Token = config.Token - } - - return doSaveTo(f, configs) + return doSaveTo(f, config) } -func doSaveTo(f *os.File, configs []*Config) error { +func doSaveTo(f *os.File, config *Config) error { defer f.Close() enc := json.NewEncoder(f) - return enc.Encode(configs) + return enc.Encode(config) } diff --git a/config/config_test.go b/config/config_test.go index 6f175cfc..ecb2b7cf 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -15,21 +15,16 @@ func TestSave(t *testing.T) { err := saveTo(file, &config) assert.Equal(t, nil, err) - configs, err := loadFrom(file) + config, err = loadFrom(file) assert.Equal(t, nil, err) - assert.Equal(t, 1, len(configs)) - assert.Equal(t, "jingweno", configs[0].User) - assert.Equal(t, "123", configs[0].Token) + assert.Equal(t, "jingweno", config.User) + assert.Equal(t, "123", config.Token) newConfig := Config{"foo", "456"} err = saveTo(file, &newConfig) assert.Equal(t, nil, err) - configs, err = loadFrom(file) - assert.Equal(t, nil, err) - assert.Equal(t, 2, len(configs)) - assert.Equal(t, "jingweno", configs[0].User) - assert.Equal(t, "123", configs[0].Token) - assert.Equal(t, "foo", configs[1].User) - assert.Equal(t, "456", configs[1].Token) + config, err = loadFrom(file) + assert.Equal(t, "foo", config.User) + assert.Equal(t, "456", config.Token) } diff --git a/github/github.go b/github/github.go index 6e7847e3..65f0e7b4 100644 --- a/github/github.go +++ b/github/github.go @@ -9,9 +9,9 @@ import ( ) const ( - GitHubUrl string = "https://" + GitHubHost - GitHubHost string = "api.github.com" - OAuthAppUrl string = "http://owenou.com/gh" + GitHubApiUrl string = "https://" + GitHubApiHost + GitHubApiHost string = "api.github.com" + OAuthAppUrl string = "http://owenou.com/gh" ) type GitHub struct { @@ -57,15 +57,9 @@ func hashAuth(u, p string) string { func New() *GitHub { project := CurrentProject() - configs, err := config.LoadAll() - var c *config.Config - if err == nil { - c = configs[0] - } else { - c = &config.Config{User: project.Owner} - } + c, _ := config.Load() - gh := GitHub{&http.Client{}, "", project, c} + gh := GitHub{&http.Client{}, "", project, &c} if c.Token != "" { gh.updateTokenAuth(c.Token) } diff --git a/github/http.go b/github/http.go index ee8eb823..c99c30e5 100644 --- a/github/http.go +++ b/github/http.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/howeyc/gopass" "io/ioutil" "net/http" ) @@ -24,16 +23,8 @@ type GitHubErrors struct { } func performBasicAuth(gh *GitHub) error { - user := gh.project.Owner - msg := fmt.Sprintf("%s password for %s (never stored): ", GitHubHost, user) - fmt.Print(msg) - - pass := gopass.GetPasswd() - if len(pass) == 0 { - return errors.New("Password cannot be empty") - } - password := string(pass) - + user := gh.config.UserName() + password := gh.config.Password() gh.updateBasicAuth(user, password) return obtainOAuthTokenWithBasicAuth(gh) @@ -73,7 +64,7 @@ func obtainOAuthTokenWithBasicAuth(gh *GitHub) error { } func httpGet(gh *GitHub, uri string, extraHeaders map[string]string) (*http.Response, error) { - url := fmt.Sprintf("%s%s", GitHubUrl, uri) + url := fmt.Sprintf("%s%s", GitHubApiUrl, uri) request, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err @@ -89,7 +80,7 @@ func httpGet(gh *GitHub, uri string, extraHeaders map[string]string) (*http.Resp } func httpPost(gh *GitHub, uri string, extraHeaders map[string]string, content *bytes.Buffer) (*http.Response, error) { - url := fmt.Sprintf("%s%s", GitHubUrl, uri) + url := fmt.Sprintf("%s%s", GitHubApiUrl, uri) request, err := http.NewRequest("POST", url, content) if err != nil { return nil, err -- GitLab