ghostream/auth/ldap/ldap.go

70 lines
1.5 KiB
Go
Raw Normal View History

2020-10-09 20:36:02 +00:00
// Package ldap provides a LDAP authentification backend
2020-09-22 09:42:57 +00:00
package ldap
2020-09-22 10:54:12 +00:00
import (
"github.com/go-ldap/ldap/v3"
"log"
2021-01-03 04:07:25 +00:00
"strings"
2020-09-22 10:54:12 +00:00
)
// Options holds package configuration
2020-09-22 09:42:57 +00:00
type Options struct {
2021-01-03 04:07:25 +00:00
Aliases map[string]map[string]string
URI string
UserDn string
2020-09-22 09:42:57 +00:00
}
2020-09-22 10:54:12 +00:00
// LDAP authentification backend
type LDAP struct {
Cfg *Options
Conn *ldap.Conn
2020-09-22 10:54:12 +00:00
}
// Login tries to bind to LDAP
// Returns (true, nil) if success
func (a LDAP) Login(username string, password string) (bool, error) {
2021-01-03 04:07:25 +00:00
aliasSplit := strings.SplitN(username, "__", 2)
potentialUsernames := []string{username}
for len(aliasSplit) == 2 {
alias := aliasSplit[0]
trueUsername := aliasSplit[1]
// Resolve stream alias if necessary
if aliases, ok := a.Cfg.Aliases[alias]; ok {
if _, ok := aliases[trueUsername]; ok {
log.Printf("[LDAP] Use stream alias %s for username %s", alias, trueUsername)
potentialUsernames = append(potentialUsernames, trueUsername)
}
}
}
2021-01-03 04:07:25 +00:00
var err error = nil
for _, username := range potentialUsernames {
// Try to bind as user
bindDn := "cn=" + username + "," + a.Cfg.UserDn
err = a.Conn.Bind(bindDn, password)
if err == nil {
// Login succeeded if no error
return true, nil
}
}
2020-09-22 10:54:12 +00:00
2021-01-03 04:07:25 +00:00
// Unable to log in
2020-09-22 14:39:06 +00:00
return err == nil, err
2020-09-22 10:54:12 +00:00
}
// Close LDAP connection
func (a LDAP) Close() {
a.Conn.Close()
}
2020-09-22 14:39:06 +00:00
// New instanciates a new LDAP connection
func New(cfg *Options) (LDAP, error) {
backend := LDAP{Cfg: cfg}
// Connect to LDAP server
c, err := ldap.DialURL(backend.Cfg.URI)
backend.Conn = c
return backend, err
}