| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | package ldapreaderimport (	"fmt"	"strings"	"github.com/go-ldap/ldap")type LdapReader struct {	username string	password string	server   string	basedn   string}//NewOauthHandler xxxfunc NewLDAPReader(username string, password string, server string, basedn string) *LdapReader {	LDAPHandler := LdapReader{		username: username,		password: password,		server:   server,		basedn:   basedn,	}	return &LDAPHandler}func (handler *LdapReader) GetUser(username string) (*ldap.Entry, error) {	returnVal, err := handler.retrieveInformation("uid="+username+","+handler.basedn, "(objectClass=person)", ldap.ScopeBaseObject, handler.username, handler.password)	if err != nil {		return nil, err	}	if len(returnVal) == 0 {		return nil, fmt.Errorf("nothing found for user %s", username)	}	return returnVal[0], nil}func (handler *LdapReader) GetAllUser() ([]*ldap.Entry, error) {	return handler.retrieveInformation(handler.basedn, "(objectClass=person)", ldap.ScopeWholeSubtree, handler.username, handler.password)}func (handler *LdapReader) Authenticate(username string, password string) (bool, error) {	userInformation, err := handler.retrieveInformation("uid="+username+","+handler.basedn, "(objectClass=person)", ldap.ScopeBaseObject, "uid="+username+","+handler.basedn, password)	if err != nil {		if strings.Contains(err.Error(), "LDAP Result Code 32") {			return false, nil		}		if strings.Contains(err.Error(), "LDAP Result Code 53") {			return false, nil		}		if strings.Contains(err.Error(), "Couldn't fetch search entries") {			return false, nil		}		return false, err	}	if len(userInformation) > 0 {		if userInformation[0].GetAttributeValue("cn") == username {			return true, nil		}	}	return false, nil}func (handler *LdapReader) retrieveInformation(dn string, filter string, typeOfSearch int, username string, password string) ([]*ldap.Entry, error) {	ldapURL, err := ldap.DialURL(fmt.Sprintf("ldap://%s:389", handler.server))	if err != nil {		return nil, err	}	defer ldapURL.Close()	ldapURL.Bind(username, password)	searchReq := ldap.NewSearchRequest(		dn,		typeOfSearch,		ldap.NeverDerefAliases,		0,		0,		false,		filter,		[]string{"uid", "memberOf", "cn", "sAMAccountName"},		//[]string{},		nil,	)	result, err := ldapURL.Search(searchReq)	/*		if err == nil {			result.PrettyPrint(4)		}	*/	if err != nil {		return nil, fmt.Errorf("Search Error: %s", err)	}	if len(result.Entries) > 0 {		return result.Entries, nil	} else {		return nil, fmt.Errorf("Couldn't fetch search entries")	}}
 |