reader.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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=person)", ldap.ScopeWholeSubtree, 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=person)", 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=person)", 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. if strings.Contains(err.Error(), "Couldn't fetch search entries") {
  46. return false, nil
  47. }
  48. return false, err
  49. }
  50. if len(userInformation) > 0 {
  51. if userInformation[0].GetAttributeValue("cn") == username {
  52. return true, nil
  53. }
  54. }
  55. return false, nil
  56. }
  57. func (handler *LdapReader) retrieveInformation(dn string, filter string, typeOfSearch int, username string, password string) ([]*ldap.Entry, error) {
  58. ldapURL, err := ldap.DialURL(fmt.Sprintf("ldap://%s:389", handler.server))
  59. if err != nil {
  60. return nil, err
  61. }
  62. defer ldapURL.Close()
  63. ldapURL.Bind(username, password)
  64. searchReq := ldap.NewSearchRequest(
  65. dn,
  66. typeOfSearch,
  67. ldap.NeverDerefAliases,
  68. 0,
  69. 0,
  70. false,
  71. filter,
  72. []string{"uid", "memberOf", "cn", "sAMAccountName"},
  73. //[]string{},
  74. nil,
  75. )
  76. result, err := ldapURL.Search(searchReq)
  77. if err != nil {
  78. return nil, fmt.Errorf("search Error: %s", err)
  79. }
  80. if len(result.Entries) > 0 {
  81. return result.Entries, nil
  82. } else {
  83. return nil, fmt.Errorf("couldn't fetch search entries")
  84. }
  85. }