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 }