// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package uiserver import ( "encoding/json" "github.com/hashicorp/consul/agent/config" ) // uiTemplateDataFromConfig returns the base 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, "hcp_enabled": cfg.UIConfig.HCPEnabled, } // 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) } v2CatalogEnabled := false for _, experiment := range cfg.Experiments { if experiment == "resource-apis" { v2CatalogEnabled = true break } } d := map[string]interface{}{ "ContentPath": cfg.UIConfig.ContentPath, "ACLsEnabled": cfg.ACLsEnabled, "HCPEnabled": cfg.UIConfig.HCPEnabled, "UIConfig": uiCfg, "LocalDatacenter": cfg.Datacenter, "PrimaryDatacenter": cfg.PrimaryDatacenter, "PeeringEnabled": cfg.PeeringEnabled, "V2CatalogEnabled": v2CatalogEnabled, } // 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, nil }