github.com/argoproj/argo-cd/v2@v2.10.9/server/settings/settings.go (about) 1 package settings 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/golang/protobuf/ptypes/empty" 8 "sigs.k8s.io/yaml" 9 10 "github.com/argoproj/argo-cd/v2/reposerver/apiclient" 11 ioutil "github.com/argoproj/argo-cd/v2/util/io" 12 13 sessionmgr "github.com/argoproj/argo-cd/v2/util/session" 14 15 settingspkg "github.com/argoproj/argo-cd/v2/pkg/apiclient/settings" 16 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" 17 "github.com/argoproj/argo-cd/v2/util/settings" 18 ) 19 20 // Server provides a Settings service 21 type Server struct { 22 mgr *settings.SettingsManager 23 repoClient apiclient.Clientset 24 authenticator Authenticator 25 disableAuth bool 26 appsInAnyNamespaceEnabled bool 27 } 28 29 type Authenticator interface { 30 Authenticate(ctx context.Context) (context.Context, error) 31 } 32 33 // NewServer returns a new instance of the Settings service 34 func NewServer(mgr *settings.SettingsManager, repoClient apiclient.Clientset, authenticator Authenticator, disableAuth, appsInAnyNamespaceEnabled bool) *Server { 35 return &Server{mgr: mgr, repoClient: repoClient, authenticator: authenticator, disableAuth: disableAuth, appsInAnyNamespaceEnabled: appsInAnyNamespaceEnabled} 36 } 37 38 // Get returns Argo CD settings 39 func (s *Server) Get(ctx context.Context, q *settingspkg.SettingsQuery) (*settingspkg.Settings, error) { 40 resourceOverrides, err := s.mgr.GetResourceOverrides() 41 if err != nil { 42 return nil, err 43 } 44 overrides := make(map[string]*v1alpha1.ResourceOverride) 45 for k := range resourceOverrides { 46 val := resourceOverrides[k] 47 overrides[k] = &val 48 } 49 appInstanceLabelKey, err := s.mgr.GetAppInstanceLabelKey() 50 if err != nil { 51 return nil, err 52 } 53 argoCDSettings, err := s.mgr.GetSettings() 54 if err != nil { 55 return nil, err 56 } 57 gaSettings, err := s.mgr.GetGoogleAnalytics() 58 if err != nil { 59 return nil, err 60 } 61 help, err := s.mgr.GetHelp() 62 if err != nil { 63 return nil, err 64 } 65 userLoginsDisabled := true 66 accounts, err := s.mgr.GetAccounts() 67 if err != nil { 68 return nil, err 69 } 70 for _, account := range accounts { 71 if account.Enabled && account.HasCapability(settings.AccountCapabilityLogin) { 72 userLoginsDisabled = false 73 break 74 } 75 } 76 77 kustomizeSettings, err := s.mgr.GetKustomizeSettings() 78 if err != nil { 79 return nil, err 80 } 81 var kustomizeVersions []string 82 for i := range kustomizeSettings.Versions { 83 kustomizeVersions = append(kustomizeVersions, kustomizeSettings.Versions[i].Name) 84 } 85 86 trackingMethod, err := s.mgr.GetTrackingMethod() 87 if err != nil { 88 return nil, err 89 } 90 91 set := settingspkg.Settings{ 92 URL: argoCDSettings.URL, 93 AppLabelKey: appInstanceLabelKey, 94 ResourceOverrides: overrides, 95 StatusBadgeEnabled: argoCDSettings.StatusBadgeEnabled, 96 StatusBadgeRootUrl: argoCDSettings.StatusBadgeRootUrl, 97 KustomizeOptions: &v1alpha1.KustomizeOptions{ 98 BuildOptions: argoCDSettings.KustomizeBuildOptions, 99 }, 100 GoogleAnalytics: &settingspkg.GoogleAnalyticsConfig{ 101 TrackingID: gaSettings.TrackingID, 102 AnonymizeUsers: gaSettings.AnonymizeUsers, 103 }, 104 Help: &settingspkg.Help{ 105 ChatUrl: help.ChatURL, 106 ChatText: help.ChatText, 107 BinaryUrls: help.BinaryURLs, 108 }, 109 UserLoginsDisabled: userLoginsDisabled, 110 KustomizeVersions: kustomizeVersions, 111 UiCssURL: argoCDSettings.UiCssURL, 112 PasswordPattern: argoCDSettings.PasswordPattern, 113 TrackingMethod: trackingMethod, 114 ExecEnabled: argoCDSettings.ExecEnabled, 115 AppsInAnyNamespaceEnabled: s.appsInAnyNamespaceEnabled, 116 } 117 118 if sessionmgr.LoggedIn(ctx) || s.disableAuth { 119 set.UiBannerContent = argoCDSettings.UiBannerContent 120 set.UiBannerURL = argoCDSettings.UiBannerURL 121 set.UiBannerPermanent = argoCDSettings.UiBannerPermanent 122 set.UiBannerPosition = argoCDSettings.UiBannerPosition 123 set.ControllerNamespace = s.mgr.GetNamespace() 124 } 125 if argoCDSettings.DexConfig != "" { 126 var cfg settingspkg.DexConfig 127 err = yaml.Unmarshal([]byte(argoCDSettings.DexConfig), &cfg) 128 if err == nil { 129 set.DexConfig = &cfg 130 } 131 } 132 if oidcConfig := argoCDSettings.OIDCConfig(); oidcConfig != nil { 133 set.OIDCConfig = &settingspkg.OIDCConfig{ 134 Name: oidcConfig.Name, 135 Issuer: oidcConfig.Issuer, 136 ClientID: oidcConfig.ClientID, 137 CLIClientID: oidcConfig.CLIClientID, 138 Scopes: oidcConfig.RequestedScopes, 139 EnablePKCEAuthentication: oidcConfig.EnablePKCEAuthentication, 140 } 141 if len(argoCDSettings.OIDCConfig().RequestedIDTokenClaims) > 0 { 142 set.OIDCConfig.IDTokenClaims = argoCDSettings.OIDCConfig().RequestedIDTokenClaims 143 } 144 } 145 return &set, nil 146 } 147 148 // GetPlugins returns a list of plugins 149 func (s *Server) GetPlugins(ctx context.Context, q *settingspkg.SettingsQuery) (*settingspkg.SettingsPluginsResponse, error) { 150 plugins, err := s.plugins(ctx) 151 if err != nil { 152 return nil, err 153 } 154 return &settingspkg.SettingsPluginsResponse{Plugins: plugins}, nil 155 } 156 157 func (s *Server) plugins(ctx context.Context) ([]*settingspkg.Plugin, error) { 158 closer, client, err := s.repoClient.NewRepoServerClient() 159 if err != nil { 160 return nil, fmt.Errorf("error creating repo server client: %w", err) 161 } 162 defer ioutil.Close(closer) 163 164 pluginList, err := client.ListPlugins(ctx, &empty.Empty{}) 165 if err != nil { 166 return nil, fmt.Errorf("failed to list sidecar plugins from reposerver: %w", err) 167 } 168 169 var out []*settingspkg.Plugin 170 if pluginList != nil && len(pluginList.Items) > 0 { 171 for _, p := range pluginList.Items { 172 out = append(out, &settingspkg.Plugin{Name: p.Name}) 173 } 174 } 175 176 return out, nil 177 } 178 179 // AuthFuncOverride disables authentication for settings service 180 func (s *Server) AuthFuncOverride(ctx context.Context, fullMethodName string) (context.Context, error) { 181 ctx, err := s.authenticator.Authenticate(ctx) 182 if fullMethodName == "/cluster.SettingsService/Get" { 183 // SettingsService/Get API is used by login page. 184 // This authenticates the user, but ignores any error, so that we have claims populated 185 err = nil 186 } 187 return ctx, err 188 }