admin_users_test.go 5.5 KB

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