79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
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,
|
|
}
|
|
}
|