package pgpassfile
import (
)
type Entry struct {
Hostname string
Port string
Database string
Username string
Password string
}
type Passfile struct {
Entries []*Entry
}
func ( string) (*Passfile, error) {
, := os.Open()
if != nil {
return nil,
}
defer .Close()
return ParsePassfile()
}
func ( io.Reader) (*Passfile, error) {
:= &Passfile{}
:= bufio.NewScanner()
for .Scan() {
:= parseLine(.Text())
if != nil {
.Entries = append(.Entries, )
}
}
return , .Err()
}
var colonSplitterRegexp = regexp.MustCompile("(([^:]|(\\:)))+")
func ( string) *Entry {
const (
= "\r"
= "\n"
)
= strings.TrimSpace()
if strings.HasPrefix(, "#") {
return nil
}
= strings.Replace(, `\\`, , -1)
= strings.Replace(, `\:`, , -1)
:= strings.Split(, ":")
if len() != 5 {
return nil
}
for := range {
[] = strings.Replace([], , `\`, -1)
[] = strings.Replace([], , `:`, -1)
}
return &Entry{
Hostname: [0],
Port: [1],
Database: [2],
Username: [3],
Password: [4],
}
}
func ( *Passfile) (, , , string) ( string) {
for , := range .Entries {
if (.Hostname == "*" || .Hostname == ) &&
(.Port == "*" || .Port == ) &&
(.Database == "*" || .Database == ) &&
(.Username == "*" || .Username == ) {
return .Password
}
}
return ""
}