diff --git a/pkg/api/login.go b/pkg/api/login.go index 75fefd30232..d561c6b3680 100644 --- a/pkg/api/login.go +++ b/pkg/api/login.go @@ -199,15 +199,18 @@ func (hs *HTTPServer) trySetEncryptedCookie(ctx *models.ReqContext, cookieName s return err } - http.SetCookie(ctx.Resp, &http.Cookie{ + cookie := http.Cookie{ Name: cookieName, MaxAge: 60, Value: hex.EncodeToString(encryptedError), HttpOnly: true, Path: setting.AppSubUrl + "/", Secure: hs.Cfg.CookieSecure, - SameSite: hs.Cfg.CookieSameSite, - }) + } + if hs.Cfg.CookieSameSite != http.SameSiteDefaultMode { + cookie.SameSite = hs.Cfg.CookieSameSite + } + http.SetCookie(ctx.Resp, &cookie) return nil } diff --git a/pkg/middleware/middleware.go b/pkg/middleware/middleware.go index 37f04011af7..021ca846c57 100644 --- a/pkg/middleware/middleware.go +++ b/pkg/middleware/middleware.go @@ -256,7 +256,9 @@ func WriteSessionCookie(ctx *models.ReqContext, value string, maxLifetimeDays in Path: setting.AppSubUrl + "/", Secure: setting.CookieSecure, MaxAge: maxAge, - SameSite: setting.CookieSameSite, + } + if setting.CookieSameSite != http.SameSiteDefaultMode { + cookie.SameSite = setting.CookieSameSite } http.SetCookie(ctx.Resp, &cookie) diff --git a/pkg/middleware/middleware_test.go b/pkg/middleware/middleware_test.go index 000aba1024d..ab7bf14ab40 100644 --- a/pkg/middleware/middleware_test.go +++ b/pkg/middleware/middleware_test.go @@ -252,28 +252,38 @@ func TestMiddlewareContext(t *testing.T) { maxAgeHours := (time.Duration(setting.LoginMaxLifetimeDays) * 24 * time.Hour) maxAge := (maxAgeHours + time.Hour).Seconds() - expectedCookie := &http.Cookie{ - Name: setting.LoginCookieName, - Value: "rotated", - Path: setting.AppSubUrl + "/", - HttpOnly: true, - MaxAge: int(maxAge), - Secure: setting.CookieSecure, - SameSite: setting.CookieSameSite, + sameSitePolicies := []http.SameSite{ + http.SameSiteDefaultMode, + http.SameSiteLaxMode, + http.SameSiteStrictMode, } + 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 + } - sc.fakeReq("GET", "/").exec() + sc.fakeReq("GET", "/").exec() - Convey("Should init context with user info", 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") - }) + 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") + }) - Convey("Should set cookie", func() { - So(sc.resp.Header().Get("Set-Cookie"), ShouldEqual, expectedCookie.String()) - }) + Convey(fmt.Sprintf("Should set cookie with setting.SameSite=%v", sameSitePolicy), func() { + So(sc.resp.Header().Get("Set-Cookie"), ShouldEqual, expectedCookie.String()) + }) + } }) middlewareScenario(t, "Invalid/expired auth token in cookie", func(sc *scenarioContext) {