]> Sergey Matveev's repositories - tofuproxy.git/blob - netrc.go
Download link for 0.6.0 release
[tofuproxy.git] / netrc.go
1 // Nearly all code is taken from src/cmd/go/internal/auth/netrc.go
2
3 package tofuproxy
4
5 import (
6         "errors"
7         "io/fs"
8         "log"
9         "os"
10         "path/filepath"
11         "strings"
12 )
13
14 func findInNetrc(host string) (string, string) {
15         netrcPath, ok := os.LookupEnv("NETRC")
16         if !ok {
17                 homeDir, err := os.UserHomeDir()
18                 if err != nil {
19                         log.Fatalln(err)
20                 }
21                 netrcPath = filepath.Join(homeDir, ".netrc")
22         }
23         data, err := os.ReadFile(netrcPath)
24         if err != nil {
25                 if errors.Is(err, fs.ErrNotExist) {
26                         return "", ""
27                 }
28                 log.Fatalln(err)
29         }
30         inMacro := false
31         var machine, login, password string
32         for _, line := range strings.Split(string(data), "\n") {
33                 if inMacro {
34                         if line == "" {
35                                 inMacro = false
36                         }
37                         continue
38                 }
39                 fields := strings.Fields(line)
40                 i := 0
41                 for ; i < len(fields)-1; i += 2 {
42                         switch fields[i] {
43                         case "machine":
44                                 machine = fields[i+1]
45                                 login = ""
46                                 password = ""
47                         case "default":
48                                 break
49                         case "login":
50                                 login = fields[i+1]
51                         case "password":
52                                 password = fields[i+1]
53                         case "macdef":
54                                 inMacro = true
55                         }
56                         if machine != "" && login != "" && password != "" {
57                                 if machine == host {
58                                         return login, password
59                                 }
60                                 machine, login, password = "", "", ""
61                         }
62                 }
63                 if i < len(fields) && fields[i] == "default" {
64                         break
65                 }
66         }
67         return "", ""
68 }