mirror of
https://github.com/DJSundog/wg-portal.git
synced 2024-11-23 15:13:52 -05:00
113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package ldap
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/go-ldap/ldap/v3"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type RawLdapData struct {
|
|
DN string
|
|
Attributes map[string]string
|
|
RawAttributes map[string][][]byte
|
|
}
|
|
|
|
func Open(cfg *Config) (*ldap.Conn, error) {
|
|
conn, err := ldap.DialURL(cfg.URL)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to connect to LDAP")
|
|
}
|
|
|
|
if cfg.StartTLS {
|
|
// Reconnect with TLS
|
|
err = conn.StartTLS(&tls.Config{InsecureSkipVerify: !cfg.CertValidation})
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to star TLS on connection")
|
|
}
|
|
}
|
|
|
|
err = conn.Bind(cfg.BindUser, cfg.BindPass)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to bind to LDAP")
|
|
}
|
|
|
|
return conn, nil
|
|
}
|
|
|
|
func Close(conn *ldap.Conn) {
|
|
if conn != nil {
|
|
conn.Close()
|
|
}
|
|
}
|
|
|
|
func FindAllUsers(cfg *Config) ([]RawLdapData, error) {
|
|
client, err := Open(cfg)
|
|
if err != nil {
|
|
return nil, errors.WithMessage(err, "failed to open ldap connection")
|
|
}
|
|
defer Close(client)
|
|
|
|
// Search all users
|
|
attrs := []string{"dn", cfg.EmailAttribute, cfg.EmailAttribute, cfg.FirstNameAttribute, cfg.LastNameAttribute,
|
|
cfg.PhoneAttribute, cfg.GroupMemberAttribute}
|
|
if cfg.DisabledAttribute != "" {
|
|
attrs = append(attrs, cfg.DisabledAttribute)
|
|
}
|
|
searchRequest := ldap.NewSearchRequest(
|
|
cfg.BaseDN,
|
|
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
|
|
fmt.Sprintf("(objectClass=%s)", cfg.UserClass), attrs, nil,
|
|
)
|
|
|
|
sr, err := client.Search(searchRequest)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed to search in ldap")
|
|
}
|
|
|
|
tmpData := make([]RawLdapData, 0, len(sr.Entries))
|
|
|
|
for _, entry := range sr.Entries {
|
|
tmp := RawLdapData{
|
|
DN: entry.DN,
|
|
Attributes: make(map[string]string, len(attrs)),
|
|
RawAttributes: make(map[string][][]byte, len(attrs)),
|
|
}
|
|
|
|
for _, field := range attrs {
|
|
tmp.Attributes[field] = entry.GetAttributeValue(field)
|
|
tmp.RawAttributes[field] = entry.GetRawAttributeValues(field)
|
|
}
|
|
|
|
tmpData = append(tmpData, tmp)
|
|
}
|
|
|
|
return tmpData, nil
|
|
}
|
|
|
|
func IsActiveDirectoryUserDisabled(userAccountControl string) bool {
|
|
if userAccountControl == "" {
|
|
return false
|
|
}
|
|
|
|
uacInt, err := strconv.ParseInt(userAccountControl, 10, 32)
|
|
if err != nil {
|
|
return true
|
|
}
|
|
if int32(uacInt)&0x2 != 0 {
|
|
return true // bit 2 set means account is disabled
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func IsOpenLdapUserDisabled(pwdAccountLockedTime string) bool {
|
|
if pwdAccountLockedTime != "" {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|