ldap_private_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package ldap
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/infra/log"
  5. "github.com/grafana/grafana/pkg/models"
  6. . "github.com/smartystreets/goconvey/convey"
  7. "gopkg.in/ldap.v3"
  8. )
  9. func TestLDAPPrivateMethods(t *testing.T) {
  10. Convey("getSearchRequest()", t, func() {
  11. Convey("with enabled GroupSearchFilterUserAttribute setting", func() {
  12. server := &Server{
  13. Config: &ServerConfig{
  14. Attr: AttributeMap{
  15. Username: "username",
  16. Name: "name",
  17. MemberOf: "memberof",
  18. Email: "email",
  19. },
  20. GroupSearchFilterUserAttribute: "gansta",
  21. SearchBaseDNs: []string{"BaseDNHere"},
  22. },
  23. log: log.New("test-logger"),
  24. }
  25. result := server.getSearchRequest("killa", []string{"gorilla"})
  26. So(result, ShouldResemble, &ldap.SearchRequest{
  27. BaseDN: "killa",
  28. Scope: 2,
  29. DerefAliases: 0,
  30. SizeLimit: 0,
  31. TimeLimit: 0,
  32. TypesOnly: false,
  33. Filter: "(|)",
  34. Attributes: []string{
  35. "username",
  36. "email",
  37. "name",
  38. "memberof",
  39. "gansta",
  40. },
  41. Controls: nil,
  42. })
  43. })
  44. })
  45. Convey("serializeUsers()", t, func() {
  46. Convey("simple case", func() {
  47. server := &Server{
  48. Config: &ServerConfig{
  49. Attr: AttributeMap{
  50. Username: "username",
  51. Name: "name",
  52. MemberOf: "memberof",
  53. Email: "email",
  54. },
  55. SearchBaseDNs: []string{"BaseDNHere"},
  56. },
  57. Connection: &MockConnection{},
  58. log: log.New("test-logger"),
  59. }
  60. entry := ldap.Entry{
  61. DN: "dn",
  62. Attributes: []*ldap.EntryAttribute{
  63. {Name: "username", Values: []string{"roelgerrits"}},
  64. {Name: "surname", Values: []string{"Gerrits"}},
  65. {Name: "email", Values: []string{"roel@test.com"}},
  66. {Name: "name", Values: []string{"Roel"}},
  67. {Name: "memberof", Values: []string{"admins"}},
  68. },
  69. }
  70. users := []*ldap.Entry{&entry}
  71. result, err := server.serializeUsers(users)
  72. So(err, ShouldBeNil)
  73. So(result[0].Login, ShouldEqual, "roelgerrits")
  74. So(result[0].Email, ShouldEqual, "roel@test.com")
  75. So(result[0].Groups, ShouldContain, "admins")
  76. })
  77. Convey("without lastname", func() {
  78. server := &Server{
  79. Config: &ServerConfig{
  80. Attr: AttributeMap{
  81. Username: "username",
  82. Name: "name",
  83. MemberOf: "memberof",
  84. Email: "email",
  85. },
  86. SearchBaseDNs: []string{"BaseDNHere"},
  87. },
  88. Connection: &MockConnection{},
  89. log: log.New("test-logger"),
  90. }
  91. entry := ldap.Entry{
  92. DN: "dn",
  93. Attributes: []*ldap.EntryAttribute{
  94. {Name: "username", Values: []string{"roelgerrits"}},
  95. {Name: "email", Values: []string{"roel@test.com"}},
  96. {Name: "name", Values: []string{"Roel"}},
  97. {Name: "memberof", Values: []string{"admins"}},
  98. },
  99. }
  100. users := []*ldap.Entry{&entry}
  101. result, err := server.serializeUsers(users)
  102. So(err, ShouldBeNil)
  103. So(result[0].Name, ShouldEqual, "Roel")
  104. })
  105. })
  106. Convey("validateGrafanaUser()", t, func() {
  107. Convey("Returns error when user does not belong in any of the specified LDAP groups", func() {
  108. server := &Server{
  109. Config: &ServerConfig{
  110. Groups: []*GroupToOrgRole{
  111. {
  112. OrgId: 1,
  113. },
  114. },
  115. },
  116. log: logger.New("test"),
  117. }
  118. user := &models.ExternalUserInfo{
  119. Login: "markelog",
  120. }
  121. result := server.validateGrafanaUser(user)
  122. So(result, ShouldEqual, ErrInvalidCredentials)
  123. })
  124. Convey("Does not return error when group config is empty", func() {
  125. server := &Server{
  126. Config: &ServerConfig{
  127. Groups: []*GroupToOrgRole{},
  128. },
  129. log: logger.New("test"),
  130. }
  131. user := &models.ExternalUserInfo{
  132. Login: "markelog",
  133. }
  134. result := server.validateGrafanaUser(user)
  135. So(result, ShouldBeNil)
  136. })
  137. Convey("Does not return error when groups are there", func() {
  138. server := &Server{
  139. Config: &ServerConfig{
  140. Groups: []*GroupToOrgRole{
  141. {
  142. OrgId: 1,
  143. },
  144. },
  145. },
  146. log: logger.New("test"),
  147. }
  148. user := &models.ExternalUserInfo{
  149. Login: "markelog",
  150. OrgRoles: map[int64]models.RoleType{
  151. 1: "test",
  152. },
  153. }
  154. result := server.validateGrafanaUser(user)
  155. So(result, ShouldBeNil)
  156. })
  157. })
  158. Convey("shouldAdminBind()", t, func() {
  159. Convey("it should require admin userBind", func() {
  160. server := &Server{
  161. Config: &ServerConfig{
  162. BindPassword: "test",
  163. },
  164. }
  165. result := server.shouldAdminBind()
  166. So(result, ShouldBeTrue)
  167. })
  168. Convey("it should not require admin userBind", func() {
  169. server := &Server{
  170. Config: &ServerConfig{
  171. BindPassword: "",
  172. },
  173. }
  174. result := server.shouldAdminBind()
  175. So(result, ShouldBeFalse)
  176. })
  177. })
  178. Convey("shouldSingleBind()", t, func() {
  179. Convey("it should allow single bind", func() {
  180. server := &Server{
  181. Config: &ServerConfig{
  182. BindDN: "cn=%s,dc=grafana,dc=org",
  183. },
  184. }
  185. result := server.shouldSingleBind()
  186. So(result, ShouldBeTrue)
  187. })
  188. Convey("it should not allow single bind", func() {
  189. server := &Server{
  190. Config: &ServerConfig{
  191. BindDN: "cn=admin,dc=grafana,dc=org",
  192. },
  193. }
  194. result := server.shouldSingleBind()
  195. So(result, ShouldBeFalse)
  196. })
  197. })
  198. Convey("singleBindDN()", t, func() {
  199. Convey("it should allow single bind", func() {
  200. server := &Server{
  201. Config: &ServerConfig{
  202. BindDN: "cn=%s,dc=grafana,dc=org",
  203. },
  204. }
  205. result := server.singleBindDN("test")
  206. So(result, ShouldEqual, "cn=test,dc=grafana,dc=org")
  207. })
  208. })
  209. }