admin_users_test.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package api
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/services/auth"
  9. . "github.com/smartystreets/goconvey/convey"
  10. )
  11. func TestAdminApiEndpoint(t *testing.T) {
  12. role := m.ROLE_ADMIN
  13. Convey("Given a server admin attempts to remove themself as an admin", t, func() {
  14. updateCmd := dtos.AdminUpdateUserPermissionsForm{
  15. IsGrafanaAdmin: false,
  16. }
  17. bus.AddHandler("test", func(cmd *m.UpdateUserPermissionsCommand) error {
  18. return m.ErrLastGrafanaAdmin
  19. })
  20. putAdminScenario("When calling PUT on", "/api/admin/users/1/permissions", "/api/admin/users/:id/permissions", role, updateCmd, func(sc *scenarioContext) {
  21. sc.fakeReqWithParams("PUT", sc.url, map[string]string{}).exec()
  22. So(sc.resp.Code, ShouldEqual, 400)
  23. })
  24. })
  25. Convey("When a server admin attempts to logout himself from all devices", t, func() {
  26. bus.AddHandler("test", func(cmd *m.GetUserByIdQuery) error {
  27. cmd.Result = &m.User{Id: TestUserID}
  28. return nil
  29. })
  30. adminLogoutUserScenario("Should not be allowed when calling POST on", "/api/admin/users/1/logout", "/api/admin/users/:id/logout", func(sc *scenarioContext) {
  31. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  32. So(sc.resp.Code, ShouldEqual, 400)
  33. })
  34. })
  35. Convey("When a server admin attempts to logout a non-existing user from all devices", t, func() {
  36. userId := int64(0)
  37. bus.AddHandler("test", func(cmd *m.GetUserByIdQuery) error {
  38. userId = cmd.Id
  39. return m.ErrUserNotFound
  40. })
  41. adminLogoutUserScenario("Should return not found when calling POST on", "/api/admin/users/200/logout", "/api/admin/users/:id/logout", func(sc *scenarioContext) {
  42. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  43. So(sc.resp.Code, ShouldEqual, 404)
  44. So(userId, ShouldEqual, 200)
  45. })
  46. })
  47. Convey("When a server admin attempts to revoke an auth token for a non-existing user", t, func() {
  48. userId := int64(0)
  49. bus.AddHandler("test", func(cmd *m.GetUserByIdQuery) error {
  50. userId = cmd.Id
  51. return m.ErrUserNotFound
  52. })
  53. cmd := m.RevokeAuthTokenCmd{AuthTokenId: 2}
  54. adminRevokeUserAuthTokenScenario("Should return not found when calling POST on", "/api/admin/users/200/revoke-auth-token", "/api/admin/users/:id/revoke-auth-token", cmd, func(sc *scenarioContext) {
  55. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  56. So(sc.resp.Code, ShouldEqual, 404)
  57. So(userId, ShouldEqual, 200)
  58. })
  59. })
  60. Convey("When a server admin gets auth tokens for a non-existing user", t, func() {
  61. userId := int64(0)
  62. bus.AddHandler("test", func(cmd *m.GetUserByIdQuery) error {
  63. userId = cmd.Id
  64. return m.ErrUserNotFound
  65. })
  66. adminGetUserAuthTokensScenario("Should return not found when calling GET on", "/api/admin/users/200/auth-tokens", "/api/admin/users/:id/auth-tokens", func(sc *scenarioContext) {
  67. sc.fakeReqWithParams("GET", sc.url, map[string]string{}).exec()
  68. So(sc.resp.Code, ShouldEqual, 404)
  69. So(userId, ShouldEqual, 200)
  70. })
  71. })
  72. Convey("When a server admin attempts to disable/enable external user", t, func() {
  73. userId := int64(0)
  74. bus.AddHandler("test", func(cmd *m.GetAuthInfoQuery) error {
  75. userId = cmd.UserId
  76. return nil
  77. })
  78. adminDisableUserScenario("Should return Could not disable external user error", "disable", "/api/admin/users/42/disable", "/api/admin/users/:id/disable", func(sc *scenarioContext) {
  79. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  80. So(sc.resp.Code, ShouldEqual, 500)
  81. respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes())
  82. So(err, ShouldBeNil)
  83. So(respJSON.Get("message").MustString(), ShouldEqual, "Could not disable external user")
  84. So(userId, ShouldEqual, 42)
  85. })
  86. adminDisableUserScenario("Should return Could not enable external user error", "enable", "/api/admin/users/42/enable", "/api/admin/users/:id/enable", func(sc *scenarioContext) {
  87. sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec()
  88. So(sc.resp.Code, ShouldEqual, 500)
  89. respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes())
  90. So(err, ShouldBeNil)
  91. So(respJSON.Get("message").MustString(), ShouldEqual, "Could not enable external user")
  92. So(userId, ShouldEqual, 42)
  93. })
  94. })
  95. }
  96. func putAdminScenario(desc string, url string, routePattern string, role m.RoleType, cmd dtos.AdminUpdateUserPermissionsForm, fn scenarioFunc) {
  97. Convey(desc+" "+url, func() {
  98. defer bus.ClearBusHandlers()
  99. sc := setupScenarioContext(url)
  100. sc.defaultHandler = Wrap(func(c *m.ReqContext) {
  101. sc.context = c
  102. sc.context.UserId = TestUserID
  103. sc.context.OrgId = TestOrgID
  104. sc.context.OrgRole = role
  105. AdminUpdateUserPermissions(c, cmd)
  106. })
  107. sc.m.Put(routePattern, sc.defaultHandler)
  108. fn(sc)
  109. })
  110. }
  111. func adminLogoutUserScenario(desc string, url string, routePattern string, fn scenarioFunc) {
  112. Convey(desc+" "+url, func() {
  113. defer bus.ClearBusHandlers()
  114. hs := HTTPServer{
  115. Bus: bus.GetBus(),
  116. AuthTokenService: auth.NewFakeUserAuthTokenService(),
  117. }
  118. sc := setupScenarioContext(url)
  119. sc.defaultHandler = Wrap(func(c *m.ReqContext) Response {
  120. sc.context = c
  121. sc.context.UserId = TestUserID
  122. sc.context.OrgId = TestOrgID
  123. sc.context.OrgRole = m.ROLE_ADMIN
  124. return hs.AdminLogoutUser(c)
  125. })
  126. sc.m.Post(routePattern, sc.defaultHandler)
  127. fn(sc)
  128. })
  129. }
  130. func adminRevokeUserAuthTokenScenario(desc string, url string, routePattern string, cmd m.RevokeAuthTokenCmd, fn scenarioFunc) {
  131. Convey(desc+" "+url, func() {
  132. defer bus.ClearBusHandlers()
  133. fakeAuthTokenService := auth.NewFakeUserAuthTokenService()
  134. hs := HTTPServer{
  135. Bus: bus.GetBus(),
  136. AuthTokenService: fakeAuthTokenService,
  137. }
  138. sc := setupScenarioContext(url)
  139. sc.userAuthTokenService = fakeAuthTokenService
  140. sc.defaultHandler = Wrap(func(c *m.ReqContext) Response {
  141. sc.context = c
  142. sc.context.UserId = TestUserID
  143. sc.context.OrgId = TestOrgID
  144. sc.context.OrgRole = m.ROLE_ADMIN
  145. return hs.AdminRevokeUserAuthToken(c, cmd)
  146. })
  147. sc.m.Post(routePattern, sc.defaultHandler)
  148. fn(sc)
  149. })
  150. }
  151. func adminGetUserAuthTokensScenario(desc string, url string, routePattern string, fn scenarioFunc) {
  152. Convey(desc+" "+url, func() {
  153. defer bus.ClearBusHandlers()
  154. fakeAuthTokenService := auth.NewFakeUserAuthTokenService()
  155. hs := HTTPServer{
  156. Bus: bus.GetBus(),
  157. AuthTokenService: fakeAuthTokenService,
  158. }
  159. sc := setupScenarioContext(url)
  160. sc.userAuthTokenService = fakeAuthTokenService
  161. sc.defaultHandler = Wrap(func(c *m.ReqContext) Response {
  162. sc.context = c
  163. sc.context.UserId = TestUserID
  164. sc.context.OrgId = TestOrgID
  165. sc.context.OrgRole = m.ROLE_ADMIN
  166. return hs.AdminGetUserAuthTokens(c)
  167. })
  168. sc.m.Get(routePattern, sc.defaultHandler)
  169. fn(sc)
  170. })
  171. }
  172. func adminDisableUserScenario(desc string, action string, url string, routePattern string, fn scenarioFunc) {
  173. Convey(desc+" "+url, func() {
  174. defer bus.ClearBusHandlers()
  175. fakeAuthTokenService := auth.NewFakeUserAuthTokenService()
  176. hs := HTTPServer{
  177. Bus: bus.GetBus(),
  178. AuthTokenService: fakeAuthTokenService,
  179. }
  180. sc := setupScenarioContext(url)
  181. sc.defaultHandler = Wrap(func(c *m.ReqContext) Response {
  182. sc.context = c
  183. sc.context.UserId = TestUserID
  184. if action == "enable" {
  185. return AdminEnableUser(c)
  186. }
  187. return hs.AdminDisableUser(c)
  188. })
  189. sc.m.Post(routePattern, sc.defaultHandler)
  190. fn(sc)
  191. })
  192. }