test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package ldap
  2. import (
  3. "context"
  4. "crypto/tls"
  5. . "github.com/smartystreets/goconvey/convey"
  6. "gopkg.in/ldap.v3"
  7. "github.com/grafana/grafana/pkg/bus"
  8. "github.com/grafana/grafana/pkg/models"
  9. "github.com/grafana/grafana/pkg/services/login"
  10. )
  11. type mockLdapConn struct {
  12. result *ldap.SearchResult
  13. searchCalled bool
  14. searchAttributes []string
  15. bindProvider func(username, password string) error
  16. unauthenticatedBindProvider func(username string) error
  17. }
  18. func (c *mockLdapConn) Bind(username, password string) error {
  19. if c.bindProvider != nil {
  20. return c.bindProvider(username, password)
  21. }
  22. return nil
  23. }
  24. func (c *mockLdapConn) UnauthenticatedBind(username string) error {
  25. if c.unauthenticatedBindProvider != nil {
  26. return c.unauthenticatedBindProvider(username)
  27. }
  28. return nil
  29. }
  30. func (c *mockLdapConn) Close() {}
  31. func (c *mockLdapConn) setSearchResult(result *ldap.SearchResult) {
  32. c.result = result
  33. }
  34. func (c *mockLdapConn) Search(sr *ldap.SearchRequest) (*ldap.SearchResult, error) {
  35. c.searchCalled = true
  36. c.searchAttributes = sr.Attributes
  37. return c.result, nil
  38. }
  39. func (c *mockLdapConn) StartTLS(*tls.Config) error {
  40. return nil
  41. }
  42. func AuthScenario(desc string, fn scenarioFunc) {
  43. Convey(desc, func() {
  44. defer bus.ClearBusHandlers()
  45. sc := &scenarioContext{
  46. loginUserQuery: &models.LoginUserQuery{
  47. Username: "user",
  48. Password: "pwd",
  49. IpAddress: "192.168.1.1:56433",
  50. },
  51. }
  52. hookDial = func(auth *Auth) error {
  53. return nil
  54. }
  55. loginService := &login.LoginService{
  56. Bus: bus.GetBus(),
  57. }
  58. bus.AddHandler("test", loginService.UpsertUser)
  59. bus.AddHandlerCtx("test", func(ctx context.Context, cmd *models.SyncTeamsCommand) error {
  60. return nil
  61. })
  62. bus.AddHandlerCtx("test", func(ctx context.Context, cmd *models.UpdateUserPermissionsCommand) error {
  63. sc.updateUserPermissionsCmd = cmd
  64. return nil
  65. })
  66. bus.AddHandler("test", func(cmd *models.GetUserByAuthInfoQuery) error {
  67. sc.getUserByAuthInfoQuery = cmd
  68. sc.getUserByAuthInfoQuery.Result = &models.User{Login: cmd.Login}
  69. return nil
  70. })
  71. bus.AddHandler("test", func(cmd *models.GetUserOrgListQuery) error {
  72. sc.getUserOrgListQuery = cmd
  73. return nil
  74. })
  75. bus.AddHandler("test", func(cmd *models.CreateUserCommand) error {
  76. sc.createUserCmd = cmd
  77. sc.createUserCmd.Result = models.User{Login: cmd.Login}
  78. return nil
  79. })
  80. bus.AddHandler("test", func(cmd *models.AddOrgUserCommand) error {
  81. sc.addOrgUserCmd = cmd
  82. return nil
  83. })
  84. bus.AddHandler("test", func(cmd *models.UpdateOrgUserCommand) error {
  85. sc.updateOrgUserCmd = cmd
  86. return nil
  87. })
  88. bus.AddHandler("test", func(cmd *models.RemoveOrgUserCommand) error {
  89. sc.removeOrgUserCmd = cmd
  90. return nil
  91. })
  92. bus.AddHandler("test", func(cmd *models.UpdateUserCommand) error {
  93. sc.updateUserCmd = cmd
  94. return nil
  95. })
  96. bus.AddHandler("test", func(cmd *models.SetUsingOrgCommand) error {
  97. sc.setUsingOrgCmd = cmd
  98. return nil
  99. })
  100. fn(sc)
  101. })
  102. }
  103. type scenarioContext struct {
  104. loginUserQuery *models.LoginUserQuery
  105. getUserByAuthInfoQuery *models.GetUserByAuthInfoQuery
  106. getUserOrgListQuery *models.GetUserOrgListQuery
  107. createUserCmd *models.CreateUserCommand
  108. addOrgUserCmd *models.AddOrgUserCommand
  109. updateOrgUserCmd *models.UpdateOrgUserCommand
  110. removeOrgUserCmd *models.RemoveOrgUserCommand
  111. updateUserCmd *models.UpdateUserCommand
  112. setUsingOrgCmd *models.SetUsingOrgCommand
  113. updateUserPermissionsCmd *models.UpdateUserPermissionsCommand
  114. }
  115. func (sc *scenarioContext) userQueryReturns(user *models.User) {
  116. bus.AddHandler("test", func(query *models.GetUserByAuthInfoQuery) error {
  117. if user == nil {
  118. return models.ErrUserNotFound
  119. }
  120. query.Result = user
  121. return nil
  122. })
  123. bus.AddHandler("test", func(query *models.SetAuthInfoCommand) error {
  124. return nil
  125. })
  126. }
  127. func (sc *scenarioContext) userOrgsQueryReturns(orgs []*models.UserOrgDTO) {
  128. bus.AddHandler("test", func(query *models.GetUserOrgListQuery) error {
  129. query.Result = orgs
  130. return nil
  131. })
  132. }
  133. type scenarioFunc func(c *scenarioContext)