From: Sergey Matveev Date: Mon, 1 Nov 2021 12:30:38 +0000 (+0300) Subject: Better .netrc handling X-Git-Tag: v0.1.0~46 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=8324aaa45ee59cc3971135554a54df3849777ebf;p=tofuproxy.git Better .netrc handling --- diff --git a/httpauth.go b/httpauth.go index 5b454ca..819a78c 100644 --- a/httpauth.go +++ b/httpauth.go @@ -22,45 +22,12 @@ import ( "bytes" "errors" "fmt" - "io/ioutil" - "log" - "os" "os/exec" - "path/filepath" "strings" ttls "go.stargrave.org/tofuproxy/tls" ) -func findInNetrc(host string) (string, string) { - netrcPath, ok := os.LookupEnv("NETRC") - if !ok { - netrcPath = filepath.Join(os.Getenv("HOME"), ".netrc") - } - data, err := ioutil.ReadFile(netrcPath) - if err != nil { - if os.IsNotExist(err) { - return "", "" - } - log.Fatalln(err) - } - var login string - var password string - for _, line := range strings.Split(string(data), "\n") { - if i := strings.Index(line, "#"); i >= 0 { - line = line[:i] - } - f := strings.Fields(line) - if len(f) >= 6 && - f[0] == "machine" && f[1] == host && - f[2] == "login" && f[4] == "password" { - login, password = f[3], f[5] - break - } - } - return login, password -} - func authDialog(host, realm string) (string, string, error) { var b bytes.Buffer userInit, passInit := findInNetrc(host) diff --git a/netrc.go b/netrc.go new file mode 100644 index 0000000..8cc6560 --- /dev/null +++ b/netrc.go @@ -0,0 +1,67 @@ +// Nearly all code is taken from src/cmd/go/internal/auth/netrc.go + +package tofuproxy + +import ( + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" +) + +func findInNetrc(host string) (string, string) { + netrcPath, ok := os.LookupEnv("NETRC") + if !ok { + homeDir, err := os.UserHomeDir() + if err != nil { + log.Fatalln(err) + } + netrcPath = filepath.Join(homeDir, ".netrc") + } + data, err := ioutil.ReadFile(netrcPath) + if err != nil { + if os.IsNotExist(err) { + return "", "" + } + log.Fatalln(err) + } + inMacro := false + var machine, login, password string + for _, line := range strings.Split(string(data), "\n") { + if inMacro { + if line == "" { + inMacro = false + } + continue + } + fields := strings.Fields(line) + i := 0 + for ; i < len(fields)-1; i += 2 { + switch fields[i] { + case "machine": + machine = fields[i+1] + login = "" + password = "" + case "default": + break + case "login": + login = fields[i+1] + case "password": + password = fields[i+1] + case "macdef": + inMacro = true + } + if machine != "" && login != "" && password != "" { + if machine == host { + return login, password + } + machine, login, password = "", "", "" + } + } + if i < len(fields) && fields[i] == "default" { + break + } + } + return "", "" +}