diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index 51d38bb0a77..2e0002aa5f3 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -54,6 +54,20 @@ func (hs *HTTPServer) GetDashboard(c *models.ReqContext) Response { return rsp } + // When dash contains only keys id, uid that means dashboard data is not valid and json decode failed. + if dash.Data != nil { + isEmptyData := true + for k := range dash.Data.MustMap() { + if k != "id" && k != "uid" { + isEmptyData = false + break + } + } + if isEmptyData { + return Error(500, "Error while loading dashboard, dashboard data is invalid", nil) + } + } + guardian := guardian.New(dash.Id, c.OrgId, c.SignedInUser) if canView, err := guardian.CanView(); err != nil || !canView { return dashboardGuardianResponse(err) diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index 38dba127b26..d4bc7962c53 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -1009,7 +1009,9 @@ func TestDashboardAPIEndpoint(t *testing.T) { return nil }) bus.AddHandler("test", func(query *models.GetDashboardQuery) error { - query.Result = &models.Dashboard{Id: 1, Data: &simplejson.Json{}} + dataValue, err := simplejson.NewJson([]byte(`{"id": 1, "editable": true, "style": "dark"}`)) + require.NoError(t, err) + query.Result = &models.Dashboard{Id: 1, Data: dataValue} return nil })