middleware_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. package middleware
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "path/filepath"
  7. "testing"
  8. ms "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. sc.fakeReq("GET", "/")
  162. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  163. sc.exec()
  164. Convey("should init context with user info", func() {
  165. So(sc.context.IsSignedIn, ShouldBeTrue)
  166. So(sc.context.UserId, ShouldEqual, 12)
  167. So(sc.context.OrgId, ShouldEqual, 2)
  168. })
  169. })
  170. middlewareScenario("When auth_proxy is enabled enabled and user does not exists", func(sc *scenarioContext) {
  171. setting.AuthProxyEnabled = true
  172. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  173. setting.AuthProxyHeaderProperty = "username"
  174. setting.AuthProxyAutoSignUp = true
  175. setting.LdapEnabled = false
  176. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  177. if query.UserId > 0 {
  178. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  179. return nil
  180. }
  181. return m.ErrUserNotFound
  182. })
  183. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  184. cmd.Result = &m.User{Id: 33}
  185. return nil
  186. })
  187. sc.fakeReq("GET", "/")
  188. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  189. sc.exec()
  190. Convey("Should create user if auto sign up is enabled", func() {
  191. So(sc.context.IsSignedIn, ShouldBeTrue)
  192. So(sc.context.UserId, ShouldEqual, 33)
  193. So(sc.context.OrgId, ShouldEqual, 4)
  194. })
  195. })
  196. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is not trusted", func(sc *scenarioContext) {
  197. setting.AuthProxyEnabled = true
  198. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  199. setting.AuthProxyHeaderProperty = "username"
  200. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  201. sc.fakeReq("GET", "/")
  202. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  203. sc.req.RemoteAddr = "192.168.3.1:12345"
  204. sc.exec()
  205. Convey("should return 407 status code", func() {
  206. So(sc.resp.Code, ShouldEqual, 407)
  207. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 192.168.3.1 is not from the authentication proxy")
  208. })
  209. })
  210. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is not within trusted CIDR block", func(sc *scenarioContext) {
  211. setting.AuthProxyEnabled = true
  212. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  213. setting.AuthProxyHeaderProperty = "username"
  214. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  215. sc.fakeReq("GET", "/")
  216. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  217. sc.req.RemoteAddr = "192.168.3.1:12345"
  218. sc.exec()
  219. Convey("should return 407 status code", func() {
  220. So(sc.resp.Code, ShouldEqual, 407)
  221. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 192.168.3.1 is not from the authentication proxy")
  222. })
  223. })
  224. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is not trusted", func(sc *scenarioContext) {
  225. setting.AuthProxyEnabled = true
  226. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  227. setting.AuthProxyHeaderProperty = "username"
  228. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  229. sc.fakeReq("GET", "/")
  230. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  231. sc.req.RemoteAddr = "[2001:23]:12345"
  232. sc.exec()
  233. Convey("should return 407 status code", func() {
  234. So(sc.resp.Code, ShouldEqual, 407)
  235. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 2001:23 is not from the authentication proxy")
  236. })
  237. })
  238. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is not within trusted CIDR block", func(sc *scenarioContext) {
  239. setting.AuthProxyEnabled = true
  240. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  241. setting.AuthProxyHeaderProperty = "username"
  242. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  243. sc.fakeReq("GET", "/")
  244. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  245. sc.req.RemoteAddr = "[2001:23]:12345"
  246. sc.exec()
  247. Convey("should return 407 status code", func() {
  248. So(sc.resp.Code, ShouldEqual, 407)
  249. So(sc.resp.Body.String(), ShouldContainSubstring, "Request for user (torkelo) from 2001:23 is not from the authentication proxy")
  250. })
  251. })
  252. middlewareScenario("When auth_proxy is enabled and request RemoteAddr is trusted", func(sc *scenarioContext) {
  253. setting.AuthProxyEnabled = true
  254. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  255. setting.AuthProxyHeaderProperty = "username"
  256. setting.AuthProxyWhitelist = "192.168.1.1, 2001::23"
  257. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  258. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  259. return nil
  260. })
  261. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  262. cmd.Result = &m.User{Id: 33}
  263. return nil
  264. })
  265. sc.fakeReq("GET", "/")
  266. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  267. sc.req.RemoteAddr = "[2001::23]:12345"
  268. sc.exec()
  269. Convey("Should init context with user info", func() {
  270. So(sc.context.IsSignedIn, ShouldBeTrue)
  271. So(sc.context.UserId, ShouldEqual, 33)
  272. So(sc.context.OrgId, ShouldEqual, 4)
  273. })
  274. })
  275. middlewareScenario("When auth_proxy is enabled and IPv4 request RemoteAddr is within trusted CIDR block", func(sc *scenarioContext) {
  276. setting.AuthProxyEnabled = true
  277. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  278. setting.AuthProxyHeaderProperty = "username"
  279. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  280. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  281. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  282. return nil
  283. })
  284. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  285. cmd.Result = &m.User{Id: 33}
  286. return nil
  287. })
  288. sc.fakeReq("GET", "/")
  289. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  290. sc.req.RemoteAddr = "192.168.1.10:12345"
  291. sc.exec()
  292. Convey("Should init context with user info", func() {
  293. So(sc.context.IsSignedIn, ShouldBeTrue)
  294. So(sc.context.UserId, ShouldEqual, 33)
  295. So(sc.context.OrgId, ShouldEqual, 4)
  296. })
  297. })
  298. middlewareScenario("When auth_proxy is enabled and IPv6 request RemoteAddr is within trusted CIDR block", func(sc *scenarioContext) {
  299. setting.AuthProxyEnabled = true
  300. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  301. setting.AuthProxyHeaderProperty = "username"
  302. setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120"
  303. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  304. query.Result = &m.SignedInUser{OrgId: 4, UserId: 33}
  305. return nil
  306. })
  307. bus.AddHandler("test", func(cmd *m.UpsertUserCommand) error {
  308. cmd.Result = &m.User{Id: 33}
  309. return nil
  310. })
  311. sc.fakeReq("GET", "/")
  312. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  313. sc.req.RemoteAddr = "[2001::23]:12345"
  314. sc.exec()
  315. Convey("Should init context with user info", func() {
  316. So(sc.context.IsSignedIn, ShouldBeTrue)
  317. So(sc.context.UserId, ShouldEqual, 33)
  318. So(sc.context.OrgId, ShouldEqual, 4)
  319. })
  320. })
  321. middlewareScenario("When session exists for previous user, create a new session", func(sc *scenarioContext) {
  322. setting.AuthProxyEnabled = true
  323. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  324. setting.AuthProxyHeaderProperty = "username"
  325. setting.AuthProxyWhitelist = ""
  326. bus.AddHandler("test", func(query *m.UpsertUserCommand) error {
  327. query.Result = &m.User{Id: 32}
  328. return nil
  329. })
  330. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  331. query.Result = &m.SignedInUser{OrgId: 4, UserId: 32}
  332. return nil
  333. })
  334. // create session
  335. sc.fakeReq("GET", "/").handler(func(c *m.ReqContext) {
  336. c.Session.Set(session.SESS_KEY_USERID, int64(33))
  337. }).exec()
  338. oldSessionID := sc.context.Session.ID()
  339. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  340. sc.exec()
  341. newSessionID := sc.context.Session.ID()
  342. Convey("Should not share session with other user", func() {
  343. So(oldSessionID, ShouldNotEqual, newSessionID)
  344. })
  345. })
  346. middlewareScenario("When auth_proxy and ldap enabled call sync with ldap user", func(sc *scenarioContext) {
  347. setting.AuthProxyEnabled = true
  348. setting.AuthProxyHeaderName = "X-WEBAUTH-USER"
  349. setting.AuthProxyHeaderProperty = "username"
  350. setting.AuthProxyWhitelist = ""
  351. setting.LdapEnabled = true
  352. called := false
  353. syncGrafanaUserWithLdapUser = func(query *m.LoginUserQuery) error {
  354. called = true
  355. query.User = &m.User{Id: 32}
  356. return nil
  357. }
  358. bus.AddHandler("test", func(query *m.UpsertUserCommand) error {
  359. query.Result = &m.User{Id: 32}
  360. return nil
  361. })
  362. bus.AddHandler("test", func(query *m.GetSignedInUserQuery) error {
  363. query.Result = &m.SignedInUser{OrgId: 4, UserId: 32}
  364. return nil
  365. })
  366. sc.fakeReq("GET", "/")
  367. sc.req.Header.Add("X-WEBAUTH-USER", "torkelo")
  368. sc.exec()
  369. Convey("Should call syncGrafanaUserWithLdapUser", func() {
  370. So(called, ShouldBeTrue)
  371. })
  372. })
  373. })
  374. }
  375. func middlewareScenario(desc string, fn scenarioFunc) {
  376. Convey(desc, func() {
  377. defer bus.ClearBusHandlers()
  378. sc := &scenarioContext{}
  379. viewsPath, _ := filepath.Abs("../../public/views")
  380. sc.m = macaron.New()
  381. sc.m.Use(macaron.Renderer(macaron.RenderOptions{
  382. Directory: viewsPath,
  383. Delims: macaron.Delims{Left: "[[", Right: "]]"},
  384. }))
  385. sc.userAuthTokenService = newFakeUserAuthTokenService()
  386. sc.m.Use(GetContextHandler(sc.userAuthTokenService))
  387. // mock out gc goroutine
  388. session.StartSessionGC = func() {}
  389. sc.m.Use(Sessioner(&ms.Options{}, 0))
  390. sc.m.Use(OrgRedirect())
  391. sc.m.Use(AddDefaultResponseHeaders())
  392. sc.defaultHandler = func(c *m.ReqContext) {
  393. sc.context = c
  394. if sc.handlerFunc != nil {
  395. sc.handlerFunc(sc.context)
  396. }
  397. }
  398. sc.m.Get("/", sc.defaultHandler)
  399. fn(sc)
  400. })
  401. }
  402. type scenarioContext struct {
  403. m *macaron.Macaron
  404. context *m.ReqContext
  405. resp *httptest.ResponseRecorder
  406. apiKey string
  407. authHeader string
  408. respJson map[string]interface{}
  409. handlerFunc handlerFunc
  410. defaultHandler macaron.Handler
  411. url string
  412. userAuthTokenService *fakeUserAuthTokenService
  413. req *http.Request
  414. }
  415. func (sc *scenarioContext) withValidApiKey() *scenarioContext {
  416. sc.apiKey = "eyJrIjoidjVuQXdwTWFmRlA2em5hUzR1cmhkV0RMUzU1MTFNNDIiLCJuIjoiYXNkIiwiaWQiOjF9"
  417. return sc
  418. }
  419. func (sc *scenarioContext) withAuthorizationHeader(authHeader string) *scenarioContext {
  420. sc.authHeader = authHeader
  421. return sc
  422. }
  423. func (sc *scenarioContext) fakeReq(method, url string) *scenarioContext {
  424. sc.resp = httptest.NewRecorder()
  425. req, err := http.NewRequest(method, url, nil)
  426. So(err, ShouldBeNil)
  427. sc.req = req
  428. // add session cookie from last request
  429. if sc.context != nil {
  430. if sc.context.Session.ID() != "" {
  431. req.Header.Add("Cookie", "grafana_sess="+sc.context.Session.ID()+";")
  432. }
  433. }
  434. return sc
  435. }
  436. func (sc *scenarioContext) fakeReqWithParams(method, url string, queryParams map[string]string) *scenarioContext {
  437. sc.resp = httptest.NewRecorder()
  438. req, err := http.NewRequest(method, url, nil)
  439. q := req.URL.Query()
  440. for k, v := range queryParams {
  441. q.Add(k, v)
  442. }
  443. req.URL.RawQuery = q.Encode()
  444. So(err, ShouldBeNil)
  445. sc.req = req
  446. return sc
  447. }
  448. func (sc *scenarioContext) handler(fn handlerFunc) *scenarioContext {
  449. sc.handlerFunc = fn
  450. return sc
  451. }
  452. func (sc *scenarioContext) exec() {
  453. if sc.apiKey != "" {
  454. sc.req.Header.Add("Authorization", "Bearer "+sc.apiKey)
  455. }
  456. if sc.authHeader != "" {
  457. sc.req.Header.Add("Authorization", sc.authHeader)
  458. }
  459. sc.m.ServeHTTP(sc.resp, sc.req)
  460. if sc.resp.Header().Get("Content-Type") == "application/json; charset=UTF-8" {
  461. err := json.NewDecoder(sc.resp.Body).Decode(&sc.respJson)
  462. So(err, ShouldBeNil)
  463. }
  464. }
  465. type scenarioFunc func(c *scenarioContext)
  466. type handlerFunc func(c *m.ReqContext)
  467. type fakeUserAuthTokenService struct {
  468. initContextWithTokenProvider func(ctx *m.ReqContext, orgID int64) bool
  469. }
  470. func newFakeUserAuthTokenService() *fakeUserAuthTokenService {
  471. return &fakeUserAuthTokenService{
  472. initContextWithTokenProvider: func(ctx *m.ReqContext, orgID int64) bool {
  473. return false
  474. },
  475. }
  476. }
  477. func (s *fakeUserAuthTokenService) InitContextWithToken(ctx *m.ReqContext, orgID int64) bool {
  478. return s.initContextWithTokenProvider(ctx, orgID)
  479. }
  480. func (s *fakeUserAuthTokenService) UserAuthenticatedHook(user *m.User, c *m.ReqContext) error {
  481. return nil
  482. }
  483. func (s *fakeUserAuthTokenService) UserSignedOutHook(c *m.ReqContext) {}