multildap.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package multildap
  2. import (
  3. "errors"
  4. "github.com/grafana/grafana/pkg/models"
  5. "github.com/grafana/grafana/pkg/services/ldap"
  6. )
  7. // GetConfig gets LDAP config
  8. var GetConfig = ldap.GetConfig
  9. // IsEnabled checks if LDAP is enabled
  10. var IsEnabled = ldap.IsEnabled
  11. // ErrInvalidCredentials is returned if username and password do not match
  12. var ErrInvalidCredentials = ldap.ErrInvalidCredentials
  13. // ErrNoLDAPServers is returned when there is no LDAP servers specified
  14. var ErrNoLDAPServers = errors.New("No LDAP servers are configured")
  15. // ErrDidNotFindUser if request for user is unsuccessful
  16. var ErrDidNotFindUser = errors.New("Did not find a user")
  17. // IMultiLDAP is interface for MultiLDAP
  18. type IMultiLDAP interface {
  19. Login(query *models.LoginUserQuery) (
  20. *models.ExternalUserInfo, error,
  21. )
  22. Users(logins []string) (
  23. []*models.ExternalUserInfo, error,
  24. )
  25. User(login string) (
  26. *models.ExternalUserInfo, error,
  27. )
  28. Add(dn string, values map[string][]string) error
  29. Remove(dn string) error
  30. }
  31. // MultiLDAP is basic struct of LDAP authorization
  32. type MultiLDAP struct {
  33. configs []*ldap.ServerConfig
  34. }
  35. // New creates the new LDAP auth
  36. func New(configs []*ldap.ServerConfig) IMultiLDAP {
  37. return &MultiLDAP{
  38. configs: configs,
  39. }
  40. }
  41. // Add adds user to the *first* defined LDAP
  42. func (multiples *MultiLDAP) Add(
  43. dn string,
  44. values map[string][]string,
  45. ) error {
  46. if len(multiples.configs) == 0 {
  47. return ErrNoLDAPServers
  48. }
  49. config := multiples.configs[0]
  50. ldap := ldap.New(config)
  51. if err := ldap.Dial(); err != nil {
  52. return err
  53. }
  54. defer ldap.Close()
  55. err := ldap.Add(dn, values)
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. // Remove removes user from the *first* defined LDAP
  62. func (multiples *MultiLDAP) Remove(dn string) error {
  63. if len(multiples.configs) == 0 {
  64. return ErrNoLDAPServers
  65. }
  66. config := multiples.configs[0]
  67. ldap := ldap.New(config)
  68. if err := ldap.Dial(); err != nil {
  69. return err
  70. }
  71. defer ldap.Close()
  72. err := ldap.Remove(dn)
  73. if err != nil {
  74. return err
  75. }
  76. return nil
  77. }
  78. // Login tries to log in the user in multiples LDAP
  79. func (multiples *MultiLDAP) Login(query *models.LoginUserQuery) (
  80. *models.ExternalUserInfo, error,
  81. ) {
  82. if len(multiples.configs) == 0 {
  83. return nil, ErrNoLDAPServers
  84. }
  85. for _, config := range multiples.configs {
  86. server := ldap.New(config)
  87. if err := server.Dial(); err != nil {
  88. return nil, err
  89. }
  90. defer server.Close()
  91. user, err := server.Login(query)
  92. if user != nil {
  93. return user, nil
  94. }
  95. // Continue if we couldn't find the user
  96. if err == ErrInvalidCredentials {
  97. continue
  98. }
  99. if err != nil {
  100. return nil, err
  101. }
  102. return user, nil
  103. }
  104. // Return invalid credentials if we couldn't find the user anywhere
  105. return nil, ErrInvalidCredentials
  106. }
  107. // User gets a user by login
  108. func (multiples *MultiLDAP) User(login string) (
  109. *models.ExternalUserInfo,
  110. error,
  111. ) {
  112. if len(multiples.configs) == 0 {
  113. return nil, ErrNoLDAPServers
  114. }
  115. search := []string{login}
  116. for _, config := range multiples.configs {
  117. server := ldap.New(config)
  118. if err := server.Dial(); err != nil {
  119. return nil, err
  120. }
  121. defer server.Close()
  122. users, err := server.Users(search)
  123. if err != nil {
  124. return nil, err
  125. }
  126. if len(users) != 0 {
  127. return users[0], nil
  128. }
  129. }
  130. return nil, ErrDidNotFindUser
  131. }
  132. // Users gets users from multiple LDAP servers
  133. func (multiples *MultiLDAP) Users(logins []string) (
  134. []*models.ExternalUserInfo,
  135. error,
  136. ) {
  137. var result []*models.ExternalUserInfo
  138. if len(multiples.configs) == 0 {
  139. return nil, ErrNoLDAPServers
  140. }
  141. for _, config := range multiples.configs {
  142. server := ldap.New(config)
  143. if err := server.Dial(); err != nil {
  144. return nil, err
  145. }
  146. defer server.Close()
  147. users, err := server.Users(logins)
  148. if err != nil {
  149. return nil, err
  150. }
  151. result = append(result, users...)
  152. }
  153. return result, nil
  154. }