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  }