|
|
@ -19,18 +19,18 @@ type Hasher interface { |
|
|
|
Prefix() string |
|
|
|
Prefix() string |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ParseHtpasswdFile parses a .htpasswd file
|
|
|
|
// ParseFile parses a .htpasswd file
|
|
|
|
// and returns a Passwd type
|
|
|
|
// and returns a Passwd type
|
|
|
|
func ParseHtpasswdFile(file string) (Passwds, error) { |
|
|
|
func ParseFile(file string) (Passwds, error) { |
|
|
|
htpasswdBytes, err := os.ReadFile(file) |
|
|
|
htpasswdBytes, err := os.ReadFile(file) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
} |
|
|
|
return ParseHtpasswd(htpasswdBytes) |
|
|
|
return Parse(htpasswdBytes) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ParseHtpasswd parses a slice of bytes in htpasswd style
|
|
|
|
// Parse parses a slice of bytes in htpasswd style
|
|
|
|
func ParseHtpasswd(htpasswdBytes []byte) (Passwds, error) { |
|
|
|
func Parse(htpasswdBytes []byte) (Passwds, error) { |
|
|
|
lines := strings.Split(string(htpasswdBytes), "\n") |
|
|
|
lines := strings.Split(string(htpasswdBytes), "\n") |
|
|
|
passwords := make(map[string]string) |
|
|
|
passwords := make(map[string]string) |
|
|
|
var err error |
|
|
|
var err error |
|
|
@ -63,7 +63,7 @@ func ParseHtpasswd(htpasswdBytes []byte) (Passwds, error) { |
|
|
|
// CreateUser creates a record in the named file with
|
|
|
|
// CreateUser creates a record in the named file with
|
|
|
|
// the named password and hash algorithm
|
|
|
|
// the named password and hash algorithm
|
|
|
|
func CreateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
func CreateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
pp, err := ParseHtpasswdFile(file) |
|
|
|
pp, err := ParseFile(file) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
@ -71,7 +71,7 @@ func CreateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
return pp.Write(file) |
|
|
|
return pp.WriteFile(file) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// CreateUser will create a new user in the given Passwd object
|
|
|
|
// CreateUser will create a new user in the given Passwd object
|
|
|
@ -91,7 +91,7 @@ func (pp Passwds) CreateUser(user, passwd string, algo Hasher) error { |
|
|
|
// UpdateUser will update the password for the named user
|
|
|
|
// UpdateUser will update the password for the named user
|
|
|
|
// in the named file
|
|
|
|
// in the named file
|
|
|
|
func UpdateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
func UpdateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
pp, err := ParseHtpasswdFile(file) |
|
|
|
pp, err := ParseFile(file) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
@ -99,7 +99,7 @@ func UpdateUser(file, user, passwd string, algo Hasher) error { |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
return pp.Write(file) |
|
|
|
return pp.WriteFile(file) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// UpdateUser will update the password for the named user
|
|
|
|
// UpdateUser will update the password for the named user
|
|
|
@ -118,7 +118,7 @@ func (pp Passwds) UpdateUser(user, passwd string, algo Hasher) error { |
|
|
|
|
|
|
|
|
|
|
|
// DeleteUser deletes the named user from the named file
|
|
|
|
// DeleteUser deletes the named user from the named file
|
|
|
|
func DeleteUser(file, user string) error { |
|
|
|
func DeleteUser(file, user string) error { |
|
|
|
pp, err := ParseHtpasswdFile(file) |
|
|
|
pp, err := ParseFile(file) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
@ -127,7 +127,7 @@ func DeleteUser(file, user string) error { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return pp.Write(file) |
|
|
|
return pp.WriteFile(file) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// DeleteUser deletes the named user from the named file
|
|
|
|
// DeleteUser deletes the named user from the named file
|
|
|
@ -143,7 +143,7 @@ func (pp Passwds) DeleteUser(user string) error { |
|
|
|
// VerifyUser will check if the given user and password are matching
|
|
|
|
// VerifyUser will check if the given user and password are matching
|
|
|
|
// with the content of the given file
|
|
|
|
// with the content of the given file
|
|
|
|
func VerifyUser(file, user, passwd string) error { |
|
|
|
func VerifyUser(file, user, passwd string) error { |
|
|
|
pp, err := ParseHtpasswdFile(file) |
|
|
|
pp, err := ParseFile(file) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
@ -163,8 +163,8 @@ func (pp Passwds) VerifyUser(user, passwd string) error { |
|
|
|
return alg.Match(passwd, pp[user]) |
|
|
|
return alg.Match(passwd, pp[user]) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Write will write the Passwd object to the given file
|
|
|
|
// WriteFile will write the Passwds object to the given file
|
|
|
|
func (pp Passwds) Write(file string) error { |
|
|
|
func (pp Passwds) WriteFile(file string) error { |
|
|
|
return os.WriteFile(file, pp.Bytes(), os.ModePerm) |
|
|
|
return os.WriteFile(file, pp.Bytes(), os.ModePerm) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|