|
|
|
@ -18,6 +18,7 @@ import ( |
|
|
|
|
"github.com/grafana/grafana/pkg/services/oauthtoken" |
|
|
|
|
"github.com/grafana/grafana/pkg/services/secrets" |
|
|
|
|
"github.com/grafana/grafana/pkg/setting" |
|
|
|
|
"github.com/grafana/grafana/pkg/util" |
|
|
|
|
"github.com/grafana/grafana/pkg/web" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -59,24 +60,47 @@ func (p *DataSourceProxyService) ProxyDataSourceRequest(c *models.ReqContext) { |
|
|
|
|
p.ProxyDatasourceRequestWithID(c, id) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (p *DataSourceProxyService) ProxyDatasourceRequestWithUID(c *models.ReqContext) { |
|
|
|
|
c.TimeRequest(metrics.MDataSourceProxyReqTimer) |
|
|
|
|
|
|
|
|
|
dsUID := web.Params(c.Req)[":uid"] |
|
|
|
|
if !util.IsValidShortUID(dsUID) { |
|
|
|
|
c.JsonApiErr(http.StatusBadRequest, "UID is invalid", nil) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ds, err := p.DataSourceCache.GetDatasourceByUID(c.Req.Context(), dsUID, c.SignedInUser, c.SkipCache) |
|
|
|
|
if err != nil { |
|
|
|
|
toAPIError(c, err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
p.proxyDatasourceRequest(c, ds) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (p *DataSourceProxyService) ProxyDatasourceRequestWithID(c *models.ReqContext, dsID int64) { |
|
|
|
|
c.TimeRequest(metrics.MDataSourceProxyReqTimer) |
|
|
|
|
|
|
|
|
|
ds, err := p.DataSourceCache.GetDatasource(c.Req.Context(), dsID, c.SignedInUser, c.SkipCache) |
|
|
|
|
if err != nil { |
|
|
|
|
if errors.Is(err, models.ErrDataSourceAccessDenied) { |
|
|
|
|
c.JsonApiErr(http.StatusForbidden, "Access denied to datasource", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
if errors.Is(err, models.ErrDataSourceNotFound) { |
|
|
|
|
c.JsonApiErr(http.StatusNotFound, "Unable to find datasource", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
c.JsonApiErr(http.StatusInternalServerError, "Unable to load datasource meta data", err) |
|
|
|
|
toAPIError(c, err) |
|
|
|
|
} |
|
|
|
|
p.proxyDatasourceRequest(c, ds) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func toAPIError(c *models.ReqContext, err error) { |
|
|
|
|
if errors.Is(err, models.ErrDataSourceAccessDenied) { |
|
|
|
|
c.JsonApiErr(http.StatusForbidden, "Access denied to datasource", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
if errors.Is(err, models.ErrDataSourceNotFound) { |
|
|
|
|
c.JsonApiErr(http.StatusNotFound, "Unable to find datasource", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
c.JsonApiErr(http.StatusInternalServerError, "Unable to load datasource meta data", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = p.PluginRequestValidator.Validate(ds.Url, c.Req) |
|
|
|
|
func (p *DataSourceProxyService) proxyDatasourceRequest(c *models.ReqContext, ds *models.DataSource) { |
|
|
|
|
err := p.PluginRequestValidator.Validate(ds.Url, c.Req) |
|
|
|
|
if err != nil { |
|
|
|
|
c.JsonApiErr(http.StatusForbidden, "Access denied", err) |
|
|
|
|
return |
|
|
|
@ -103,7 +127,7 @@ func (p *DataSourceProxyService) ProxyDatasourceRequestWithID(c *models.ReqConte |
|
|
|
|
proxy.HandleRequest() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var proxyPathRegexp = regexp.MustCompile(`^\/api\/datasources\/proxy\/[\d]+\/?`) |
|
|
|
|
var proxyPathRegexp = regexp.MustCompile(`^\/api\/datasources\/proxy\/([\d]+|uid\/[\w]+)\/?`) |
|
|
|
|
|
|
|
|
|
func extractProxyPath(originalRawPath string) string { |
|
|
|
|
return proxyPathRegexp.ReplaceAllString(originalRawPath, "") |
|
|
|
|