This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
nginx-ldap-auth/ldap/pool.go

79 lines
1.4 KiB
Go
Raw Permalink Normal View History

2018-10-09 19:59:52 -04:00
package ldap
import (
"log"
"math/rand"
"regexp"
"strconv"
"strings"
"sync"
"time"
ldap "gopkg.in/ldap.v2"
)
type Pool struct {
url string
port int
ssl bool
username string
password string
conn *ldap.Conn
admin bool
lock sync.Mutex
}
func NewPool(servers []string, username, password string) *Pool {
url := ""
port := 0
schema := "auto"
size := len(servers)
if size != 0 {
r := rand.New(rand.NewSource(time.Now().Unix()))
server := servers[r.Intn(size)]
url = server
if strings.HasPrefix(url, "ldaps:") {
url = strings.TrimPrefix(strings.TrimPrefix(url, "ldaps:"), "//")
schema = "ldaps"
port = 636
} else if strings.HasPrefix(url, "ldap:") {
url = strings.TrimPrefix(strings.TrimPrefix(url, "ldap:"), "//")
schema = "ldap"
port = 389
}
portExp := regexp.MustCompile(`:[0-9]+$`)
if portExp.MatchString(url) {
str := portExp.FindString(url)
number, err := strconv.Atoi(str[1:])
if err == nil {
port = number
url = strings.TrimSuffix(url, str)
} else {
log.Printf("Error on parse port of \"%s\": %v\n", server, err)
}
}
if schema == "auto" {
if port == 636 {
schema = "ldaps"
} else if port == 389 {
schema = "ldap"
} else {
port = 0
}
}
}
return &Pool{
url: url,
port: port,
ssl: schema == "ldaps",
username: username,
password: password,
}
}