middleware_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. package middleware
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "path/filepath"
  7. "testing"
  8. msession "github.com/go-macaron/session"
  9. "github.com/grafana/grafana/pkg/bus"
  10. m "github.com/grafana/grafana/pkg/models"
  11. "github.com/grafana/grafana/pkg/services/session"
  12. "github.com/grafana/grafana/pkg/setting"
  13. "github.com/grafana/grafana/pkg/util"
  14. . "github.com/smartystreets/goconvey/convey"
  15. "gopkg.in/macaron.v1"
  16. )
  17. func TestMiddlewareContext(t *testing.T) {
  18. setting.ERR_TEMPLATE_NAME = "error-template"
  19. Convey("Given the grafana middleware", t, func() {
  20. middlewareScenario("middleware should add context to injector", func(sc *scenarioContext) {
  21. sc.fakeReq("GET", "/").exec()
  22. So(sc.context, ShouldNotBeNil)
  23. })
  24. middlewareScenario("Default middleware should allow get request", func(sc *scenarioContext) {
  25. sc.fakeReq("GET", "/").exec()
  26. So(sc.resp.Code, ShouldEqual, 200)
  27. })
  28. middlewareScenario("middleware should add Cache-Control header for GET requests to API", func(sc *scenarioContext) {
  29. sc.fakeReq("GET", "/api/search").exec()
  30. So(sc.resp.Header().Get("Cache-Control"), ShouldEqual, "no-cache")
  31. So(sc.resp.Header().Get("Pragma"), ShouldEqual, "no-cache")
  32. So(sc.resp.Header().Get("Expires"), ShouldEqual, "-1")
  33. })
  34. middlewareScenario("middleware should not add Cache-Control header to for non-API GET requests", func(sc *scenarioContext) {
  35. sc.fakeReq("GET", "/").exec()
  36. So(sc.resp.Header().Get("Cache-Control"), ShouldBeEmpty)
  37. })
  38. middlewareScenario("Invalid api key", func(sc *scenarioContext) {
  39. sc.apiKey = "invalid_key_test"
  40. sc.fakeReq("GET", "/").exec()
  41. Convey("Should not init session", func() {
  42. So(sc.resp.Header().Get("Set-Cookie"), ShouldBeEmpty)
  43. })
  44. Convey("Should return 401", func() {
  45. So(sc.resp.Code, ShouldEqual, 401)
  46. So(sc.respJson["message"], ShouldEqual, "Invalid API key")
  47. })
  48. })
  49. middlewareScenario("Using basic auth", func(sc *scenarioContext) {
  50. bus.AddHandler("test", func(query *m.GetUserByLoginQuery) error {
  51. query.Result = &m.User{
  52. Password: util.EncodePassword("myPass", "salt"),
  53. Salt: "salt",
  54. }
  55. return nil
  56. })
  57. bus.AddHandler("test", func(loginUserQuery *m.LoginUserQuery) error {
  58. return nil
  59. })
  60. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  61. query.Result = &m.SignedInUser{OrgId: 2, UserId: 12}
  62. return nil
  63. })
  64. setting.BasicAuthEnabled = true
  65. authHeader := util.GetBasicAuthHeader("myUser", "myPass")
  66. sc.fakeReq("GET", "/").withAuthorizationHeader(authHeader).exec()
  67. Convey("Should init middleware context with user", func() {
  68. So(sc.context.IsSignedIn, ShouldEqual, true)
  69. So(sc.context.OrgId, ShouldEqual, 2)
  70. So(sc.context.UserId, ShouldEqual, 12)
  71. })
  72. })
  73. middlewareScenario("Valid api key", func(sc *scenarioContext) {
  74. keyhash := util.EncodePassword("v5nAwpMafFP6znaS4urhdWDLS5511M42", "asd")
  75. bus.AddHandler("test", func(query *m.GetApiKeyByNameQuery) error {
  76. query.Result = &m.ApiKey{OrgId: 12, Role: m.ROLE_EDITOR, Key: keyhash}
  77. return nil
  78. })
  79. sc.fakeReq("GET", "/").withValidApiKey().exec()
  80. Convey("Should return 200", func() {
  81. So(sc.resp.Code, ShouldEqual, 200)
  82. })
  83. Convey("Should init middleware context", func() {
  84. So(sc.context.IsSignedIn, ShouldEqual, true)
  85. So(sc.context.OrgId, ShouldEqual, 12)
  86. So(sc.context.OrgRole, ShouldEqual, m.ROLE_EDITOR)
  87. })
  88. })
  89. middlewareScenario("Valid api key, but does not match db hash", func(sc *scenarioContext) {
  90. keyhash := "something_not_matching"
  91. bus.AddHandler("test", func(query *m.GetApiKeyByNameQuery) error {
  92. query.Result = &m.ApiKey{OrgId: 12, Role: m.ROLE_EDITOR, Key: keyhash}
  93. return nil
  94. })
  95. sc.fakeReq("GET", "/").withValidApiKey().exec()
  96. Convey("Should return api key invalid", func() {
  97. So(sc.resp.Code, ShouldEqual, 401)
  98. So(sc.respJson["message"], ShouldEqual, "Invalid API key")
  99. })
  100. })
  101. middlewareScenario("Valid api key via Basic auth", func(sc *scenarioContext) {
  102. keyhash := util.EncodePassword("v5nAwpMafFP6znaS4urhdWDLS5511M42", "asd")
  103. bus.AddHandler("test", func(query *m.GetApiKeyByNameQuery) error {
  104. query.Result = &m.ApiKey{OrgId: 12, Role: m.ROLE_EDITOR, Key: keyhash}
  105. return nil
  106. })
  107. authHeader := util.GetBasicAuthHeader("api_key", "eyJrIjoidjVuQXdwTWFmRlA2em5hUzR1cmhkV0RMUzU1MTFNNDIiLCJuIjoiYXNkIiwiaWQiOjF9")
  108. sc.fakeReq("GET", "/").withAuthorizationHeader(authHeader).exec()
  109. Convey("Should return 200", func() {
  110. So(sc.resp.Code, ShouldEqual, 200)
  111. })
  112. Convey("Should init middleware context", func() {
  113. So(sc.context.IsSignedIn, ShouldEqual, true)
  114. So(sc.context.OrgId, ShouldEqual, 12)
  115. So(sc.context.OrgRole, ShouldEqual, m.ROLE_EDITOR)
  116. })
  117. })
  118. middlewareScenario("Auth token service", func(sc *scenarioContext) {
  119. var wasCalled bool
  120. sc.userAuthTokenService.initContextWithTokenProvider = func(ctx *m.ReqContext, orgId int64) bool {
  121. wasCalled = true
  122. return false
  123. }
  124. sc.fakeReq("GET", "/").exec()
  125. Convey("should call middleware", func() {
  126. So(wasCalled, ShouldBeTrue)
  127. })
  128. })
  129. middlewareScenario("When anonymous access is enabled", func(sc *scenarioContext) {
  130. setting.AnonymousEnabled = true
  131. setting.AnonymousOrgName = "test"
  132. setting.AnonymousOrgRole = string(m.ROLE_EDITOR)
  133. bus.AddHandler("test", func(query *m.GetOrgByNameQuery) error {
  134. So(query.Name, ShouldEqual, "test")
  135. query.Result = &m.Org{Id: 2, Name: "test"}
  136. return nil
  137. })
  138. sc.fakeReq("GET", "/").exec()
  139. Convey("should init context with org info", func() {
  140. So(sc.context.UserId, ShouldEqual, 0)
  141. So(sc.context.OrgId, ShouldEqual, 2)
  142. So(sc.context.OrgRole, ShouldEqual, m.ROLE_EDITOR)
  143. })
  144. Convey("context signed in should be false", func() {
  145. So(sc.context.IsSignedIn, ShouldBeFalse)
  146. })
  147. })
  148. middlewareScenario("When auth_proxy is enabled enabled and user exists", func(sc *scenarioContext) {
  149. setting.AuthProxyEnabled = true
  150. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  151. setting.AuthProxyHeaderProperty = "username"
  152. setting.LdapEnabled = false
  153. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  154. query.Result = &m.SignedInUser{OrgId: 2, UserId: 12}
  155. return nil
  156. })
  157. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  158. cmd.Result = &m.User{Id: 12}
  159. return nil
  160. })
  161. setting.SessionOptions = msession.Options{}
  162. sc.fakeReq("GET", "/")
  163. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  164. sc.exec()
  165. Convey("should init context with user info", func() {
  166. So(sc.context.IsSignedIn, ShouldBeTrue)
  167. So(sc.context.UserId, ShouldEqual, 12)
  168. So(sc.context.OrgId, ShouldEqual, 2)
  169. })
  170. })
  171. middlewareScenario("When auth_proxy is enabled enabled and user does not exists", func(sc *scenarioContext) {
  172. setting.AuthProxyEnabled = true
  173. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  174. setting.AuthProxyHeaderProperty = "username"
  175. setting.AuthProxyAutoSignUp = true
  176. setting.LdapEnabled = false
  177. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  178. if query.UserId > 0 {
  179. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  180. return nil
  181. }
  182. return m.ErrUserNotFound
  183. })
  184. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  185. cmd.Result = &m.User{Id: 33}
  186. return nil
  187. })
  188. sc.fakeReq("GET", "/")
  189. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  190. sc.exec()
  191. Convey("Should create user if auto sign up is enabled", func() {
  192. So(sc.context.IsSignedIn, ShouldBeTrue)
  193. So(sc.context.UserId, ShouldEqual, 33)
  194. So(sc.context.OrgId, ShouldEqual, 4)
  195. })
  196. })
  197. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is not trusted", func(sc *scenarioContext) {
  198. setting.AuthProxyEnabled = true
  199. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  200. setting.AuthProxyHeaderProperty = "username"
  201. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  202. sc.fakeReq("GET", "/")
  203. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  204. sc.req.RemoteAddr = "192.168.3.1:12345"
  205. sc.exec()
  206. Convey("should return 407 status code", func() {
  207. So(sc.resp.Code, ShouldEqual, 407)
  208. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 192.168.3.1 is not from the authentication proxy")
  209. })
  210. })
  211. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is not within trusted CIDR block", func(sc *scenarioContext) {
  212. setting.AuthProxyEnabled = true
  213. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  214. setting.AuthProxyHeaderProperty = "username"
  215. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  216. sc.fakeReq("GET", "/")
  217. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  218. sc.req.RemoteAddr = "192.168.3.1:12345"
  219. sc.exec()
  220. Convey("should return 407 status code", func() {
  221. So(sc.resp.Code, ShouldEqual, 407)
  222. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 192.168.3.1 is not from the authentication proxy")
  223. })
  224. })
  225. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is not trusted", func(sc *scenarioContext) {
  226. setting.AuthProxyEnabled = true
  227. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  228. setting.AuthProxyHeaderProperty = "username"
  229. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  230. sc.fakeReq("GET", "/")
  231. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  232. sc.req.RemoteAddr = "[2001:23]:12345"
  233. sc.exec()
  234. Convey("should return 407 status code", func() {
  235. So(sc.resp.Code, ShouldEqual, 407)
  236. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 2001:23 is not from the authentication proxy")
  237. })
  238. })
  239. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is not within trusted CIDR block", func(sc *scenarioContext) {
  240. setting.AuthProxyEnabled = true
  241. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  242. setting.AuthProxyHeaderProperty = "username"
  243. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  244. sc.fakeReq("GET", "/")
  245. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  246. sc.req.RemoteAddr = "[2001:23]:12345"
  247. sc.exec()
  248. Convey("should return 407 status code", func() {
  249. So(sc.resp.Code, ShouldEqual, 407)
  250. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 2001:23 is not from the authentication proxy")
  251. })
  252. })
  253. middlewareScenario("When auth_proxy is enabled and request RemoteAddr is trusted", func(sc *scenarioContext) {
  254. setting.AuthProxyEnabled = true
  255. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  256. setting.AuthProxyHeaderProperty = "username"
  257. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  258. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  259. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  260. return nil
  261. })
  262. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  263. cmd.Result = &m.User{Id: 33}
  264. return nil
  265. })
  266. sc.fakeReq("GET", "/")
  267. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  268. sc.req.RemoteAddr = "[2001::23]:12345"
  269. sc.exec()
  270. Convey("Should init context with user info", func() {
  271. So(sc.context.IsSignedIn, ShouldBeTrue)
  272. So(sc.context.UserId, ShouldEqual, 33)
  273. So(sc.context.OrgId, ShouldEqual, 4)
  274. })
  275. })
  276. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is within trusted CIDR block", func(sc *scenarioContext) {
  277. setting.AuthProxyEnabled = true
  278. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  279. setting.AuthProxyHeaderProperty = "username"
  280. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  281. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  282. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  283. return nil
  284. })
  285. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  286. cmd.Result = &m.User{Id: 33}
  287. return nil
  288. })
  289. sc.fakeReq("GET", "/")
  290. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  291. sc.req.RemoteAddr = "192.168.1.10:12345"
  292. sc.exec()
  293. Convey("Should init context with user info", func() {
  294. So(sc.context.IsSignedIn, ShouldBeTrue)
  295. So(sc.context.UserId, ShouldEqual, 33)
  296. So(sc.context.OrgId, ShouldEqual, 4)
  297. })
  298. })
  299. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is within trusted CIDR block", func(sc *scenarioContext) {
  300. setting.AuthProxyEnabled = true
  301. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  302. setting.AuthProxyHeaderProperty = "username"
  303. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  304. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  305. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  306. return nil
  307. })
  308. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  309. cmd.Result = &m.User{Id: 33}
  310. return nil
  311. })
  312. sc.fakeReq("GET", "/")
  313. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  314. sc.req.RemoteAddr = "[2001::23]:12345"
  315. sc.exec()
  316. Convey("Should init context with user info", func() {
  317. So(sc.context.IsSignedIn, ShouldBeTrue)
  318. So(sc.context.UserId, ShouldEqual, 33)
  319. So(sc.context.OrgId, ShouldEqual, 4)
  320. })
  321. })
  322. middlewareScenario("When session exists for previous user, create a new session", func(sc *scenarioContext) {
  323. setting.AuthProxyEnabled = true
  324. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  325. setting.AuthProxyHeaderProperty = "username"
  326. setting.AuthProxyWhitelist = ""
  327. bus.AddHandler("test", func(query *m.UpsertUserCommand) error {
  328. query.Result = &m.User{Id: 32}
  329. return nil
  330. })
  331. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  332. query.Result = &m.SignedInUser{OrgId: 4, UserId: 32}
  333. return nil
  334. })
  335. // create session
  336. sc.fakeReq("GET", "/").handler(func(c *m.ReqContext) {
  337. c.Session.Set(session.SESS_KEY_USERID, int64(33))
  338. }).exec()
  339. oldSessionID := sc.context.Session.ID()
  340. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  341. sc.exec()
  342. newSessionID := sc.context.Session.ID()
  343. Convey("Should not share session with other user", func() {
  344. So(oldSessionID, ShouldNotEqual, newSessionID)
  345. })
  346. })
  347. middlewareScenario("When auth_proxy and ldap enabled call sync with ldap user", func(sc *scenarioContext) {
  348. setting.AuthProxyEnabled = true
  349. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  350. setting.AuthProxyHeaderProperty = "username"
  351. setting.AuthProxyWhitelist = ""
  352. setting.LdapEnabled = true
  353. called := false
  354. syncGrafanaUserWithLdapUser = func(query *m.LoginUserQuery) error {
  355. called = true
  356. query.User = &m.User{Id: 32}
  357. return nil
  358. }
  359. bus.AddHandler("test", func(query *m.UpsertUserCommand) error {
  360. query.Result = &m.User{Id: 32}
  361. return nil
  362. })
  363. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  364. query.Result = &m.SignedInUser{OrgId: 4, UserId: 32}
  365. return nil
  366. })
  367. sc.fakeReq("GET", "/")
  368. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  369. sc.exec()
  370. Convey("Should call syncGrafanaUserWithLdapUser", func() {
  371. So(called, ShouldBeTrue)
  372. })
  373. })
  374. })
  375. }
  376. func middlewareScenario(desc string, fn scenarioFunc) {
  377. Convey(desc, func() {
  378. defer bus.ClearBusHandlers()
  379. sc := &scenarioContext{}
  380. viewsPath, _ := filepath.Abs("../../public/views")
  381. sc.m = macaron.New()
  382. sc.m.Use(macaron.Renderer(macaron.RenderOptions{
  383. Directory: viewsPath,
  384. Delims: macaron.Delims{Left: "[[", Right: "]]"},
  385. }))
  386. session.Init(&msession.Options{}, 0)
  387. sc.userAuthTokenService = newFakeUserAuthTokenService()
  388. sc.m.Use(GetContextHandler(sc.userAuthTokenService))
  389. // mock out gc goroutine
  390. session.StartSessionGC = func() {}
  391. setting.SessionOptions = msession.Options{}
  392. sc.m.Use(OrgRedirect())
  393. sc.m.Use(AddDefaultResponseHeaders())
  394. sc.defaultHandler = func(c *m.ReqContext) {
  395. sc.context = c
  396. if sc.handlerFunc != nil {
  397. sc.handlerFunc(sc.context)
  398. }
  399. }
  400. sc.m.Get("/", sc.defaultHandler)
  401. fn(sc)
  402. })
  403. }
  404. type scenarioContext struct {
  405. m *macaron.Macaron
  406. context *m.ReqContext
  407. resp *httptest.ResponseRecorder
  408. apiKey string
  409. authHeader string
  410. respJson map[string]interface{}
  411. handlerFunc handlerFunc
  412. defaultHandler macaron.Handler
  413. url string
  414. userAuthTokenService *fakeUserAuthTokenService
  415. req *http.Request
  416. }
  417. func (sc *scenarioContext) withValidApiKey() *scenarioContext {
  418. sc.apiKey = "eyJrIjoidjVuQXdwTWFmRlA2em5hUzR1cmhkV0RMUzU1MTFNNDIiLCJuIjoiYXNkIiwiaWQiOjF9"
  419. return sc
  420. }
  421. func (sc *scenarioContext) withAuthorizationHeader(authHeader string) *scenarioContext {
  422. sc.authHeader = authHeader
  423. return sc
  424. }
  425. func (sc *scenarioContext) fakeReq(method, url string) *scenarioContext {
  426. sc.resp = httptest.NewRecorder()
  427. req, err := http.NewRequest(method, url, nil)
  428. So(err, ShouldBeNil)
  429. sc.req = req
  430. // add session cookie from last request
  431. if sc.context != nil {
  432. if sc.context.Session.ID() != "" {
  433. req.Header.Add("Cookie", "grafana_sess="+sc.context.Session.ID()+";")
  434. }
  435. }
  436. return sc
  437. }
  438. func (sc *scenarioContext) fakeReqWithParams(method, url string, queryParams map[string]string) *scenarioContext {
  439. sc.resp = httptest.NewRecorder()
  440. req, err := http.NewRequest(method, url, nil)
  441. q := req.URL.Query()
  442. for k, v := range queryParams {
  443. q.Add(k, v)
  444. }
  445. req.URL.RawQuery = q.Encode()
  446. So(err, ShouldBeNil)
  447. sc.req = req
  448. return sc
  449. }
  450. func (sc *scenarioContext) handler(fn handlerFunc) *scenarioContext {
  451. sc.handlerFunc = fn
  452. return sc
  453. }
  454. func (sc *scenarioContext) exec() {
  455. if sc.apiKey != "" {
  456. sc.req.Header.Add("Authorization", "Bearer "+sc.apiKey)
  457. }
  458. if sc.authHeader != "" {
  459. sc.req.Header.Add("Authorization", sc.authHeader)
  460. }
  461. sc.m.ServeHTTP(sc.resp, sc.req)
  462. if sc.resp.Header().Get("Content-Type") == "application/json; charset=UTF-8" {
  463. err := json.NewDecoder(sc.resp.Body).Decode(&sc.respJson)
  464. So(err, ShouldBeNil)
  465. }
  466. }
  467. type scenarioFunc func(c *scenarioContext)
  468. type handlerFunc func(c *m.ReqContext)
  469. type fakeUserAuthTokenService struct {
  470. initContextWithTokenProvider func(ctx *m.ReqContext, orgID int64) bool
  471. }
  472. func newFakeUserAuthTokenService() *fakeUserAuthTokenService {
  473. return &fakeUserAuthTokenService{
  474. initContextWithTokenProvider: func(ctx *m.ReqContext, orgID int64) bool {
  475. return false
  476. },
  477. }
  478. }
  479. func (s *fakeUserAuthTokenService) InitContextWithToken(ctx *m.ReqContext, orgID int64) bool {
  480. return s.initContextWithTokenProvider(ctx, orgID)
  481. }
  482. func (s *fakeUserAuthTokenService) UserAuthenticatedHook(user *m.User, c *m.ReqContext) error {
  483. return nil
  484. }
  485. func (s *fakeUserAuthTokenService) UserSignedOutHook(c *m.ReqContext) {}