reader.go 2.1 KB

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