2020-09-23 11:37:33 +00:00
|
|
|
package uiserver
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"net/url"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/agent/config"
|
|
|
|
)
|
|
|
|
|
|
|
|
// uiTemplateDataFromConfig returns the set of variables that should be injected
|
|
|
|
// into the UI's Env based on the given runtime UI config.
|
|
|
|
func uiTemplateDataFromConfig(cfg *config.RuntimeConfig) (map[string]interface{}, error) {
|
|
|
|
|
|
|
|
uiCfg := map[string]interface{}{
|
|
|
|
"metrics_provider": cfg.UIConfig.MetricsProvider,
|
|
|
|
// We explicitly MUST NOT pass the metrics_proxy object since it might
|
|
|
|
// contain add_headers with secrets that the UI shouldn't know e.g. API
|
|
|
|
// tokens for the backend. The provider should either require the proxy to
|
|
|
|
// be configured and then use that or hit the backend directly from the
|
|
|
|
// browser.
|
|
|
|
"metrics_proxy_enabled": cfg.UIConfig.MetricsProxy.BaseURL != "",
|
|
|
|
"dashboard_url_templates": cfg.UIConfig.DashboardURLTemplates,
|
|
|
|
}
|
|
|
|
|
|
|
|
// Only set this if there is some actual JSON or we'll cause a JSON
|
|
|
|
// marshalling error later during serving which ends up being silent.
|
|
|
|
if cfg.UIConfig.MetricsProviderOptionsJSON != "" {
|
|
|
|
uiCfg["metrics_provider_options"] = json.RawMessage(cfg.UIConfig.MetricsProviderOptionsJSON)
|
|
|
|
}
|
|
|
|
|
|
|
|
d := map[string]interface{}{
|
|
|
|
"ContentPath": cfg.UIConfig.ContentPath,
|
|
|
|
"ACLsEnabled": cfg.ACLsEnabled,
|
|
|
|
}
|
|
|
|
|
|
|
|
err := uiTemplateDataFromConfigEnterprise(cfg, d, uiCfg)
|
2020-10-01 11:26:19 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2020-09-23 11:37:33 +00:00
|
|
|
|
|
|
|
// Render uiCfg down to JSON ready to inject into the template
|
|
|
|
bs, err := json.Marshal(uiCfg)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("failed marshalling UI Env JSON: %s", err)
|
|
|
|
}
|
|
|
|
// Need to also URLEncode it as it is passed through a META tag value. Path
|
|
|
|
// variant is correct to avoid converting spaces to "+". Note we don't just
|
|
|
|
// use html/template because it strips comments and uses a different encoding
|
|
|
|
// for this param than Ember which is OK but just one more weird thing to
|
|
|
|
// account for in the source...
|
|
|
|
d["UIConfigJSON"] = url.PathEscape(string(bs))
|
|
|
|
|
|
|
|
return d, err
|
|
|
|
}
|