func getCreds() (user, pass string) { nrc := loadNetrc() if nrc == nil { return "", "" } apiURL, err := url.Parse(config.APIEndpoint) if err != nil { utils.PrintFatal("invalid API URL: %s", err) } if apiURL.Host == "" { utils.PrintFatal("missing API host: %s", config.APIEndpoint) } if apiURL.User != nil { pw, _ := apiURL.User.Password() return apiURL.User.Username(), pw } m := nrc.FindMachine(apiURL.Host) if m == nil { return "", "" } return m.Login, m.Password }
// Login with the user email and password // An entry will be created in ~/.netrc on successful login. func Login() error { // Create a function to be overriden in tests email, password, err := getCredentials() if err != nil { return err } loginAsJson, err := json.Marshal(map[string]string{"email": email, "password": password}) if err != nil { return err } resp, err := http.Post(config.APIEndpoint+LOGIN_PATH, "application/json", bytes.NewReader(loginAsJson)) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Server returned non-200 status: %v\n", resp.Status) } // Read api token from response // body will be of the form: // {"api_token": "abcxzy123"} var response_body map[string]string err = json.NewDecoder(resp.Body).Decode(&response_body) if err != nil { return err } api_token := response_body["api_token"] err = saveCreds(strings.Split(resp.Request.Host, ":")[0], email, api_token) if err != nil { utils.PrintFatal("saving new token: " + err.Error()) } fmt.Println("Logged in.") return nil }
func netrcPath() string { if s := os.Getenv("NETRC_PATH"); s != "" { return s } return filepath.Join(os.Getenv("HOME"), netrcFilename) } var loadNetrc = func() *netrc.Netrc { nrc, err := netrc.ParseFile(netrcPath()) if err != nil { if os.IsNotExist(err) { nrc = &netrc.Netrc{} } else { utils.PrintFatal("loading netrc: " + err.Error()) } } return nrc } func saveCreds(host, user, pass string) error { nrc := loadNetrc() m := nrc.FindMachine(host) if m == nil || m.IsDefault() { m = nrc.NewMachine(host, user, pass, "") } m.UpdateLogin(user) m.UpdatePassword(pass) body, err := nrc.MarshalText()