github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/config/selfreg_config.go (about)

     1  package config
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/pkg/oauth"
     7  	"github.com/pkg/errors"
     8  	"github.com/tidwall/gjson"
     9  )
    10  
    11  // SelfRegConfig is configuration for the runtime self-registration flow
    12  type SelfRegConfig struct {
    13  	SelfRegisterDistinguishLabelKey string `envconfig:"APP_SELF_REGISTER_DISTINGUISH_LABEL_KEY"`
    14  	SelfRegisterLabelKey            string `envconfig:"APP_SELF_REGISTER_LABEL_KEY,optional"`
    15  	SelfRegisterLabelValuePrefix    string `envconfig:"APP_SELF_REGISTER_LABEL_VALUE_PREFIX,optional"`
    16  	SelfRegisterResponseKey         string `envconfig:"APP_SELF_REGISTER_RESPONSE_KEY,optional"`
    17  	SaaSAppNameLabelKey             string `envconfig:"APP_SELF_REGISTER_SAAS_APP_LABEL_KEY,optional"`
    18  	SelfRegisterPath                string `envconfig:"APP_SELF_REGISTER_PATH,optional"`
    19  	SelfRegisterNameQueryParam      string `envconfig:"APP_SELF_REGISTER_NAME_QUERY_PARAM,optional"`
    20  	SelfRegisterTenantQueryParam    string `envconfig:"APP_SELF_REGISTER_TENANT_QUERY_PARAM,optional"`
    21  	SelfRegisterRequestBodyPattern  string `envconfig:"APP_SELF_REGISTER_REQUEST_BODY_PATTERN,optional"`
    22  	SelfRegisterSecretPath          string `envconfig:"APP_SELF_REGISTER_SECRET_PATH"`
    23  	SelfRegSaaSAppSecretPath        string `envconfig:"APP_SELF_REGISTER_SAAS_APP_SECRET_PATH"`
    24  
    25  	OAuthMode      oauth.AuthMode `envconfig:"APP_SELF_REGISTER_OAUTH_MODE,default=oauth-mtls"`
    26  	OauthTokenPath string         `envconfig:"APP_SELF_REGISTER_OAUTH_TOKEN_PATH,optional"`
    27  
    28  	SkipSSLValidation bool `envconfig:"APP_SELF_REGISTER_SKIP_SSL_VALIDATION,default=false"`
    29  
    30  	ClientTimeout time.Duration `envconfig:"default=30s"`
    31  
    32  	InstanceClientIDPath     string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_CLIENT_ID_PATH"`
    33  	InstanceClientSecretPath string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_CLIENT_SECRET_PATH"`
    34  	InstanceURLPath          string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_URL_PATH"`
    35  	InstanceTokenURLPath     string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_TOKEN_URL_PATH"`
    36  	InstanceCertPath         string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_X509_CERT_PATH"`
    37  	InstanceKeyPath          string                    `envconfig:"APP_SELF_REGISTER_INSTANCE_X509_KEY_PATH"`
    38  	RegionToInstanceConfig   map[string]InstanceConfig `envconfig:"-"`
    39  
    40  	SaaSAppNamePath     string            `envconfig:"APP_SELF_REGISTER_SAAS_APP_NAME_PATH"`
    41  	RegionToSaaSAppName map[string]string `envconfig:"-"`
    42  
    43  	ExternalClientCertSecretName string `envconfig:"APP_EXTERNAL_CLIENT_CERT_SECRET_NAME"`
    44  }
    45  
    46  // PrepareConfiguration take cares to build the self register configuration
    47  func (c *SelfRegConfig) PrepareConfiguration() error {
    48  	if err := c.MapInstanceConfigs(); err != nil {
    49  		return errors.Wrap(err, "while building region instances credentials")
    50  	}
    51  
    52  	if err := c.MapSaasAppNameToRegion(); err != nil {
    53  		return errors.Wrap(err, "while building SaaS application names map")
    54  	}
    55  
    56  	return nil
    57  }
    58  
    59  // MapInstanceConfigs parses the InstanceConfigs json string to map with key: region name and value: InstanceConfig for the instance in the region
    60  func (c *SelfRegConfig) MapInstanceConfigs() error {
    61  	secretData, err := ReadConfigFile(c.SelfRegisterSecretPath)
    62  	if err != nil {
    63  		return errors.Wrapf(err, "while getting destinations secret")
    64  	}
    65  
    66  	bindingsMap, err := ParseConfigToJSONMap(secretData)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	c.RegionToInstanceConfig = make(map[string]InstanceConfig)
    71  	for region, config := range bindingsMap {
    72  		i := InstanceConfig{
    73  			ClientID:     gjson.Get(config.String(), c.InstanceClientIDPath).String(),
    74  			ClientSecret: gjson.Get(config.String(), c.InstanceClientSecretPath).String(),
    75  			URL:          gjson.Get(config.String(), c.InstanceURLPath).String(),
    76  			TokenURL:     gjson.Get(config.String(), c.InstanceTokenURLPath).String(),
    77  			Cert:         gjson.Get(config.String(), c.InstanceCertPath).String(),
    78  			Key:          gjson.Get(config.String(), c.InstanceKeyPath).String(),
    79  		}
    80  
    81  		if err := i.validate(c.OAuthMode); err != nil {
    82  			c.RegionToInstanceConfig = nil
    83  			return errors.Wrapf(err, "while validating instance for region: %q", region)
    84  		}
    85  
    86  		c.RegionToInstanceConfig[region] = i
    87  	}
    88  
    89  	return nil
    90  }
    91  
    92  // MapSaasAppNameToRegion parses json configuration to a map with key: region and value SaaS application name
    93  func (c *SelfRegConfig) MapSaasAppNameToRegion() error {
    94  	secretData, err := ReadConfigFile(c.SelfRegSaaSAppSecretPath)
    95  	if err != nil {
    96  		return errors.Wrapf(err, "while getting SaaS application names secret")
    97  	}
    98  
    99  	m, err := ParseConfigToJSONMap(secretData)
   100  	if err != nil {
   101  		return err
   102  	}
   103  
   104  	c.RegionToSaaSAppName = make(map[string]string, len(m))
   105  	for r, config := range m {
   106  		appName := gjson.Get(config.String(), c.SaaSAppNamePath).String()
   107  		c.RegionToSaaSAppName[r] = appName
   108  	}
   109  
   110  	return nil
   111  }