ldap_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package ldap
  2. import (
  3. "testing"
  4. . "github.com/smartystreets/goconvey/convey"
  5. ldap "gopkg.in/ldap.v3"
  6. "github.com/grafana/grafana/pkg/infra/log"
  7. )
  8. func TestPublicAPI(t *testing.T) {
  9. Convey("Users()", t, func() {
  10. Convey("find one user", func() {
  11. MockConnection := &MockConnection{}
  12. entry := ldap.Entry{
  13. DN: "dn", Attributes: []*ldap.EntryAttribute{
  14. {Name: "username", Values: []string{"roelgerrits"}},
  15. {Name: "surname", Values: []string{"Gerrits"}},
  16. {Name: "email", Values: []string{"roel@test.com"}},
  17. {Name: "name", Values: []string{"Roel"}},
  18. {Name: "memberof", Values: []string{"admins"}},
  19. }}
  20. result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}}
  21. MockConnection.setSearchResult(&result)
  22. // Set up attribute map without surname and email
  23. server := &Server{
  24. Config: &ServerConfig{
  25. Attr: AttributeMap{
  26. Username: "username",
  27. Name: "name",
  28. MemberOf: "memberof",
  29. },
  30. SearchBaseDNs: []string{"BaseDNHere"},
  31. },
  32. Connection: MockConnection,
  33. log: log.New("test-logger"),
  34. }
  35. searchResult, err := server.Users([]string{"roelgerrits"})
  36. So(err, ShouldBeNil)
  37. So(searchResult, ShouldNotBeNil)
  38. // User should be searched in ldap
  39. So(MockConnection.SearchCalled, ShouldBeTrue)
  40. // No empty attributes should be added to the search request
  41. So(len(MockConnection.SearchAttributes), ShouldEqual, 3)
  42. })
  43. })
  44. Convey("InitialBind", t, func() {
  45. Convey("Given bind dn and password configured", func() {
  46. connection := &MockConnection{}
  47. var actualUsername, actualPassword string
  48. connection.bindProvider = func(username, password string) error {
  49. actualUsername = username
  50. actualPassword = password
  51. return nil
  52. }
  53. server := &Server{
  54. Connection: connection,
  55. Config: &ServerConfig{
  56. BindDN: "cn=%s,o=users,dc=grafana,dc=org",
  57. BindPassword: "bindpwd",
  58. },
  59. }
  60. err := server.InitialBind("user", "pwd")
  61. So(err, ShouldBeNil)
  62. So(server.requireSecondBind, ShouldBeTrue)
  63. So(actualUsername, ShouldEqual, "cn=user,o=users,dc=grafana,dc=org")
  64. So(actualPassword, ShouldEqual, "bindpwd")
  65. })
  66. Convey("Given bind dn configured", func() {
  67. connection := &MockConnection{}
  68. var actualUsername, actualPassword string
  69. connection.bindProvider = func(username, password string) error {
  70. actualUsername = username
  71. actualPassword = password
  72. return nil
  73. }
  74. server := &Server{
  75. Connection: connection,
  76. Config: &ServerConfig{
  77. BindDN: "cn=%s,o=users,dc=grafana,dc=org",
  78. },
  79. }
  80. err := server.InitialBind("user", "pwd")
  81. So(err, ShouldBeNil)
  82. So(server.requireSecondBind, ShouldBeFalse)
  83. So(actualUsername, ShouldEqual, "cn=user,o=users,dc=grafana,dc=org")
  84. So(actualPassword, ShouldEqual, "pwd")
  85. })
  86. Convey("Given empty bind dn and password", func() {
  87. connection := &MockConnection{}
  88. unauthenticatedBindWasCalled := false
  89. var actualUsername string
  90. connection.unauthenticatedBindProvider = func(username string) error {
  91. unauthenticatedBindWasCalled = true
  92. actualUsername = username
  93. return nil
  94. }
  95. server := &Server{
  96. Connection: connection,
  97. Config: &ServerConfig{},
  98. }
  99. err := server.InitialBind("user", "pwd")
  100. So(err, ShouldBeNil)
  101. So(server.requireSecondBind, ShouldBeTrue)
  102. So(unauthenticatedBindWasCalled, ShouldBeTrue)
  103. So(actualUsername, ShouldBeEmpty)
  104. })
  105. })
  106. }