12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package ldapreader
- import (
- "fmt"
- "strings"
- "github.com/go-ldap/ldap"
- )
- type LdapReader struct {
- username string
- password string
- server string
- basedn string
- }
- //NewOauthHandler xxx
- func 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.ScopeWholeSubtree, 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 {
- 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")
- }
- }
|