| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | package middleware | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2019-04-30 20:42:01 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2019-07-31 18:23:00 +08:00
										 |  |  | 	"encoding/base32" | 
					
						
							| 
									
										
										
										
											2019-08-21 01:13:27 +08:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2019-02-06 04:14:23 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-02 17:16:31 +08:00
										 |  |  | 	. "github.com/smartystreets/goconvey/convey" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"gopkg.in/macaron.v1" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/dtos" | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/remotecache" | 
					
						
							| 
									
										
										
										
											2019-11-08 00:48:56 +08:00
										 |  |  | 	authproxy "github.com/grafana/grafana/pkg/middleware/auth_proxy" | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/models" | 
					
						
							| 
									
										
										
										
											2019-03-08 22:15:17 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/auth" | 
					
						
							| 
									
										
										
										
											2019-07-01 19:29:41 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login" | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util" | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-02 21:06:59 +08:00
										 |  |  | const errorTemplate = "error-template" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | func mockGetTime() { | 
					
						
							|  |  |  | 	var timeSeed int64 | 
					
						
							|  |  |  | 	getTime = func() time.Time { | 
					
						
							|  |  |  | 		fakeNow := time.Unix(timeSeed, 0) | 
					
						
							|  |  |  | 		timeSeed++ | 
					
						
							|  |  |  | 		return fakeNow | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func resetGetTime() { | 
					
						
							|  |  |  | 	getTime = time.Now | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 02:24:23 +08:00
										 |  |  | func TestMiddleWareSecurityHeaders(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-07-02 21:06:59 +08:00
										 |  |  | 	setting.ERR_TEMPLATE_NAME = errorTemplate | 
					
						
							| 
									
										
										
										
											2019-06-19 02:24:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Convey("Given the grafana middleware", t, func() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		middlewareScenario(t, "middleware should get correct x-xss-protection header", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			setting.XSSProtectionHeader = true | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("X-XSS-Protection"), ShouldEqual, "1; mode=block") | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		middlewareScenario(t, "middleware should not get x-xss-protection when disabled", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			setting.XSSProtectionHeader = false | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("X-XSS-Protection"), ShouldBeEmpty) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		middlewareScenario(t, "middleware should add correct Strict-Transport-Security header", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			setting.StrictTransportSecurity = true | 
					
						
							|  |  |  | 			setting.Protocol = setting.HTTPS | 
					
						
							|  |  |  | 			setting.StrictTransportSecurityMaxAge = 64000 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Strict-Transport-Security"), ShouldEqual, "max-age=64000") | 
					
						
							|  |  |  | 			setting.StrictTransportSecurityPreload = true | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Strict-Transport-Security"), ShouldEqual, "max-age=64000; preload") | 
					
						
							|  |  |  | 			setting.StrictTransportSecuritySubDomains = true | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Strict-Transport-Security"), ShouldEqual, "max-age=64000; preload; includeSubDomains") | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-01 22:23:36 +08:00
										 |  |  | func TestMiddlewareContext(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-07-02 21:06:59 +08:00
										 |  |  | 	setting.ERR_TEMPLATE_NAME = errorTemplate | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 	Convey("Given the grafana middleware", t, func() { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "middleware should add context to injector", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							| 
									
										
										
										
											2015-05-01 22:23:36 +08:00
										 |  |  | 			So(sc.context, ShouldNotBeNil) | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Default middleware should allow get request", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							| 
									
										
										
										
											2015-05-01 22:23:36 +08:00
										 |  |  | 			So(sc.resp.Code, ShouldEqual, 200) | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2015-05-01 22:23:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 		middlewareScenario(t, "middleware should add Cache-Control header for requests to API", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2017-07-04 22:33:37 +08:00
										 |  |  | 			sc.fakeReq("GET", "/api/search").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Cache-Control"), ShouldEqual, "no-cache") | 
					
						
							| 
									
										
										
										
											2017-07-07 00:56:22 +08:00
										 |  |  | 			So(sc.resp.Header().Get("Pragma"), ShouldEqual, "no-cache") | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Expires"), ShouldEqual, "-1") | 
					
						
							| 
									
										
										
										
											2017-07-04 22:33:37 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 		middlewareScenario(t, "middleware should not add Cache-Control header for requests to datasource proxy API", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/datasources/proxy/1/test").exec() | 
					
						
							| 
									
										
										
										
											2017-07-04 22:33:37 +08:00
										 |  |  | 			So(sc.resp.Header().Get("Cache-Control"), ShouldBeEmpty) | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 			So(sc.resp.Header().Get("Pragma"), ShouldBeEmpty) | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Expires"), ShouldBeEmpty) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 15:56:23 +08:00
										 |  |  | 		middlewareScenario(t, "middleware should add Cache-Control header for requests with html response", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			sc.handler(func(c *models.ReqContext) { | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 				data := &dtos.IndexViewData{ | 
					
						
							|  |  |  | 					User:     &dtos.CurrentUser{}, | 
					
						
							|  |  |  | 					Settings: map[string]interface{}{}, | 
					
						
							|  |  |  | 					NavTree:  []*dtos.NavLink{}, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				c.HTML(200, "index-template", data) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Code, ShouldEqual, 200) | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Cache-Control"), ShouldEqual, "no-cache") | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Pragma"), ShouldEqual, "no-cache") | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("Expires"), ShouldEqual, "-1") | 
					
						
							| 
									
										
										
										
											2017-07-04 22:33:37 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 15:56:23 +08:00
										 |  |  | 		middlewareScenario(t, "middleware should add X-Frame-Options header with deny for request when not allowing embedding", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/search").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("X-Frame-Options"), ShouldEqual, "deny") | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		middlewareScenario(t, "middleware should not add X-Frame-Options header for request when allowing embedding", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			setting.AllowEmbedding = true | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/api/search").exec() | 
					
						
							|  |  |  | 			So(sc.resp.Header().Get("X-Frame-Options"), ShouldBeEmpty) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Invalid api key", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 			sc.apiKey = "invalid_key_test" | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should not init session", func() { | 
					
						
							|  |  |  | 				So(sc.resp.Header().Get("Set-Cookie"), ShouldBeEmpty) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should return 401", func() { | 
					
						
							|  |  |  | 				So(sc.resp.Code, ShouldEqual, 401) | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 				So(sc.respJson["message"], ShouldEqual, errStringInvalidAPIKey) | 
					
						
							| 
									
										
										
										
											2015-06-30 15:37:52 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Valid api key", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-10-23 16:40:12 +08:00
										 |  |  | 			keyhash, err := util.EncodePassword("v5nAwpMafFP6znaS4urhdWDLS5511M42", "asd") | 
					
						
							|  |  |  | 			So(err, ShouldBeNil) | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			bus.AddHandler("test", func(query *models.GetApiKeyByNameQuery) error { | 
					
						
							|  |  |  | 				query.Result = &models.ApiKey{OrgId: 12, Role: models.ROLE_EDITOR, Key: keyhash} | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			sc.fakeReq("GET", "/").withValidApiKey().exec() | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should return 200", func() { | 
					
						
							|  |  |  | 				So(sc.resp.Code, ShouldEqual, 200) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should init middleware context", func() { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 				So(sc.context.IsSignedIn, ShouldEqual, true) | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 				So(sc.context.OrgId, ShouldEqual, 12) | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				So(sc.context.OrgRole, ShouldEqual, models.ROLE_EDITOR) | 
					
						
							| 
									
										
										
										
											2015-05-02 04:26:16 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Valid api key, but does not match db hash", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			keyhash := "Something_not_matching" | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			bus.AddHandler("test", func(query *models.GetApiKeyByNameQuery) error { | 
					
						
							|  |  |  | 				query.Result = &models.ApiKey{OrgId: 12, Role: models.ROLE_EDITOR, Key: keyhash} | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").withValidApiKey().exec() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should return api key invalid", func() { | 
					
						
							|  |  |  | 				So(sc.resp.Code, ShouldEqual, 401) | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 				So(sc.respJson["message"], ShouldEqual, errStringInvalidAPIKey) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 		middlewareScenario(t, "Valid api key, but expired", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 			mockGetTime() | 
					
						
							|  |  |  | 			defer resetGetTime() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-23 16:40:12 +08:00
										 |  |  | 			keyhash, err := util.EncodePassword("v5nAwpMafFP6znaS4urhdWDLS5511M42", "asd") | 
					
						
							|  |  |  | 			So(err, ShouldBeNil) | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			bus.AddHandler("test", func(query *models.GetApiKeyByNameQuery) error { | 
					
						
							|  |  |  | 				// api key expired one second before
 | 
					
						
							|  |  |  | 				expires := getTime().Add(-1 * time.Second).Unix() | 
					
						
							|  |  |  | 				query.Result = &models.ApiKey{OrgId: 12, Role: models.ROLE_EDITOR, Key: keyhash, | 
					
						
							|  |  |  | 					Expires: &expires} | 
					
						
							|  |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").withValidApiKey().exec() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("Should return 401", func() { | 
					
						
							|  |  |  | 				So(sc.resp.Code, ShouldEqual, 401) | 
					
						
							|  |  |  | 				So(sc.respJson["message"], ShouldEqual, "Expired API key") | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Non-expired auth token in cookie which not are being rotated", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			sc.withTokenSessionCookie("token") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 				query.Result = &models.SignedInUser{OrgId: 2, UserId: 12} | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			sc.userAuthTokenService.LookupTokenProvider = func(ctx context.Context, unhashedToken string) (*models.UserToken, error) { | 
					
						
							|  |  |  | 				return &models.UserToken{ | 
					
						
							| 
									
										
										
										
											2019-02-06 23:21:16 +08:00
										 |  |  | 					UserId:        12, | 
					
						
							|  |  |  | 					UnhashedToken: unhashedToken, | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				}, nil | 
					
						
							| 
									
										
										
										
											2019-01-22 20:51:55 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			Convey("Should init context with user info", func() { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							|  |  |  | 				So(sc.context.UserId, ShouldEqual, 12) | 
					
						
							| 
									
										
										
										
											2019-02-06 23:21:16 +08:00
										 |  |  | 				So(sc.context.UserToken.UserId, ShouldEqual, 12) | 
					
						
							|  |  |  | 				So(sc.context.UserToken.UnhashedToken, ShouldEqual, "token") | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			Convey("Should not set cookie", func() { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				So(sc.resp.Header().Get("Set-Cookie"), ShouldEqual, "") | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Non-expired auth token in cookie which are being rotated", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			sc.withTokenSessionCookie("token") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 				query.Result = &models.SignedInUser{OrgId: 2, UserId: 12} | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			sc.userAuthTokenService.LookupTokenProvider = func(ctx context.Context, unhashedToken string) (*models.UserToken, error) { | 
					
						
							|  |  |  | 				return &models.UserToken{ | 
					
						
							| 
									
										
										
										
											2019-02-06 23:21:16 +08:00
										 |  |  | 					UserId:        12, | 
					
						
							|  |  |  | 					UnhashedToken: "", | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				}, nil | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			sc.userAuthTokenService.TryRotateTokenProvider = func(ctx context.Context, userToken *models.UserToken, clientIP, userAgent string) (bool, error) { | 
					
						
							| 
									
										
										
										
											2019-02-06 23:21:16 +08:00
										 |  |  | 				userToken.UnhashedToken = "rotated" | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				return true, nil | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-06 04:14:23 +08:00
										 |  |  | 			maxAgeHours := (time.Duration(setting.LoginMaxLifetimeDays) * 24 * time.Hour) | 
					
						
							|  |  |  | 			maxAge := (maxAgeHours + time.Hour).Seconds() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 14:10:08 +08:00
										 |  |  | 			sameSitePolicies := []http.SameSite{ | 
					
						
							|  |  |  | 				http.SameSiteDefaultMode, | 
					
						
							|  |  |  | 				http.SameSiteLaxMode, | 
					
						
							|  |  |  | 				http.SameSiteStrictMode, | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-08-09 14:10:08 +08:00
										 |  |  | 			for _, sameSitePolicy := range sameSitePolicies { | 
					
						
							|  |  |  | 				setting.CookieSameSite = sameSitePolicy | 
					
						
							|  |  |  | 				expectedCookie := &http.Cookie{ | 
					
						
							|  |  |  | 					Name:     setting.LoginCookieName, | 
					
						
							|  |  |  | 					Value:    "rotated", | 
					
						
							|  |  |  | 					Path:     setting.AppSubUrl + "/", | 
					
						
							|  |  |  | 					HttpOnly: true, | 
					
						
							|  |  |  | 					MaxAge:   int(maxAge), | 
					
						
							|  |  |  | 					Secure:   setting.CookieSecure, | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if sameSitePolicy != http.SameSiteDefaultMode { | 
					
						
							|  |  |  | 					expectedCookie.SameSite = sameSitePolicy | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 14:10:08 +08:00
										 |  |  | 				sc.fakeReq("GET", "/").exec() | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 14:10:08 +08:00
										 |  |  | 				Convey(fmt.Sprintf("Should init context with user info and setting.SameSite=%v", sameSitePolicy), func() { | 
					
						
							|  |  |  | 					So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							|  |  |  | 					So(sc.context.UserId, ShouldEqual, 12) | 
					
						
							|  |  |  | 					So(sc.context.UserToken.UserId, ShouldEqual, 12) | 
					
						
							|  |  |  | 					So(sc.context.UserToken.UnhashedToken, ShouldEqual, "rotated") | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 14:10:08 +08:00
										 |  |  | 				Convey(fmt.Sprintf("Should set cookie with setting.SameSite=%v", sameSitePolicy), func() { | 
					
						
							|  |  |  | 					So(sc.resp.Header().Get("Set-Cookie"), ShouldEqual, expectedCookie.String()) | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "Invalid/expired auth token in cookie", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			sc.withTokenSessionCookie("token") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			sc.userAuthTokenService.LookupTokenProvider = func(ctx context.Context, unhashedToken string) (*models.UserToken, error) { | 
					
						
							|  |  |  | 				return nil, models.ErrUserTokenNotFound | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			Convey("Should not init context with user info", func() { | 
					
						
							| 
									
										
										
										
											2019-02-05 06:44:28 +08:00
										 |  |  | 				So(sc.context.IsSignedIn, ShouldBeFalse) | 
					
						
							|  |  |  | 				So(sc.context.UserId, ShouldEqual, 0) | 
					
						
							|  |  |  | 				So(sc.context.UserToken, ShouldBeNil) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		middlewareScenario(t, "When anonymous access is enabled", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			setting.AnonymousEnabled = true | 
					
						
							|  |  |  | 			setting.AnonymousOrgName = "test" | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			setting.AnonymousOrgRole = string(models.ROLE_EDITOR) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 			bus.AddHandler("test", func(query *models.GetOrgByNameQuery) error { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 				So(query.Name, ShouldEqual, "test") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				query.Result = &models.Org{Id: 2, Name: "test"} | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 				return nil | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			sc.fakeReq("GET", "/").exec() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			Convey("Should init context with org info", func() { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 				So(sc.context.UserId, ShouldEqual, 0) | 
					
						
							|  |  |  | 				So(sc.context.OrgId, ShouldEqual, 2) | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				So(sc.context.OrgRole, ShouldEqual, models.ROLE_EDITOR) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Convey("context signed in should be false", func() { | 
					
						
							|  |  |  | 				So(sc.context.IsSignedIn, ShouldBeFalse) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2015-05-02 18:06:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		Convey("auth_proxy", func() { | 
					
						
							| 
									
										
										
										
											2015-05-02 18:06:58 +08:00
										 |  |  | 			setting.AuthProxyEnabled = true | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 			setting.AuthProxyWhitelist = "" | 
					
						
							|  |  |  | 			setting.AuthProxyAutoSignUp = true | 
					
						
							| 
									
										
										
										
											2019-05-22 20:30:03 +08:00
										 |  |  | 			setting.LDAPEnabled = true | 
					
						
							| 
									
										
										
										
											2015-05-02 18:06:58 +08:00
										 |  |  | 			setting.AuthProxyHeaderName = "X-WEBAUTH-USER" | 
					
						
							|  |  |  | 			setting.AuthProxyHeaderProperty = "username" | 
					
						
							| 
									
										
										
										
											2019-07-31 18:23:00 +08:00
										 |  |  | 			setting.AuthProxyHeaders = map[string]string{"Groups": "X-WEBAUTH-GROUPS"} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 			name := "markelog" | 
					
						
							| 
									
										
										
										
											2019-07-31 18:23:00 +08:00
										 |  |  | 			group := "grafana-core-team" | 
					
						
							| 
									
										
										
										
											2015-05-02 18:06:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should not sync the user if it's in the cache", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 					query.Result = &models.SignedInUser{OrgId: 4, UserId: query.UserId} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-08 00:48:56 +08:00
										 |  |  | 				key := fmt.Sprintf(authproxy.CachePrefix, base32.StdEncoding.EncodeToString([]byte(name+"-"+group))) | 
					
						
							| 
									
										
										
										
											2019-10-16 00:08:06 +08:00
										 |  |  | 				err := sc.remoteCacheService.Set(key, int64(33), 0) | 
					
						
							|  |  |  | 				So(err, ShouldBeNil) | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							| 
									
										
										
										
											2019-07-31 18:23:00 +08:00
										 |  |  | 				sc.req.Header.Add("X-WEBAUTH-GROUPS", group) | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.exec() | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				Convey("Should init user via cache", func() { | 
					
						
							|  |  |  | 					So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							| 
									
										
										
										
											2019-04-16 20:09:18 +08:00
										 |  |  | 					So(sc.context.UserId, ShouldEqual, 33) | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					So(sc.context.OrgId, ShouldEqual, 4) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should respect auto signup option", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-07-01 19:29:41 +08:00
										 |  |  | 				setting.LDAPEnabled = false | 
					
						
							|  |  |  | 				setting.AuthProxyAutoSignUp = false | 
					
						
							|  |  |  | 				var actualAuthProxyAutoSignUp *bool = nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				bus.AddHandler("test", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					actualAuthProxyAutoSignUp = &cmd.SignupAllowed | 
					
						
							|  |  |  | 					return login.ErrInvalidCredentials | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert.False(t, *actualAuthProxyAutoSignUp) | 
					
						
							| 
									
										
										
										
											2019-08-21 01:13:27 +08:00
										 |  |  | 				assert.Equal(t, sc.resp.Code, 407) | 
					
						
							| 
									
										
										
										
											2019-07-01 19:29:41 +08:00
										 |  |  | 				assert.Nil(t, sc.context) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should create an user from a header", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:30:03 +08:00
										 |  |  | 				setting.LDAPEnabled = false | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				setting.AuthProxyAutoSignUp = true | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					if query.UserId > 0 { | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 						query.Result = &models.SignedInUser{OrgId: 4, UserId: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 						return nil | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 					return models.ErrUserNotFound | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					cmd.Result = &models.User{Id: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-12-19 11:16:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				Convey("Should create user from header info", func() { | 
					
						
							|  |  |  | 					So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							|  |  |  | 					So(sc.context.UserId, ShouldEqual, 33) | 
					
						
							|  |  |  | 					So(sc.context.OrgId, ShouldEqual, 4) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-03-24 03:50:07 +08:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2018-03-23 05:02:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should get an existing user from header", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-05-22 20:30:03 +08:00
										 |  |  | 				setting.LDAPEnabled = false | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 					query.Result = &models.SignedInUser{OrgId: 2, UserId: 12} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					cmd.Result = &models.User{Id: 12} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							| 
									
										
										
										
											2018-03-24 03:50:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 				Convey("Should init context with user info", func() { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							|  |  |  | 					So(sc.context.UserId, ShouldEqual, 12) | 
					
						
							|  |  |  | 					So(sc.context.OrgId, ShouldEqual, 2) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should allow the request from whitelist IP", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				setting.AuthProxyWhitelist = "192.168.1.0/24, 2001::0/120" | 
					
						
							| 
									
										
										
										
											2019-05-22 20:30:03 +08:00
										 |  |  | 				setting.LDAPEnabled = false | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 					query.Result = &models.SignedInUser{OrgId: 4, UserId: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					cmd.Result = &models.User{Id: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.req.RemoteAddr = "[2001::23]:12345" | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				Convey("Should init context with user info", func() { | 
					
						
							|  |  |  | 					So(sc.context.IsSignedIn, ShouldBeTrue) | 
					
						
							|  |  |  | 					So(sc.context.UserId, ShouldEqual, 33) | 
					
						
							|  |  |  | 					So(sc.context.OrgId, ShouldEqual, 4) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 			middlewareScenario(t, "Should not allow the request from whitelist IP", func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				setting.AuthProxyWhitelist = "8.8.8.8" | 
					
						
							| 
									
										
										
										
											2019-05-22 20:30:03 +08:00
										 |  |  | 				setting.LDAPEnabled = false | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 					query.Result = &models.SignedInUser{OrgId: 4, UserId: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2018-03-24 03:50:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 				bus.AddHandler("test", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					cmd.Result = &models.User{Id: 33} | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					return nil | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.req.RemoteAddr = "[2001::23]:12345" | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 01:56:58 +08:00
										 |  |  | 				Convey("Should return 407 status code", func() { | 
					
						
							| 
									
										
										
										
											2019-08-21 01:13:27 +08:00
										 |  |  | 					So(sc.resp.Code, ShouldEqual, 407) | 
					
						
							|  |  |  | 					So(sc.context, ShouldBeNil) | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			middlewareScenario(t, "Should return 407 status code if LDAP says no", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 				bus.AddHandler("LDAP", func(cmd *models.UpsertUserCommand) error { | 
					
						
							|  |  |  | 					return errors.New("Do not add user") | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Should return 407 status code", func() { | 
					
						
							|  |  |  | 					So(sc.resp.Code, ShouldEqual, 407) | 
					
						
							|  |  |  | 					So(sc.context, ShouldBeNil) | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			middlewareScenario(t, "Should return 407 status code if there is cache mishap", func(sc *scenarioContext) { | 
					
						
							|  |  |  | 				bus.AddHandler("Do not have the user", func(query *models.GetSignedInUserQuery) error { | 
					
						
							|  |  |  | 					return errors.New("Do not add user") | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				sc.fakeReq("GET", "/") | 
					
						
							|  |  |  | 				sc.req.Header.Add(setting.AuthProxyHeaderName, name) | 
					
						
							|  |  |  | 				sc.exec() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Convey("Should return 407 status code", func() { | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 					So(sc.resp.Code, ShouldEqual, 407) | 
					
						
							|  |  |  | 					So(sc.context, ShouldBeNil) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2016-02-23 21:22:28 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2015-05-01 17:55:59 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | func middlewareScenario(t *testing.T, desc string, fn scenarioFunc) { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 	Convey(desc, func() { | 
					
						
							|  |  |  | 		defer bus.ClearBusHandlers() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-06 04:14:23 +08:00
										 |  |  | 		setting.LoginCookieName = "grafana_session" | 
					
						
							|  |  |  | 		setting.LoginMaxLifetimeDays = 30 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 		sc := &scenarioContext{} | 
					
						
							| 
									
										
										
										
											2019-01-23 19:41:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 		viewsPath, _ := filepath.Abs("../../public/views") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc.m = macaron.New() | 
					
						
							| 
									
										
										
										
											2019-05-06 15:22:59 +08:00
										 |  |  | 		sc.m.Use(AddDefaultResponseHeaders()) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 		sc.m.Use(macaron.Renderer(macaron.RenderOptions{ | 
					
						
							|  |  |  | 			Directory: viewsPath, | 
					
						
							|  |  |  | 			Delims:    macaron.Delims{Left: "[[", Right: "]]"}, | 
					
						
							|  |  |  | 		})) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 22:15:17 +08:00
										 |  |  | 		sc.userAuthTokenService = auth.NewFakeUserAuthTokenService() | 
					
						
							| 
									
										
										
										
											2019-04-08 19:31:46 +08:00
										 |  |  | 		sc.remoteCacheService = remotecache.NewFakeStore(t) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc.m.Use(GetContextHandler(sc.userAuthTokenService, sc.remoteCacheService)) | 
					
						
							| 
									
										
										
										
											2019-01-23 19:41:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-17 22:02:14 +08:00
										 |  |  | 		sc.m.Use(OrgRedirect()) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-26 14:47:03 +08:00
										 |  |  | 		sc.defaultHandler = func(c *models.ReqContext) { | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 			sc.context = c | 
					
						
							|  |  |  | 			if sc.handlerFunc != nil { | 
					
						
							|  |  |  | 				sc.handlerFunc(sc.context) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-05-02 18:06:58 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc.m.Get("/", sc.defaultHandler) | 
					
						
							| 
									
										
										
										
											2015-05-02 15:24:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |