Compare commits

...

3 Commits

Author SHA1 Message Date
github-actions[bot]
436269848d Release: 12.0.2+security-01 (#108267)
* Update changelog

* Update version to 12.0.2+security-01

* Update CHANGELOG.md

---------

Co-authored-by: grafana-delivery-bot[bot] <grafana-delivery-bot[bot]@users.noreply.github.com>
Co-authored-by: Yuri Tseretyan <yuriy.tseretyan@grafana.com>
2025-07-17 15:13:05 -04:00
Serge Zaitsev
76ea754dbb apply 444-202506261140 manually 2025-07-02 17:42:20 +02:00
github-actions[bot]
72f54b2cd9 apply security patch: release-12.0.2/438-202505231907.patch 2025-06-17 15:38:51 +00:00
66 changed files with 423 additions and 220 deletions

View File

@@ -1,3 +1,18 @@
<!-- 12.0.2+security-01 START -->
# 12.0.2+security-01 (2025-07-17)
### Features and enhancements
- **Profiles:** Stop passing response headers for Grafana-Pyroscope and parca datasources [#106730](https://github.com/grafana/grafana/pull/106730), [@simonswine](https://github.com/simonswine)
### Bug fixes
- **FlameGraph:** Fix bug for function names that conflict with JavaScript object prototype properties [#106625](https://github.com/grafana/grafana/pull/106625), [@simonswine](https://github.com/simonswine)
- **Security:** Fixed CVE-2025-6023
- **Security:** Fixed CVE-2025-6197
<!-- 12.0.2+security-01 END -->
<!-- 12.0.1 START -->
# 12.0.1 (2025-05-22)

View File

@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"npmClient": "yarn",
"version": "12.0.2"
"version": "12.0.3"
}

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "grafana",
"version": "12.0.2",
"version": "12.0.3",
"repository": "github:grafana/grafana",
"scripts": {
"build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js --progress",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/data",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana Data Library",
"keywords": [
"typescript"
@@ -56,7 +56,7 @@
},
"dependencies": {
"@braintree/sanitize-url": "7.0.1",
"@grafana/schema": "12.0.2",
"@grafana/schema": "12.0.3",
"@types/d3-interpolate": "^3.0.0",
"@types/string-hash": "1.1.3",
"@types/systemjs": "6.15.1",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/e2e-selectors",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana End-to-End Test Selectors Library",
"keywords": [
"cli",

View File

@@ -1,7 +1,7 @@
{
"name": "@grafana/eslint-plugin",
"description": "ESLint rules for use within the Grafana repo. Not suitable (or supported) for external use.",
"version": "12.0.2",
"version": "12.0.3",
"main": "./index.cjs",
"author": "Grafana Labs",
"license": "Apache-2.0",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/flamegraph",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana flamegraph visualization component",
"keywords": [
"grafana",
@@ -44,8 +44,8 @@
],
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/ui": "12.0.3",
"@leeoniya/ufuzzy": "1.0.18",
"d3": "^7.8.5",
"lodash": "4.17.21",

View File

@@ -1,6 +1,6 @@
{
"name": "@grafana/saga-icons",
"version": "12.0.2",
"version": "12.0.3",
"private": true,
"description": "Icons for Grafana",
"author": "Grafana Labs",

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"name": "@grafana/o11y-ds-frontend",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"description": "Library to manage traces in Grafana.",
"sideEffects": false,
"repository": {
@@ -18,12 +18,12 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/e2e-selectors": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"react-select": "5.10.0",
"react-use": "17.6.0",
"rxjs": "7.8.1",

View File

@@ -2,7 +2,7 @@
"name": "@grafana/plugin-configs",
"description": "Shared dependencies and files for core plugins",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"tslib": "2.8.1"
},

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "AGPL-3.0-only",
"name": "@grafana/prometheus",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana Prometheus Library",
"keywords": [
"typescript"
@@ -38,12 +38,12 @@
"dependencies": {
"@emotion/css": "11.13.5",
"@floating-ui/react": "0.27.7",
"@grafana/data": "12.0.2",
"@grafana/e2e-selectors": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"@hello-pangea/dnd": "17.0.0",
"@leeoniya/ufuzzy": "1.0.18",
"@lezer/common": "1.2.3",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/runtime",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana Runtime Library",
"keywords": [
"grafana",
@@ -53,11 +53,11 @@
"postpack": "mv package.json.bak package.json && rimraf ./unstable"
},
"dependencies": {
"@grafana/data": "12.0.2",
"@grafana/e2e-selectors": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/faro-web-sdk": "^1.13.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"@types/systemjs": "6.15.1",
"history": "4.10.1",
"lodash": "4.17.21",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/schema",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana Schema Library",
"keywords": [
"typescript"

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
limit: number;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip, common.OptionsWithTextFormatting {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.OptionsWithLegend, common.SingleStatBaseOptions {
displayMode: common.BarGaugeDisplayMode;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export enum VizDisplayMode {
Candles = 'candles',

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export enum HorizontalConstraint {
Center = 'center',

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface MetricStat {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
selectedSeries: number;

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export type UpdateConfig = {
render: boolean,

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export type BucketAggregation = (DateHistogram | Histogram | Terms | Filters | GeoHashGrid | Nested);

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.SingleStatBaseOptions {
minVizHeight: number;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
basemap: ui.MapLayerOptions;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
/**
* Controls the color mode of the heatmap

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
dedupStrategy: common.LogsDedupStrategy;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
dedupStrategy: common.LogsDedupStrategy;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export enum QueryEditorMode {
Builder = 'builder',

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface ArcOption {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
/**
* Select the pie chart display style.

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.SingleStatBaseOptions {
colorMode: common.BigValueColorMode;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export enum TextMode {
Code = 'code',

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export interface Options extends common.OptionsWithTimezones {
legend: common.VizLegendOptions;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
/**
* Identical to timeseries... except it does not have timezone settings

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "12.0.2";
export const pluginVersion = "12.0.3";
export enum PointShape {
Circle = 'circle',

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "@grafana/sql",
"version": "12.0.2",
"version": "12.0.3",
"repository": {
"type": "git",
"url": "http://github.com/grafana/grafana.git",
@@ -15,11 +15,11 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/e2e-selectors": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/ui": "12.0.3",
"@react-awesome-query-builder/ui": "6.6.14",
"immutable": "5.0.3",
"lodash": "4.17.21",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/ui",
"version": "12.0.2",
"version": "12.0.3",
"description": "Grafana Components Library",
"keywords": [
"grafana",
@@ -66,10 +66,10 @@
"@emotion/react": "11.14.0",
"@emotion/serialize": "1.3.3",
"@floating-ui/react": "0.27.7",
"@grafana/data": "12.0.2",
"@grafana/e2e-selectors": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/faro-web-sdk": "^1.13.2",
"@grafana/schema": "12.0.2",
"@grafana/schema": "12.0.3",
"@hello-pangea/dnd": "17.0.0",
"@leeoniya/ufuzzy": "1.0.18",
"@monaco-editor/react": "4.6.0",

View File

@@ -7,6 +7,8 @@ import (
"fmt"
"net/http"
"net/url"
"path"
"regexp"
"strings"
"github.com/grafana/grafana/pkg/api/response"
@@ -39,6 +41,9 @@ var getViewIndex = func() string {
return viewIndex
}
// Only allow redirects that start with an alphanumerical character, a dash or an underscore.
var redirectRe = regexp.MustCompile(`^/[a-zA-Z0-9-_].*`)
var (
errAbsoluteRedirectTo = errors.New("absolute URLs are not allowed for redirect_to cookie value")
errInvalidRedirectTo = errors.New("invalid redirect_to cookie value")
@@ -68,6 +73,15 @@ func (hs *HTTPServer) ValidateRedirectTo(redirectTo string) error {
return errForbiddenRedirectTo
}
cleanPath := path.Clean(to.Path)
// "." is what path.Clean returns for empty paths
if cleanPath == "." {
return errForbiddenRedirectTo
}
if to.Path != "/" && !redirectRe.MatchString(cleanPath) {
return errForbiddenRedirectTo
}
// when using a subUrl, the redirect_to should start with the subUrl (which contains the leading slash), otherwise the redirect
// will send the user to the wrong location
if hs.Cfg.AppSubURL != "" && !strings.HasPrefix(to.Path, hs.Cfg.AppSubURL+"/") {

View File

@@ -14,20 +14,16 @@ import (
"github.com/grafana/grafana/pkg/services/authn/authntest"
"github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web/webtest"
)
func setClientWithoutRedirectFollow(t *testing.T) {
func setClientWithoutRedirectFollow(t *testing.T, s *webtest.Server) {
t.Helper()
old := http.DefaultClient
http.DefaultClient = &http.Client{
s.HttpClient = &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
t.Cleanup(func() {
http.DefaultClient = old
})
}
func TestOAuthLogin_Redirect(t *testing.T) {
@@ -79,7 +75,7 @@ func TestOAuthLogin_Redirect(t *testing.T) {
})
// we need to prevent the http.Client from following redirects
setClientWithoutRedirectFollow(t)
setClientWithoutRedirectFollow(t, server)
res, err := server.Send(server.NewGetRequest("/login/generic_oauth"))
require.NoError(t, err)
@@ -155,7 +151,7 @@ func TestOAuthLogin_AuthorizationCode(t *testing.T) {
})
// we need to prevent the http.Client from following redirects
setClientWithoutRedirectFollow(t)
setClientWithoutRedirectFollow(t, server)
res, err := server.Send(server.NewGetRequest("/login/generic_oauth?code=code"))
require.NoError(t, err)
@@ -199,7 +195,7 @@ func TestOAuthLogin_Error(t *testing.T) {
hs.SecretsService = fakes.NewFakeSecretsService()
})
setClientWithoutRedirectFollow(t)
setClientWithoutRedirectFollow(t, server)
res, err := server.Send(server.NewGetRequest("/login/azuread?error=someerror"))
require.NoError(t, err)

View File

@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"net/http"
"net/url"
"testing"
"time"
@@ -20,6 +21,7 @@ import (
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/usertest"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web/webtest"
)
func TestUserTokenAPIEndpoint(t *testing.T) {
@@ -150,6 +152,95 @@ func TestUserTokenAPIEndpoint(t *testing.T) {
})
}
func TestHTTPServer_RotateUserAuthTokenRedirect(t *testing.T) {
redirectTestCases := []struct {
name string
redirectUrl string
expectedUrl string
}{
// Valid redirects should be preserved
{"valid root path", "/", "/"},
{"valid simple path", "/hello", "/hello"},
{"valid single char path", "/a", "/a"},
{"valid nested path", "/asd/hello", "/asd/hello"},
// Invalid redirects should be converted to root
{"backslash domain", `/\grafana.com`, "/"},
{"traversal backslash domain", `/a/../\grafana.com`, "/"},
{"double slash", "//grafana", "/"},
{"missing initial slash", "missingInitialSlash", "/"},
{"parent directory", "/../", "/"},
}
sessionTestCases := []struct {
name string
useSessionStorageRedirect bool
}{
{"when useSessionStorageRedirect is enabled", true},
{"when useSessionStorageRedirect is disabled", false},
}
for _, sessionCase := range sessionTestCases {
t.Run(sessionCase.name, func(t *testing.T) {
for _, redirectCase := range redirectTestCases {
t.Run(redirectCase.name, func(t *testing.T) {
server := SetupAPITestServer(t, func(hs *HTTPServer) {
cfg := setting.NewCfg()
cfg.LoginCookieName = "grafana_session"
cfg.LoginMaxLifetime = 10 * time.Hour
hs.Cfg = cfg
hs.log = log.New()
hs.AuthTokenService = &authtest.FakeUserAuthTokenService{
RotateTokenProvider: func(ctx context.Context, cmd auth.RotateCommand) (*auth.UserToken, error) {
return &auth.UserToken{UnhashedToken: "new"}, nil
},
}
})
redirectToQuery := url.QueryEscape(redirectCase.redirectUrl)
urlString := "/user/auth-tokens/rotate"
if sessionCase.useSessionStorageRedirect {
urlString = urlString + "?redirectTo=" + redirectToQuery
}
req := server.NewGetRequest(urlString)
req.AddCookie(&http.Cookie{Name: "grafana_session", Value: "123", Path: "/"})
if sessionCase.useSessionStorageRedirect {
req = webtest.RequestWithWebContext(req, &contextmodel.ReqContext{UseSessionStorageRedirect: true})
} else {
req.AddCookie(&http.Cookie{Name: "redirect_to", Value: redirectToQuery, Path: "/"})
}
var redirectStatusCode int
var redirectLocation string
server.HttpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error {
if len(via) > 1 {
// Stop after first redirect
return http.ErrUseLastResponse
}
if req.Response == nil {
return nil
}
redirectStatusCode = req.Response.StatusCode
redirectLocation = req.Response.Header.Get("Location")
return nil
}
res, err := server.Send(req)
require.NoError(t, err)
assert.Equal(t, 302, redirectStatusCode)
assert.Equal(t, redirectCase.expectedUrl, redirectLocation)
require.NoError(t, res.Body.Close())
})
}
})
}
}
func TestHTTPServer_RotateUserAuthToken(t *testing.T) {
type testCase struct {
desc string

View File

@@ -3,6 +3,8 @@ package middleware
import (
"fmt"
"net/http"
"path"
"regexp"
"strconv"
"github.com/grafana/grafana/pkg/services/contexthandler"
@@ -11,6 +13,9 @@ import (
"github.com/grafana/grafana/pkg/web"
)
// Only allow redirects that start with an alphanumerical character, a dash or an underscore.
var redirectRe = regexp.MustCompile(`^/?[a-zA-Z0-9-_].*`)
// OrgRedirect changes org and redirects users if the
// querystring `orgId` doesn't match the active org.
func OrgRedirect(cfg *setting.Cfg, userSvc user.Service) web.Handler {
@@ -31,6 +36,11 @@ func OrgRedirect(cfg *setting.Cfg, userSvc user.Service) web.Handler {
return
}
if !validRedirectPath(c.Req.URL.Path) {
// Do not switch orgs or perform the redirect because the new path is not valid
return
}
if err := userSvc.Update(ctx.Req.Context(), &user.UpdateUserCommand{UserID: ctx.UserID, OrgID: &orgId}); err != nil {
if ctx.IsApiRequest() {
ctx.JsonApiErr(404, "Not found", nil)
@@ -54,3 +64,8 @@ func OrgRedirect(cfg *setting.Cfg, userSvc user.Service) web.Handler {
c.Redirect(newURL, 302)
}
}
func validRedirectPath(p string) bool {
cleanPath := path.Clean(p)
return cleanPath == "." || cleanPath == "/" || redirectRe.MatchString(cleanPath)
}

View File

@@ -2,6 +2,7 @@ package middleware
import (
"fmt"
"net/url"
"testing"
"github.com/stretchr/testify/require"
@@ -23,6 +24,12 @@ func TestOrgRedirectMiddleware(t *testing.T) {
expStatus: 302,
expLocation: "/?orgId=3",
},
{
desc: "when setting a correct org for the user with an empty path",
input: "?orgId=3",
expStatus: 302,
expLocation: "/?orgId=3",
},
{
desc: "when setting a correct org for the user with '&kiosk'",
input: "/?orgId=3&kiosk",
@@ -64,6 +71,16 @@ func TestOrgRedirectMiddleware(t *testing.T) {
require.Equal(t, 404, sc.resp.Code)
})
middlewareScenario(t, "when redirecting to an invalid path", func(t *testing.T, sc *scenarioContext) {
sc.withIdentity(&authn.Identity{})
path := url.QueryEscape(`/\example.com`)
sc.m.Get(url.QueryEscape(path), sc.defaultHandler)
sc.fakeReq("GET", fmt.Sprintf("%s?orgId=3", path)).exec()
require.Equal(t, 404, sc.resp.Code)
})
middlewareScenario(t, "works correctly when grafana is served under a subpath", func(t *testing.T, sc *scenarioContext) {
sc.withIdentity(&authn.Identity{})

View File

@@ -387,6 +387,10 @@ func (am *alertmanager) AppURL() string {
// buildReceiverIntegrations builds a list of integration notifiers off of a receiver config.
func (am *alertmanager) buildReceiverIntegrations(receiver *alertingNotify.APIReceiver, tmpl *alertingTemplates.Template) ([]*alertingNotify.Integration, error) {
err := patchNewSecureFields(context.Background(), receiver, alertingNotify.DecodeSecretsFromBase64, am.decryptFn)
if err != nil {
return nil, err
}
receiverCfg, err := alertingNotify.BuildReceiverConfiguration(context.Background(), receiver, alertingNotify.DecodeSecretsFromBase64, am.decryptFn)
if err != nil {
return nil, err
@@ -414,6 +418,50 @@ func (am *alertmanager) buildReceiverIntegrations(receiver *alertingNotify.APIRe
return integrations, nil
}
func patchNewSecureFields(ctx context.Context, api *alertingNotify.APIReceiver, decode alertingNotify.DecodeSecretsFn, decrypt alertingNotify.GetDecryptedValueFn) error {
for _, integration := range api.Integrations {
switch integration.Type {
case "dingding":
err := patchSettingsFromSecureSettings(ctx, integration, "url", decode, decrypt)
if err != nil {
return err
}
}
}
return nil
}
func patchSettingsFromSecureSettings(ctx context.Context, integration *alertingNotify.GrafanaIntegrationConfig, key string, decode alertingNotify.DecodeSecretsFn, decrypt alertingNotify.GetDecryptedValueFn) error {
if _, ok := integration.SecureSettings[key]; !ok {
return nil
}
decoded, err := decode(integration.SecureSettings)
if err != nil {
return err
}
settings := map[string]any{}
err = json.Unmarshal(integration.Settings, &settings)
if err != nil {
return err
}
currentValue, ok := settings[key]
currentString := ""
if ok {
currentString, _ = currentValue.(string)
}
secretValue := decrypt(ctx, decoded, key, currentString)
if secretValue == currentString {
return nil
}
settings[key] = secretValue
data, err := json.Marshal(settings)
if err != nil {
return err
}
integration.Settings = data
return nil
}
// PutAlerts receives the alerts and then sends them through the corresponding route based on whenever the alert has a receiver embedded or not
func (am *alertmanager) PutAlerts(_ context.Context, postableAlerts apimodels.PostableAlerts) error {
alerts := make(alertingNotify.PostableAlerts, 0, len(postableAlerts.PostableAlerts))

View File

@@ -127,6 +127,7 @@ func GetAvailableNotifiers() []*NotifierPlugin {
Placeholder: "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxx",
PropertyName: "url",
Required: true,
Secure: true,
},
{
Label: "Message Type",

View File

@@ -11,7 +11,7 @@ func TestGetSecretKeysForContactPointType(t *testing.T) {
receiverType string
expectedSecretFields []string
}{
{receiverType: "dingding", expectedSecretFields: []string{}},
{receiverType: "dingding", expectedSecretFields: []string{"url"}},
{receiverType: "kafka", expectedSecretFields: []string{"password"}},
{receiverType: "email", expectedSecretFields: []string{}},
{receiverType: "pagerduty", expectedSecretFields: []string{"integrationKey"}},

View File

@@ -24,12 +24,17 @@ func (am *alertmanager) TestReceivers(ctx context.Context, c apimodels.TestRecei
SecureSettings: gr.SecureSettings,
})
}
receivers = append(receivers, &alertingNotify.APIReceiver{
recv := &alertingNotify.APIReceiver{
ConfigReceiver: r.Receiver,
GrafanaIntegrations: alertingNotify.GrafanaIntegrations{
Integrations: integrations,
},
})
}
err := patchNewSecureFields(ctx, recv, alertingNotify.DecodeSecretsFromBase64, am.decryptFn)
if err != nil {
return nil, 0, err
}
receivers = append(receivers, recv)
}
a := &alertingNotify.PostableAlert{}
if c.Alert != nil {

View File

@@ -2088,10 +2088,8 @@ var expAlertmanagerConfigFromAPI = `
"name": "dingding_test",
"type": "dingding",
"disableResolveMessage": false,
"settings": {
"url": "http://CHANNEL_ADDR/dingding_recv/dingding_test"
},
"secureFields": {}
"settings": {},
"secureFields": {"url": true}
}
]
},

View File

@@ -24,6 +24,7 @@ type Server struct {
Mux *web.Mux
RouteRegister routing.RouteRegister
TestServer *httptest.Server
HttpClient *http.Client
}
// NewServer starts and returns a new server.
@@ -50,6 +51,7 @@ func NewServer(t testing.TB, routeRegister routing.RouteRegister) *Server {
RouteRegister: routeRegister,
Mux: m,
TestServer: testServer,
HttpClient: &http.Client{},
}
}
@@ -81,7 +83,7 @@ func (s *Server) NewRequest(method string, target string, body io.Reader) *http.
// Send sends a HTTP request to the test server and returns an HTTP response.
func (s *Server) Send(req *http.Request) (*http.Response, error) {
return http.DefaultClient.Do(req)
return s.HttpClient.Do(req)
}
// SendJSON sets the Content-Type header to application/json and sends
@@ -144,6 +146,7 @@ func requestContextMiddleware() web.Middleware {
c.RequestNonce = ctx.RequestNonce
c.PerfmonTimer = ctx.PerfmonTimer
c.LookupTokenErr = ctx.LookupTokenErr
c.UseSessionStorageRedirect = ctx.UseSessionStorageRedirect
}
next.ServeHTTP(w, r)

View File

@@ -2,14 +2,14 @@
"name": "@grafana-plugins/grafana-azure-monitor-datasource",
"description": "Grafana data source for Azure Monitor",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"@kusto/monaco-kusto": "^10.0.0",
"fast-deep-equal": "^3.1.3",
"i18next": "^24.0.0",
@@ -25,8 +25,8 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",

View File

@@ -2,15 +2,15 @@
"name": "@grafana-plugins/stackdriver",
"description": "Grafana data source for Google Cloud Monitoring",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/google-sdk": "0.1.2",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"debounce-promise": "3.1.2",
"fast-deep-equal": "^3.1.3",
"i18next": "^24.0.0",
@@ -26,8 +26,8 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/grafana-postgresql-datasource",
"description": "PostgreSQL data source plugin",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/sql": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/sql": "12.0.3",
"@grafana/ui": "12.0.3",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",

View File

@@ -2,13 +2,13 @@
"name": "@grafana-plugins/grafana-pyroscope-datasource",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"fast-deep-equal": "^3.1.3",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
@@ -20,7 +20,7 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/plugin-configs": "12.0.2",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",

View File

@@ -2,13 +2,13 @@
"name": "@grafana-plugins/grafana-testdata-datasource",
"description": "Generates test data in different forms",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"d3-random": "^3.0.1",
"lodash": "4.17.21",
"micro-memoize": "^4.1.2",
@@ -21,8 +21,8 @@
"uuid": "11.0.5"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/jaeger",
"description": "Jaeger plugin for Grafana",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mssql",
"description": "MSSQL data source plugin",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/sql": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/sql": "12.0.3",
"@grafana/ui": "12.0.3",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mysql",
"description": "MySQL data source plugin",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/plugin-ui": "0.10.5",
"@grafana/runtime": "12.0.2",
"@grafana/sql": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/runtime": "12.0.3",
"@grafana/sql": "12.0.3",
"@grafana/ui": "12.0.3",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "12.0.2",
"@grafana/plugin-configs": "12.0.2",
"@grafana/e2e-selectors": "12.0.3",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",

View File

@@ -2,13 +2,13 @@
"name": "@grafana-plugins/parca",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "12.0.2",
"@grafana/runtime": "12.0.2",
"@grafana/schema": "12.0.2",
"@grafana/ui": "12.0.2",
"@grafana/data": "12.0.3",
"@grafana/runtime": "12.0.3",
"@grafana/schema": "12.0.3",
"@grafana/ui": "12.0.3",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
"react": "18.3.1",
@@ -18,7 +18,7 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/plugin-configs": "12.0.2",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/tempo",
"description": "Grafana plugin for the Tempo data source.",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",
@@ -39,7 +39,7 @@
"uuid": "11.0.5"
},
"devDependencies": {
"@grafana/plugin-configs": "12.0.2",
"@grafana/plugin-configs": "12.0.3",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/zipkin",
"description": "Zipkin plugin for Grafana",
"private": true,
"version": "12.0.2",
"version": "12.0.3",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",

156
yarn.lock
View File

@@ -2476,13 +2476,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-azure-monitor-datasource@workspace:public/app/plugins/datasource/azuremonitor"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@kusto/monaco-kusto": "npm:^10.0.0"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
@@ -2520,13 +2520,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-postgresql-datasource@workspace:public/app/plugins/datasource/grafana-postgresql-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/sql": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/sql": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2551,11 +2551,11 @@ __metadata:
resolution: "@grafana-plugins/grafana-pyroscope-datasource@workspace:public/app/plugins/datasource/grafana-pyroscope-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
"@testing-library/react": "npm:16.2.0"
@@ -2591,12 +2591,12 @@ __metadata:
resolution: "@grafana-plugins/grafana-testdata-datasource@workspace:public/app/plugins/datasource/grafana-testdata-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2672,13 +2672,13 @@ __metadata:
resolution: "@grafana-plugins/mssql@workspace:public/app/plugins/datasource/mssql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/sql": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/sql": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2703,13 +2703,13 @@ __metadata:
resolution: "@grafana-plugins/mysql@workspace:public/app/plugins/datasource/mysql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/sql": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/sql": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2734,11 +2734,11 @@ __metadata:
resolution: "@grafana-plugins/parca@workspace:public/app/plugins/datasource/parca"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2766,14 +2766,14 @@ __metadata:
resolution: "@grafana-plugins/stackdriver@workspace:public/app/plugins/datasource/cloud-monitoring"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/google-sdk": "npm:0.1.2"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/ui": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
"@testing-library/react": "npm:16.2.0"
@@ -2818,7 +2818,7 @@ __metadata:
"@grafana/lezer-traceql": "npm:0.0.21"
"@grafana/monaco-logql": "npm:^0.0.8"
"@grafana/o11y-ds-frontend": "workspace:*"
"@grafana/plugin-configs": "npm:12.0.2"
"@grafana/plugin-configs": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "workspace:*"
"@grafana/schema": "workspace:*"
@@ -2931,12 +2931,12 @@ __metadata:
languageName: node
linkType: hard
"@grafana/data@npm:12.0.2, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
"@grafana/data@npm:12.0.3, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
version: 0.0.0-use.local
resolution: "@grafana/data@workspace:packages/grafana-data"
dependencies:
"@braintree/sanitize-url": "npm:7.0.1"
"@grafana/schema": "npm:12.0.2"
"@grafana/schema": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@types/d3-interpolate": "npm:^3.0.0"
@@ -2984,7 +2984,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/e2e-selectors@npm:12.0.2, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
"@grafana/e2e-selectors@npm:12.0.3, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
version: 0.0.0-use.local
resolution: "@grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors"
dependencies:
@@ -3087,9 +3087,9 @@ __metadata:
"@babel/preset-env": "npm:7.26.9"
"@babel/preset-react": "npm:7.26.3"
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.0.2"
"@grafana/ui": "npm:12.0.3"
"@leeoniya/ufuzzy": "npm:1.0.18"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@testing-library/dom": "npm:10.4.0"
@@ -3196,13 +3196,13 @@ __metadata:
resolution: "@grafana/o11y-ds-frontend@workspace:packages/grafana-o11y-ds-frontend"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.0.2"
"@grafana/ui": "npm:12.0.3"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:16.2.0"
@@ -3226,7 +3226,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/plugin-configs@npm:12.0.2, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
"@grafana/plugin-configs@npm:12.0.3, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
version: 0.0.0-use.local
resolution: "@grafana/plugin-configs@workspace:packages/grafana-plugin-configs"
dependencies:
@@ -3326,13 +3326,13 @@ __metadata:
dependencies:
"@emotion/css": "npm:11.13.5"
"@floating-ui/react": "npm:0.27.7"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/schema": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.0.2"
"@grafana/ui": "npm:12.0.3"
"@hello-pangea/dnd": "npm:17.0.0"
"@leeoniya/ufuzzy": "npm:1.0.18"
"@lezer/common": "npm:1.2.3"
@@ -3388,16 +3388,16 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/runtime@npm:12.0.2, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
"@grafana/runtime@npm:12.0.3, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
version: 0.0.0-use.local
resolution: "@grafana/runtime@workspace:packages/grafana-runtime"
dependencies:
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/faro-web-sdk": "npm:^1.13.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/schema": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.0.2"
"@grafana/ui": "npm:12.0.3"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@rollup/plugin-terser": "npm:0.4.4"
"@testing-library/dom": "npm:10.4.0"
@@ -3510,7 +3510,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/schema@npm:12.0.2, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
"@grafana/schema@npm:12.0.3, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
version: 0.0.0-use.local
resolution: "@grafana/schema@workspace:packages/grafana-schema"
dependencies:
@@ -3528,17 +3528,17 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/sql@npm:12.0.2, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
"@grafana/sql@npm:12.0.3, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
version: 0.0.0-use.local
resolution: "@grafana/sql@workspace:packages/grafana-sql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/plugin-ui": "npm:0.10.5"
"@grafana/runtime": "npm:12.0.2"
"@grafana/runtime": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.0.2"
"@grafana/ui": "npm:12.0.3"
"@react-awesome-query-builder/ui": "npm:6.6.14"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:^6.1.2"
@@ -3579,7 +3579,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/ui@npm:12.0.2, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
"@grafana/ui@npm:12.0.3, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
version: 0.0.0-use.local
resolution: "@grafana/ui@workspace:packages/grafana-ui"
dependencies:
@@ -3589,10 +3589,10 @@ __metadata:
"@emotion/serialize": "npm:1.3.3"
"@faker-js/faker": "npm:^9.0.0"
"@floating-ui/react": "npm:0.27.7"
"@grafana/data": "npm:12.0.2"
"@grafana/e2e-selectors": "npm:12.0.2"
"@grafana/data": "npm:12.0.3"
"@grafana/e2e-selectors": "npm:12.0.3"
"@grafana/faro-web-sdk": "npm:^1.13.2"
"@grafana/schema": "npm:12.0.2"
"@grafana/schema": "npm:12.0.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@hello-pangea/dnd": "npm:17.0.0"
"@leeoniya/ufuzzy": "npm:1.0.18"