multildap.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. // newLDAP return instance of the single LDAP server
  12. var newLDAP = ldap.New
  13. // ErrInvalidCredentials is returned if username and password do not match
  14. var ErrInvalidCredentials = ldap.ErrInvalidCredentials
  15. // ErrNoLDAPServers is returned when there is no LDAP servers specified
  16. var ErrNoLDAPServers = errors.New("No LDAP servers are configured")
  17. // ErrDidNotFindUser if request for user is unsuccessful
  18. var ErrDidNotFindUser = errors.New("Did not find a user")
  19. // IMultiLDAP is interface for MultiLDAP
  20. type IMultiLDAP interface {
  21. Login(query *models.LoginUserQuery) (
  22. *models.ExternalUserInfo, error,
  23. )
  24. Users(logins []string) (
  25. []*models.ExternalUserInfo, error,
  26. )
  27. User(login string) (
  28. *models.ExternalUserInfo, error,
  29. )
  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. // Login tries to log in the user in multiples LDAP
  42. func (multiples *MultiLDAP) Login(query *models.LoginUserQuery) (
  43. *models.ExternalUserInfo, error,
  44. ) {
  45. if len(multiples.configs) == 0 {
  46. return nil, ErrNoLDAPServers
  47. }
  48. for _, config := range multiples.configs {
  49. server := newLDAP(config)
  50. if err := server.Dial(); err != nil {
  51. return nil, err
  52. }
  53. defer server.Close()
  54. user, err := server.Login(query)
  55. if user != nil {
  56. return user, nil
  57. }
  58. // Continue if we couldn't find the user
  59. if err == ErrInvalidCredentials {
  60. continue
  61. }
  62. if err != nil {
  63. return nil, err
  64. }
  65. }
  66. // Return invalid credentials if we couldn't find the user anywhere
  67. return nil, ErrInvalidCredentials
  68. }
  69. // User gets a user by login
  70. func (multiples *MultiLDAP) User(login string) (
  71. *models.ExternalUserInfo,
  72. error,
  73. ) {
  74. if len(multiples.configs) == 0 {
  75. return nil, ErrNoLDAPServers
  76. }
  77. search := []string{login}
  78. for _, config := range multiples.configs {
  79. server := newLDAP(config)
  80. if err := server.Dial(); err != nil {
  81. return nil, err
  82. }
  83. defer server.Close()
  84. users, err := server.Users(search)
  85. if err != nil {
  86. return nil, err
  87. }
  88. if len(users) != 0 {
  89. return users[0], nil
  90. }
  91. }
  92. return nil, ErrDidNotFindUser
  93. }
  94. // Users gets users from multiple LDAP servers
  95. func (multiples *MultiLDAP) Users(logins []string) (
  96. []*models.ExternalUserInfo,
  97. error,
  98. ) {
  99. var result []*models.ExternalUserInfo
  100. if len(multiples.configs) == 0 {
  101. return nil, ErrNoLDAPServers
  102. }
  103. for _, config := range multiples.configs {
  104. server := newLDAP(config)
  105. if err := server.Dial(); err != nil {
  106. return nil, err
  107. }
  108. defer server.Close()
  109. users, err := server.Users(logins)
  110. if err != nil {
  111. return nil, err
  112. }
  113. result = append(result, users...)
  114. }
  115. return result, nil
  116. }