multildap.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. }
  29. // MultiLDAP is basic struct of LDAP authorization
  30. type MultiLDAP struct {
  31. configs []*ldap.ServerConfig
  32. }
  33. // New creates the new LDAP auth
  34. func New(configs []*ldap.ServerConfig) IMultiLDAP {
  35. return &MultiLDAP{
  36. configs: configs,
  37. }
  38. }
  39. // Login tries to log in the user in multiples LDAP
  40. func (multiples *MultiLDAP) Login(query *models.LoginUserQuery) (
  41. *models.ExternalUserInfo, error,
  42. ) {
  43. if len(multiples.configs) == 0 {
  44. return nil, ErrNoLDAPServers
  45. }
  46. for _, config := range multiples.configs {
  47. server := ldap.New(config)
  48. if err := server.Dial(); err != nil {
  49. return nil, err
  50. }
  51. defer server.Close()
  52. user, err := server.Login(query)
  53. if user != nil {
  54. return user, nil
  55. }
  56. // Continue if we couldn't find the user
  57. if err == ErrInvalidCredentials {
  58. continue
  59. }
  60. if err != nil {
  61. return nil, err
  62. }
  63. return user, nil
  64. }
  65. // Return invalid credentials if we couldn't find the user anywhere
  66. return nil, ErrInvalidCredentials
  67. }
  68. // User gets a user by login
  69. func (multiples *MultiLDAP) User(login string) (
  70. *models.ExternalUserInfo,
  71. error,
  72. ) {
  73. if len(multiples.configs) == 0 {
  74. return nil, ErrNoLDAPServers
  75. }
  76. search := []string{login}
  77. for _, config := range multiples.configs {
  78. server := ldap.New(config)
  79. if err := server.Dial(); err != nil {
  80. return nil, err
  81. }
  82. defer server.Close()
  83. users, err := server.Users(search)
  84. if err != nil {
  85. return nil, err
  86. }
  87. if len(users) != 0 {
  88. return users[0], nil
  89. }
  90. }
  91. return nil, ErrDidNotFindUser
  92. }
  93. // Users gets users from multiple LDAP servers
  94. func (multiples *MultiLDAP) Users(logins []string) (
  95. []*models.ExternalUserInfo,
  96. error,
  97. ) {
  98. var result []*models.ExternalUserInfo
  99. if len(multiples.configs) == 0 {
  100. return nil, ErrNoLDAPServers
  101. }
  102. for _, config := range multiples.configs {
  103. server := ldap.New(config)
  104. if err := server.Dial(); err != nil {
  105. return nil, err
  106. }
  107. defer server.Close()
  108. users, err := server.Users(logins)
  109. if err != nil {
  110. return nil, err
  111. }
  112. result = append(result, users...)
  113. }
  114. return result, nil
  115. }