github.com/arunkumar7540/cli@v6.45.0+incompatible/util/configv3/json_config.go (about)

     1  package configv3
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/SermoDigital/jose/jws"
     7  )
     8  
     9  // JSONConfig represents .cf/config.json.
    10  type JSONConfig struct {
    11  	ConfigVersion            int                `json:"ConfigVersion"`
    12  	Target                   string             `json:"Target"`
    13  	APIVersion               string             `json:"APIVersion"`
    14  	AuthorizationEndpoint    string             `json:"AuthorizationEndpoint"`
    15  	DopplerEndpoint          string             `json:"DopplerEndPoint"`
    16  	UAAEndpoint              string             `json:"UaaEndpoint"`
    17  	RoutingEndpoint          string             `json:"RoutingAPIEndpoint"`
    18  	AccessToken              string             `json:"AccessToken"`
    19  	SSHOAuthClient           string             `json:"SSHOAuthClient"`
    20  	UAAOAuthClient           string             `json:"UAAOAuthClient"`
    21  	UAAOAuthClientSecret     string             `json:"UAAOAuthClientSecret"`
    22  	UAAGrantType             string             `json:"UAAGrantType"`
    23  	RefreshToken             string             `json:"RefreshToken"`
    24  	TargetedOrganization     Organization       `json:"OrganizationFields"`
    25  	TargetedSpace            Space              `json:"SpaceFields"`
    26  	SkipSSLValidation        bool               `json:"SSLDisabled"`
    27  	AsyncTimeout             int                `json:"AsyncTimeout"`
    28  	Trace                    string             `json:"Trace"`
    29  	ColorEnabled             string             `json:"ColorEnabled"`
    30  	Locale                   string             `json:"Locale"`
    31  	PluginRepositories       []PluginRepository `json:"PluginRepos"`
    32  	MinCLIVersion            string             `json:"MinCLIVersion"`
    33  	MinRecommendedCLIVersion string             `json:"MinRecommendedCLIVersion"`
    34  }
    35  
    36  // Organization contains basic information about the targeted organization.
    37  type Organization struct {
    38  	GUID            string          `json:"GUID"`
    39  	Name            string          `json:"Name"`
    40  	QuotaDefinition QuotaDefinition `json:"QuotaDefinition"`
    41  }
    42  
    43  // QuotaDefinition contains information about the organization's quota.
    44  type QuotaDefinition struct {
    45  	GUID                    string `json:"guid"`
    46  	Name                    string `json:"name"`
    47  	MemoryLimit             int    `json:"memory_limit"`
    48  	InstanceMemoryLimit     int    `json:"instance_memory_limit"`
    49  	TotalRoutes             int    `json:"total_routes"`
    50  	TotalServices           int    `json:"total_services"`
    51  	NonBasicServicesAllowed bool   `json:"non_basic_services_allowed"`
    52  	AppInstanceLimit        int    `json:"app_instance_limit"`
    53  	TotalReservedRoutePorts int    `json:"total_reserved_route_ports"`
    54  }
    55  
    56  // Space contains basic information about the targeted space.
    57  type Space struct {
    58  	GUID     string `json:"GUID"`
    59  	Name     string `json:"Name"`
    60  	AllowSSH bool   `json:"AllowSSH"`
    61  }
    62  
    63  // User represents the user information provided by the JWT access token.
    64  type User struct {
    65  	Name string
    66  }
    67  
    68  // AccessToken returns the access token for making authenticated API calls.
    69  func (config *Config) AccessToken() string {
    70  	return config.ConfigFile.AccessToken
    71  }
    72  
    73  // APIVersion returns the CC API Version.
    74  func (config *Config) APIVersion() string {
    75  	return config.ConfigFile.APIVersion
    76  }
    77  
    78  // CurrentUser returns user information decoded from the JWT access token in
    79  // .cf/config.json.
    80  func (config *Config) CurrentUser() (User, error) {
    81  	return decodeUserFromJWT(config.ConfigFile.AccessToken)
    82  }
    83  
    84  // CurrentUserName returns the name of a user as returned by CurrentUser()
    85  func (config *Config) CurrentUserName() (string, error) {
    86  	user, err := config.CurrentUser()
    87  	if err != nil {
    88  		return "", err
    89  	}
    90  	return user.Name, nil
    91  }
    92  
    93  // HasTargetedOrganization returns true if the organization is set.
    94  func (config *Config) HasTargetedOrganization() bool {
    95  	return config.ConfigFile.TargetedOrganization.GUID != ""
    96  }
    97  
    98  // HasTargetedSpace returns true if the space is set.
    99  func (config *Config) HasTargetedSpace() bool {
   100  	return config.ConfigFile.TargetedSpace.GUID != ""
   101  }
   102  
   103  // MinCLIVersion returns the minimum CLI version required by the CC.
   104  func (config *Config) MinCLIVersion() string {
   105  	return config.ConfigFile.MinCLIVersion
   106  }
   107  
   108  // OverallPollingTimeout returns the overall polling timeout for async
   109  // operations. The time is based off of:
   110  //   1. The config file's AsyncTimeout value (integer) is > 0
   111  //   2. Defaults to the DefaultOverallPollingTimeout
   112  func (config *Config) OverallPollingTimeout() time.Duration {
   113  	if config.ConfigFile.AsyncTimeout == 0 {
   114  		return DefaultOverallPollingTimeout
   115  	}
   116  	return time.Duration(config.ConfigFile.AsyncTimeout) * time.Minute
   117  }
   118  
   119  // RefreshToken returns the refresh token for getting a new access token.
   120  func (config *Config) RefreshToken() string {
   121  	return config.ConfigFile.RefreshToken
   122  }
   123  
   124  // RoutingEndpoint returns the endpoint for the router API
   125  func (config *Config) RoutingEndpoint() string {
   126  	return config.ConfigFile.RoutingEndpoint
   127  }
   128  
   129  // SetAccessToken sets the current access token.
   130  func (config *Config) SetAccessToken(accessToken string) {
   131  	config.ConfigFile.AccessToken = accessToken
   132  }
   133  
   134  // SetMinCLIVersion sets the minimum CLI version required by the CC.
   135  func (config *Config) SetMinCLIVersion(minVersion string) {
   136  	config.ConfigFile.MinCLIVersion = minVersion
   137  }
   138  
   139  // SetOrganizationInformation sets the currently targeted organization.
   140  func (config *Config) SetOrganizationInformation(guid string, name string) {
   141  	config.ConfigFile.TargetedOrganization.GUID = guid
   142  	config.ConfigFile.TargetedOrganization.Name = name
   143  	config.ConfigFile.TargetedOrganization.QuotaDefinition = QuotaDefinition{}
   144  }
   145  
   146  // SetRefreshToken sets the current refresh token.
   147  func (config *Config) SetRefreshToken(refreshToken string) {
   148  	config.ConfigFile.RefreshToken = refreshToken
   149  }
   150  
   151  // SetSpaceInformation sets the currently targeted space.
   152  func (config *Config) SetSpaceInformation(guid string, name string, allowSSH bool) {
   153  	config.V7SetSpaceInformation(guid, name)
   154  	config.ConfigFile.TargetedSpace.AllowSSH = allowSSH
   155  }
   156  
   157  // SetTargetInformation sets the currently targeted CC API and related other
   158  // related API URLs.
   159  func (config *Config) SetTargetInformation(api string, apiVersion string, auth string, minCLIVersion string, doppler string, routing string, skipSSLValidation bool) {
   160  	config.ConfigFile.Target = api
   161  	config.ConfigFile.APIVersion = apiVersion
   162  	config.ConfigFile.AuthorizationEndpoint = auth
   163  	config.SetMinCLIVersion(minCLIVersion)
   164  	config.ConfigFile.DopplerEndpoint = doppler
   165  	config.ConfigFile.RoutingEndpoint = routing
   166  	config.ConfigFile.SkipSSLValidation = skipSSLValidation
   167  
   168  	config.UnsetOrganizationAndSpaceInformation()
   169  }
   170  
   171  // SetTokenInformation sets the current token/user information.
   172  func (config *Config) SetTokenInformation(accessToken string, refreshToken string, sshOAuthClient string) {
   173  	config.ConfigFile.AccessToken = accessToken
   174  	config.ConfigFile.RefreshToken = refreshToken
   175  	config.ConfigFile.SSHOAuthClient = sshOAuthClient
   176  }
   177  
   178  // SetUAAClientCredentials sets the client credentials.
   179  func (config *Config) SetUAAClientCredentials(client string, clientSecret string) {
   180  	config.ConfigFile.UAAOAuthClient = client
   181  	config.ConfigFile.UAAOAuthClientSecret = clientSecret
   182  }
   183  
   184  // SetUAAEndpoint sets the UAA endpoint that is obtained from hitting
   185  // <AuthorizationEndpoint>/login.
   186  func (config *Config) SetUAAEndpoint(uaaEndpoint string) {
   187  	config.ConfigFile.UAAEndpoint = uaaEndpoint
   188  }
   189  
   190  // SetUAAGrantType sets the UAA grant type for logging in and refreshing the
   191  // token.
   192  func (config *Config) SetUAAGrantType(uaaGrantType string) {
   193  	config.ConfigFile.UAAGrantType = uaaGrantType
   194  }
   195  
   196  // SkipSSLValidation returns whether or not to skip SSL validation when
   197  // targeting an API endpoint.
   198  func (config *Config) SkipSSLValidation() bool {
   199  	return config.ConfigFile.SkipSSLValidation
   200  }
   201  
   202  // SSHOAuthClient returns the OAuth client id used for SSHing into
   203  // application/process containers.
   204  func (config *Config) SSHOAuthClient() string {
   205  	return config.ConfigFile.SSHOAuthClient
   206  }
   207  
   208  // Target returns the CC API URL.
   209  func (config *Config) Target() string {
   210  	return config.ConfigFile.Target
   211  }
   212  
   213  // TargetedOrganization returns the currently targeted organization.
   214  func (config *Config) TargetedOrganization() Organization {
   215  	return config.ConfigFile.TargetedOrganization
   216  }
   217  
   218  // TargetedOrganizationName returns the name of the targeted organization.
   219  func (config *Config) TargetedOrganizationName() string {
   220  	return config.TargetedOrganization().Name
   221  }
   222  
   223  // TargetedSpace returns the currently targeted space.
   224  func (config *Config) TargetedSpace() Space {
   225  	return config.ConfigFile.TargetedSpace
   226  }
   227  
   228  // UAAGrantType returns the grant type of the supplied UAA credentials.
   229  func (config *Config) UAAGrantType() string {
   230  	return config.ConfigFile.UAAGrantType
   231  }
   232  
   233  // UAAOAuthClient returns the CLI's UAA client ID.
   234  func (config *Config) UAAOAuthClient() string {
   235  	return config.ConfigFile.UAAOAuthClient
   236  }
   237  
   238  // UAAOAuthClientSecret returns the CLI's UAA client secret.
   239  func (config *Config) UAAOAuthClientSecret() string {
   240  	return config.ConfigFile.UAAOAuthClientSecret
   241  }
   242  
   243  // UnsetOrganizationAndSpaceInformation resets the organization and space
   244  // values to default.
   245  func (config *Config) UnsetOrganizationAndSpaceInformation() {
   246  	config.SetOrganizationInformation("", "")
   247  	config.UnsetSpaceInformation()
   248  }
   249  
   250  // UnsetSpaceInformation resets the space values to default.
   251  func (config *Config) UnsetSpaceInformation() {
   252  	config.SetSpaceInformation("", "", false)
   253  }
   254  
   255  // UnsetUserInformation resets the access token, refresh token, UAA grant type,
   256  // UAA client credentials, and targeted org/space information.
   257  func (config *Config) UnsetUserInformation() {
   258  	config.SetAccessToken("")
   259  	config.SetRefreshToken("")
   260  	config.SetUAAGrantType("")
   261  	config.SetUAAClientCredentials(DefaultUAAOAuthClient, DefaultUAAOAuthClientSecret)
   262  
   263  	config.UnsetOrganizationAndSpaceInformation()
   264  
   265  }
   266  
   267  // V7SetSpaceInformation sets the currently targeted space.
   268  func (config *Config) V7SetSpaceInformation(guid string, name string) {
   269  	config.ConfigFile.TargetedSpace.GUID = guid
   270  	config.ConfigFile.TargetedSpace.Name = name
   271  }
   272  
   273  func decodeUserFromJWT(accessToken string) (User, error) {
   274  	if accessToken == "" {
   275  		return User{}, nil
   276  	}
   277  
   278  	token, err := jws.ParseJWT([]byte(accessToken[7:]))
   279  	if err != nil {
   280  		return User{}, err
   281  	}
   282  
   283  	claims := token.Claims()
   284  
   285  	var ID string
   286  	if claims.Has("user_name") {
   287  		ID = claims.Get("user_name").(string)
   288  	} else {
   289  		ID = claims.Get("client_id").(string)
   290  	}
   291  	return User{
   292  		Name: ID,
   293  	}, nil
   294  }