reader.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package ldapreader
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/go-ldap/ldap"
  6. )
  7. type LdapReader struct {
  8. username string
  9. password string
  10. server string
  11. basedn string
  12. }
  13. //NewOauthHandler xxx
  14. func NewLDAPReader(username string, password string, server string, basedn string) *LdapReader {
  15. LDAPHandler := LdapReader{
  16. username: username,
  17. password: password,
  18. server: server,
  19. basedn: basedn,
  20. }
  21. return &LDAPHandler
  22. }
  23. func (handler *LdapReader) GetUser(username string) (*ldap.Entry, error) {
  24. returnVal, err := handler.retrieveInformation("uid="+username+","+handler.basedn, "(objectClass=*)", ldap.ScopeBaseObject, handler.username, handler.password)
  25. if err != nil {
  26. return nil, err
  27. }
  28. if len(returnVal) == 0 {
  29. return nil, fmt.Errorf("nothing found for user %s", username)
  30. }
  31. return returnVal[0], nil
  32. }
  33. func (handler *LdapReader) GetAllUser() ([]*ldap.Entry, error) {
  34. return handler.retrieveInformation(handler.basedn, "(objectClass=*)", ldap.ScopeWholeSubtree, handler.username, handler.password)
  35. }
  36. func (handler *LdapReader) Authenticate(username string, password string) (bool, error) {
  37. userInformation, err := handler.retrieveInformation("uid="+username+","+handler.basedn, "(objectClass=*)", ldap.ScopeBaseObject, "uid="+username+","+handler.basedn, password)
  38. if err != nil {
  39. if strings.Contains(err.Error(), "LDAP Result Code 32") {
  40. return false, nil
  41. }
  42. if strings.Contains(err.Error(), "LDAP Result Code 53") {
  43. return false, nil
  44. }
  45. return false, err
  46. }
  47. if len(userInformation) > 0 {
  48. if userInformation[0].GetAttributeValue("cn") == username {
  49. return true, nil
  50. }
  51. }
  52. return false, nil
  53. }
  54. func (handler *LdapReader) retrieveInformation(dn string, filter string, typeOfSearch int, username string, password string) ([]*ldap.Entry, error) {
  55. ldapURL, err := ldap.DialURL(fmt.Sprintf("ldap://%s:389", handler.server))
  56. if err != nil {
  57. return nil, err
  58. }
  59. defer ldapURL.Close()
  60. ldapURL.Bind(username, password)
  61. searchReq := ldap.NewSearchRequest(
  62. dn,
  63. typeOfSearch,
  64. ldap.NeverDerefAliases,
  65. 0,
  66. 0,
  67. false,
  68. filter,
  69. []string{"uid", "memberOf", "cn", "sAMAccountName"},
  70. nil,
  71. )
  72. result, err := ldapURL.Search(searchReq)
  73. if err != nil {
  74. return nil, fmt.Errorf("Search Error: %s", err)
  75. }
  76. if len(result.Entries) > 0 {
  77. return result.Entries, nil
  78. } else {
  79. return nil, fmt.Errorf("Couldn't fetch search entries")
  80. }
  81. }