notea-de-me/server/auth.go

62 lines
1.1 KiB
Go

package main
import (
"errors"
"io/ioutil"
yaml "gopkg.in/yaml.v2"
)
type auth interface {
Login(string, string) (bool, error)
Groups(string) ([]string, error)
}
type FileAuth struct {
path string
}
type fileAuthContent struct {
Users map[string]struct {
Password string
Groups []string
}
}
func NewFileAuth(path string) FileAuth {
return FileAuth{path: path}
}
func (fileAuth FileAuth) Login(u, p string) (bool, error) {
content, err := fileAuth.load()
if err != nil {
return false, err
}
entry, ok := content.Users[u]
return ok && entry.Password == p, nil
}
func (fileAuth FileAuth) Groups(u string) ([]string, error) {
content, err := fileAuth.load()
if err != nil {
return nil, err
}
entry, ok := content.Users[u]
if !ok {
return nil, errors.New("invalid user")
}
return entry.Groups, nil
}
func (fileAuth FileAuth) load() (fileAuthContent, error) {
var fileAuthContent fileAuthContent
b, err := ioutil.ReadFile(fileAuth.path)
if err != nil {
return fileAuthContent, err
}
if err := yaml.Unmarshal(b, &fileAuthContent); err != nil {
return fileAuthContent, err
}
return fileAuthContent, nil
}