add ability to read login / pw from ~/.netrc

This commit is contained in:
Aaron Bieber 2017-10-05 09:07:51 -06:00 committed by Christoph Polcin
parent fbcb29d33e
commit a33240e4ab
3 changed files with 82 additions and 2 deletions

View File

@ -33,12 +33,14 @@ Usage of gowebdav
DEL <PATH> DEL <PATH>
-netrc-file string
read login from netrc file (default "~/.netrc")
-pw string -pw string
Password [ENV.PASSWORD] Password [ENV.PASSWORD]
-root string -root string
WebDAV Endpoint [ENV.ROOT] WebDAV Endpoint [ENV.ROOT]
-user string -user string
User [ENV.USER] User [ENV.USER] (default "$USER")
``` ```
*gowebdav wrapper script* *gowebdav wrapper script*
@ -98,6 +100,7 @@ included.
* [func FixSlashes(s string) string](#FixSlashes) * [func FixSlashes(s string) string](#FixSlashes)
* [func Join(path0 string, path1 string) string](#Join) * [func Join(path0 string, path1 string) string](#Join)
* [func PathEscape(path string) string](#PathEscape) * [func PathEscape(path string) string](#PathEscape)
* [func ReadConfig(uri, netrc string) (string, string)](#ReadConfig)
* [func String(r io.Reader) string](#String) * [func String(r io.Reader) string](#String)
* [type Authenticator](#Authenticator) * [type Authenticator](#Authenticator)
* [type BasicAuth](#BasicAuth) * [type BasicAuth](#BasicAuth)
@ -148,7 +151,7 @@ included.
* [PathEscape](#example_PathEscape) * [PathEscape](#example_PathEscape)
##### <a name="pkg-files">Package files</a> ##### <a name="pkg-files">Package files</a>
[basicAuth.go](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go) [client.go](https://github.com/studio-b12/gowebdav/blob/master/client.go) [digestAuth.go](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go) [doc.go](https://github.com/studio-b12/gowebdav/blob/master/doc.go) [file.go](https://github.com/studio-b12/gowebdav/blob/master/file.go) [requests.go](https://github.com/studio-b12/gowebdav/blob/master/requests.go) [utils.go](https://github.com/studio-b12/gowebdav/blob/master/utils.go) [basicAuth.go](https://github.com/studio-b12/gowebdav/blob/master/basicAuth.go) [client.go](https://github.com/studio-b12/gowebdav/blob/master/client.go) [digestAuth.go](https://github.com/studio-b12/gowebdav/blob/master/digestAuth.go) [doc.go](https://github.com/studio-b12/gowebdav/blob/master/doc.go) [file.go](https://github.com/studio-b12/gowebdav/blob/master/file.go) [netrc.go](https://github.com/studio-b12/gowebdav/blob/master/netrc.go) [requests.go](https://github.com/studio-b12/gowebdav/blob/master/requests.go) [utils.go](https://github.com/studio-b12/gowebdav/blob/master/utils.go)
### <a name="FixSlash">func</a> [FixSlash](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=707:737#L45) ### <a name="FixSlash">func</a> [FixSlash](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=707:737#L45)
``` go ``` go
@ -174,6 +177,13 @@ func PathEscape(path string) string
``` ```
PathEscape escapes all segemnts of a given path PathEscape escapes all segemnts of a given path
### <a name="ReadConfig">func</a> [ReadConfig](https://github.com/studio-b12/gowebdav/blob/master/netrc.go?s=428:479#L27)
``` go
func ReadConfig(uri, netrc string) (string, string)
```
ReadConfig reads login and password configuration from ~/.netrc
machine foo.com login username password 123456
### <a name="String">func</a> [String](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=1150:1181#L66) ### <a name="String">func</a> [String](https://github.com/studio-b12/gowebdav/blob/master/utils.go?s=1150:1181#L66)
``` go ``` go
func String(r io.Reader) string func String(r io.Reader) string

View File

@ -7,6 +7,7 @@ import (
d "github.com/studio-b12/gowebdav" d "github.com/studio-b12/gowebdav"
"io" "io"
"os" "os"
"os/user"
"path/filepath" "path/filepath"
"strings" "strings"
) )
@ -15,6 +16,7 @@ func main() {
root := flag.String("root", os.Getenv("ROOT"), "WebDAV Endpoint [ENV.ROOT]") root := flag.String("root", os.Getenv("ROOT"), "WebDAV Endpoint [ENV.ROOT]")
usr := flag.String("user", os.Getenv("USER"), "User [ENV.USER]") usr := flag.String("user", os.Getenv("USER"), "User [ENV.USER]")
pw := flag.String("pw", os.Getenv("PASSWORD"), "Password [ENV.PASSWORD]") pw := flag.String("pw", os.Getenv("PASSWORD"), "Password [ENV.PASSWORD]")
netrc := flag.String("netrc-file", filepath.Join(getHome(), ".netrc"), "read login from netrc file")
method := flag.String("X", "", `Method: method := flag.String("X", "", `Method:
LS <PATH> LS <PATH>
STAT <PATH> STAT <PATH>
@ -40,6 +42,13 @@ func main() {
fail("Unsupported arguments") fail("Unsupported arguments")
} }
if *pw == "" {
if u, p := d.ReadConfig(*root, *netrc); u != "" && p != "" {
usr = &u
pw = &p
}
}
c := d.NewClient(*root, *usr, *pw) c := d.NewClient(*root, *usr, *pw)
if err := c.Connect(); err != nil { if err := c.Connect(); err != nil {
fail(fmt.Sprintf("Failed to connect due to: %s", err.Error())) fail(fmt.Sprintf("Failed to connect due to: %s", err.Error()))
@ -59,6 +68,13 @@ func fail(err interface{}) {
os.Exit(-1) os.Exit(-1)
} }
func getHome() string {
if u, e := user.Current(); e != nil {
return u.HomeDir
}
return os.Getenv("HOME")
}
func getCmd(method string) func(c *d.Client, p0, p1 string) error { func getCmd(method string) func(c *d.Client, p0, p1 string) error {
switch strings.ToUpper(method) { switch strings.ToUpper(method) {
case "LS", "LIST", "PROPFIND": case "LS", "LIST", "PROPFIND":

54
netrc.go Normal file
View File

@ -0,0 +1,54 @@
package gowebdav
import (
"bufio"
"fmt"
"net/url"
"os"
"regexp"
"strings"
)
func parseLine(s string) (login, pass string) {
fields := strings.Fields(s)
for i, f := range fields {
if f == "login" {
login = fields[i+1]
}
if f == "password" {
pass = fields[i+1]
}
}
return login, pass
}
// ReadConfig reads login and password configuration from ~/.netrc
// machine foo.com login username password 123456
func ReadConfig(uri, netrc string) (string, string) {
u, err := url.Parse(uri)
if err != nil {
return "", ""
}
file, err := os.Open(netrc)
if err != nil {
return "", ""
}
defer file.Close()
re := fmt.Sprintf(`^.*machine %s.*$`, u.Host)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
s := scanner.Text()
matched, err := regexp.MatchString(re, s)
if err != nil {
return "", ""
}
if matched {
return parseLine(s)
}
}
return "", ""
}