// hostCredentials returns credentials for the given Gerrit host. The // function uses best effort to scan common locations where the // credentials could exist. func hostCredentials(run *runutil.Run, host string) (_ *credentials, e error) { // Check the host URL is valid. url, err := url.Parse(host) if err != nil { return nil, fmt.Errorf("Parse(%q) failed: %v", host, err) } if url.Host == "" { return nil, fmt.Errorf("%q has no host", host) } // Look for the host credentials in the .netrc file. netrcPath := filepath.Join(os.Getenv("HOME"), ".netrc") file, err := run.Open(netrcPath) if err != nil { if !os.IsNotExist(err) { return nil, err } } else { defer collect.Error(func() error { return file.Close() }, &e) credsMap, err := parseNetrcFile(file) if err != nil { return nil, err } creds, ok := credsMap[url.Host] if ok { return creds, nil } } // Look for the host credentials in the git cookie file. args := []string{"config", "--get", "http.cookiefile"} var stdout, stderr bytes.Buffer opts := run.Opts() opts.Stdout = &stdout opts.Stderr = &stderr if err := run.CommandWithOpts(opts, "git", args...); err == nil { cookieFilePath := strings.TrimSpace(stdout.String()) file, err := run.Open(cookieFilePath) if err != nil { if !os.IsNotExist(err) { return nil, err } } else { defer collect.Error(func() error { return file.Close() }, &e) credsMap, err := parseGitCookieFile(file) if err != nil { return nil, err } creds, ok := credsMap[url.Host] if ok { return creds, nil } // Account for site-wide credentials. Namely, the git cookie // file can contain credentials of the form ".<name>", which // should match any host "*.<name>". for host, creds := range credsMap { if strings.HasPrefix(host, ".") && strings.HasSuffix(url.Host, host) { return creds, nil } } } } return nil, fmt.Errorf("cannot find credentials for %q", host) }