From: Sergey Matveev Date: Mon, 1 Nov 2021 13:04:22 +0000 (+0300) Subject: Better .netrc handling X-Git-Url: http://www.git.stargrave.org/?p=mmfileget.git;a=commitdiff_plain;h=9c0dca60b83668053c20d5589272fbf1439f7834 Better .netrc handling --- diff --git a/main.go b/main.go index b52d52a..38d2cb0 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "os" - "path/filepath" "strings" "github.com/mattermost/mattermost-server/v5/model" @@ -15,28 +14,7 @@ func main() { s := strings.Split(url, "/") machine, fileId := s[2], s[6] - netrcPath, ok := os.LookupEnv("NETRC") - if !ok { - netrcPath = filepath.Join(os.Getenv("HOME"), ".netrc") - } - data, err := ioutil.ReadFile(netrcPath) - if err != nil { - panic(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] == machine && - f[2] == "login" && f[4] == "password" { - login, password = f[3], f[5] - break - } - } + login, password := findInNetrc(machine) if login == "" || password == "" { fmt.Fprintln(os.Stderr, "No credentials found for:", machine) os.Exit(1) @@ -59,8 +37,8 @@ func main() { fmt.Fprintln(os.Stderr, "Download? Ctrl-D/C") os.Stdin.Read(make([]byte, 1)) } - data, _ = Client.GetFile(fileId) - if err = ioutil.WriteFile(filename, data, os.FileMode(0666)); err != nil { + data, _ := Client.GetFile(fileId) + if err := ioutil.WriteFile(filename, data, os.FileMode(0666)); err != nil { panic(err) } } diff --git a/netrc.go b/netrc.go new file mode 100644 index 0000000..65fca7e --- /dev/null +++ b/netrc.go @@ -0,0 +1,67 @@ +// Nearly all code is taken from src/cmd/go/internal/auth/netrc.go + +package main + +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 "", "" +}