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) if err != nil { return nil, err } // 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)) // Also inject additional provider scripts if needed, otherwise strip the // comment. if len(cfg.UIConfig.MetricsProviderFiles) > 0 { d["ExtraScripts"] = []string{ cfg.UIConfig.ContentPath + compiledProviderJSPath, } } return d, err }