reader.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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.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=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. /*
  78. if err == nil {
  79. result.PrettyPrint(4)
  80. }
  81. */
  82. if err != nil {
  83. return nil, fmt.Errorf("Search Error: %s", err)
  84. }
  85. if len(result.Entries) > 0 {
  86. return result.Entries, nil
  87. } else {
  88. return nil, fmt.Errorf("Couldn't fetch search entries")
  89. }
  90. }