diff --git a/pkg/middleware/org_redirect.go b/pkg/middleware/org_redirect.go index 16463a0c68d..e6f8b638f52 100644 --- a/pkg/middleware/org_redirect.go +++ b/pkg/middleware/org_redirect.go @@ -44,7 +44,16 @@ func OrgRedirect(cfg *setting.Cfg) web.Handler { return } - newURL := fmt.Sprintf("%s%s?%s", cfg.AppURL, strings.TrimPrefix(c.Req.URL.Path, "/"), c.Req.URL.Query().Encode()) + urlParams := c.Req.URL.Query() + qs := urlParams.Encode() + + if urlParams.Has("kiosk") && urlParams.Get("kiosk") == "" { + urlParams.Del("kiosk") + qs = fmt.Sprintf("%s&kiosk", urlParams.Encode()) + } + + newURL := fmt.Sprintf("%s%s?%s", cfg.AppURL, strings.TrimPrefix(c.Req.URL.Path, "/"), qs) + c.Redirect(newURL, 302) } } diff --git a/pkg/middleware/org_redirect_test.go b/pkg/middleware/org_redirect_test.go index 4018ab9427c..4c4620843f6 100644 --- a/pkg/middleware/org_redirect_test.go +++ b/pkg/middleware/org_redirect_test.go @@ -7,33 +7,68 @@ import ( "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/models" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestOrgRedirectMiddleware(t *testing.T) { - middlewareScenario(t, "when setting a correct org for the user", func(t *testing.T, sc *scenarioContext) { - sc.withTokenSessionCookie("token") - bus.AddHandler("test", func(ctx context.Context, query *models.SetUsingOrgCommand) error { - return nil + testCases := []struct { + desc string + input string + expStatus int + expLocation string + }{ + { + desc: "when setting a correct org for the user", + input: "/?orgId=3", + expStatus: 302, + expLocation: "/?orgId=3", + }, + { + desc: "when setting a correct org for the user with '&kiosk'", + input: "/?orgId=3&kiosk", + expStatus: 302, + expLocation: "/?orgId=3&kiosk", + }, + { + desc: "when setting a correct org for the user with '&kiosk=", + input: "/?kiosk=&orgId=3", + expStatus: 302, + expLocation: "/?orgId=3&kiosk", + }, + { + desc: "when setting a correct org for the user with '&kiosk=tv'", + input: "/?kiosk=tv&orgId=3", + expStatus: 302, + expLocation: "/?kiosk=tv&orgId=3", + }, + } + + for _, tc := range testCases { + middlewareScenario(t, tc.desc, func(t *testing.T, sc *scenarioContext) { + sc.withTokenSessionCookie("token") + bus.AddHandler("test", func(ctx context.Context, query *models.SetUsingOrgCommand) error { + return nil + }) + + bus.AddHandler("test", func(ctx context.Context, query *models.GetSignedInUserQuery) error { + query.Result = &models.SignedInUser{OrgId: 1, UserId: 12} + return nil + }) + + sc.userAuthTokenService.LookupTokenProvider = func(ctx context.Context, unhashedToken string) (*models.UserToken, error) { + return &models.UserToken{ + UserId: 0, + UnhashedToken: "", + }, nil + } + + sc.m.Get("/", sc.defaultHandler) + sc.fakeReq("GET", tc.input).exec() + + require.Equal(t, tc.expStatus, sc.resp.Code) + require.Equal(t, tc.expLocation, sc.resp.Header().Get("Location")) }) - - bus.AddHandler("test", func(ctx context.Context, query *models.GetSignedInUserQuery) error { - query.Result = &models.SignedInUser{OrgId: 1, UserId: 12} - return nil - }) - - sc.userAuthTokenService.LookupTokenProvider = func(ctx context.Context, unhashedToken string) (*models.UserToken, error) { - return &models.UserToken{ - UserId: 0, - UnhashedToken: "", - }, nil - } - - sc.m.Get("/", sc.defaultHandler) - sc.fakeReq("GET", "/?orgId=3").exec() - - assert.Equal(t, 302, sc.resp.Code) - }) + } middlewareScenario(t, "when setting an invalid org for user", func(t *testing.T, sc *scenarioContext) { sc.withTokenSessionCookie("token") @@ -56,6 +91,6 @@ func TestOrgRedirectMiddleware(t *testing.T) { sc.m.Get("/", sc.defaultHandler) sc.fakeReq("GET", "/?orgId=3").exec() - assert.Equal(t, 404, sc.resp.Code) + require.Equal(t, 404, sc.resp.Code) }) }