Skip to content

Commit aa519c6

Browse files
Merge main into feature/disable-sspc
2 parents 40cd74a + 839abe2 commit aa519c6

File tree

3 files changed

+92
-19
lines changed

3 files changed

+92
-19
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ mockitoKotlin = "5.4.1-SNAPSHOT"
2828
mockk = "1.13.17"
2929
nimbus-jose-jwt = "9.40"
3030
node-gradle = "7.0.2"
31-
telemetryGenerator = "1.0.329"
31+
telemetryGenerator = "1.0.338"
3232
testLogger = "4.0.0"
3333
testRetry = "1.5.10"
3434
# test-only; platform provides slf4j transitively at runtime

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sso/SsoAccessTokenProvider.kt

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.intellij.openapi.progress.ProgressManager
1111
import com.intellij.openapi.util.registry.Registry
1212
import software.amazon.awssdk.auth.token.credentials.SdkTokenProvider
1313
import software.amazon.awssdk.awscore.exception.AwsServiceException
14+
import software.amazon.awssdk.core.exception.SdkServiceException
1415
import software.amazon.awssdk.services.ssooidc.SsoOidcClient
1516
import software.amazon.awssdk.services.ssooidc.model.AuthorizationPendingException
1617
import software.amazon.awssdk.services.ssooidc.model.CreateTokenResponse
@@ -338,11 +339,34 @@ class SsoAccessTokenProvider(
338339
throw ProcessCanceledException(IllegalStateException("Login canceled by user"))
339340
}
340341

341-
val tokenResponse = client.createToken {
342-
it.clientId(registration.clientId)
343-
it.clientSecret(registration.clientSecret)
344-
it.grantType(DEVICE_GRANT_TYPE)
345-
it.deviceCode(authorization.deviceCode)
342+
val startTime = clock.instant()
343+
val tokenResponse = try {
344+
client.createToken {
345+
it.clientId(registration.clientId)
346+
it.clientSecret(registration.clientSecret)
347+
it.grantType(DEVICE_GRANT_TYPE)
348+
it.deviceCode(authorization.deviceCode)
349+
}.also {
350+
val duration = Duration.between(startTime, clock.instant()).toMillis().toDouble()
351+
AuthTelemetry.ssoTokenOperation(
352+
result = Result.Succeeded,
353+
grantType = DEVICE_GRANT_TYPE,
354+
duration = duration
355+
)
356+
LOG.info { "SSO token operation succeeded: grantType=$DEVICE_GRANT_TYPE, duration=${duration}ms" }
357+
}
358+
} catch (e: Exception) {
359+
val duration = Duration.between(startTime, clock.instant()).toMillis().toDouble()
360+
AuthTelemetry.ssoTokenOperation(
361+
result = Result.Failed,
362+
grantType = DEVICE_GRANT_TYPE,
363+
duration = duration,
364+
reason = e::class.simpleName,
365+
reasonDesc = e.message?.let { scrubNames(it) },
366+
httpStatusCode = (e as? SdkServiceException)?.statusCode()?.toString()
367+
)
368+
LOG.warn { "SSO token operation failed: grantType=$DEVICE_GRANT_TYPE, duration=${duration}ms, error=${e::class.simpleName}" }
369+
throw e
346370
}
347371

348372
onPendingToken.tokenRetrieved()
@@ -459,11 +483,34 @@ class SsoAccessTokenProvider(
459483

460484
stageName = RefreshCredentialStage.CREATE_TOKEN
461485
try {
462-
val newToken = client.createToken {
463-
it.clientId(registration.clientId)
464-
it.clientSecret(registration.clientSecret)
465-
it.grantType(REFRESH_GRANT_TYPE)
466-
it.refreshToken(currentToken.refreshToken)
486+
val startTime = clock.instant()
487+
val newToken = try {
488+
client.createToken {
489+
it.clientId(registration.clientId)
490+
it.clientSecret(registration.clientSecret)
491+
it.grantType(REFRESH_GRANT_TYPE)
492+
it.refreshToken(currentToken.refreshToken)
493+
}.also {
494+
val duration = Duration.between(startTime, clock.instant()).toMillis().toDouble()
495+
AuthTelemetry.ssoTokenOperation(
496+
result = Result.Succeeded,
497+
grantType = REFRESH_GRANT_TYPE,
498+
duration = duration
499+
)
500+
LOG.info { "SSO token operation succeeded: grantType=$REFRESH_GRANT_TYPE, duration=${duration}ms" }
501+
}
502+
} catch (e: Exception) {
503+
val duration = Duration.between(startTime, clock.instant()).toMillis().toDouble()
504+
AuthTelemetry.ssoTokenOperation(
505+
result = Result.Failed,
506+
grantType = REFRESH_GRANT_TYPE,
507+
duration = duration,
508+
reason = e::class.simpleName,
509+
reasonDesc = e.message?.let { scrubNames(it) },
510+
httpStatusCode = (e as? SdkServiceException)?.statusCode()?.toString()
511+
)
512+
LOG.warn { "SSO token operation failed: grantType=$REFRESH_GRANT_TYPE, duration=${duration}ms, error=${e::class.simpleName}" }
513+
throw e
467514
}
468515

469516
stageName = RefreshCredentialStage.GET_TOKEN_DETAILS

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/credentials/sso/pkce/ToolkitOAuthService.kt

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import io.netty.handler.codec.http.QueryStringDecoder
2424
import org.jetbrains.ide.BuiltInServerManager
2525
import org.jetbrains.ide.RestService
2626
import org.jetbrains.io.response
27+
import software.amazon.awssdk.core.exception.SdkServiceException
2728
import software.amazon.awssdk.regions.Region
2829
import software.amazon.awssdk.services.ssooidc.endpoints.SsoOidcEndpointParams
2930
import software.amazon.awssdk.services.ssooidc.endpoints.internal.DefaultSsoOidcEndpointProvider
@@ -32,10 +33,13 @@ import software.aws.toolkits.jetbrains.core.credentials.sso.PKCEAuthorizationGra
3233
import software.aws.toolkits.jetbrains.core.credentials.sso.PKCEClientRegistration
3334
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.buildUnmanagedSsoOidcClient
3435
import software.aws.toolkits.jetbrains.core.gettingstarted.editor.SourceOfEntry
36+
import software.aws.toolkits.jetbrains.services.telemetry.scrubNames
3537
import software.aws.toolkits.resources.AwsCoreBundle
38+
import software.aws.toolkits.telemetry.AuthTelemetry
3639
import software.aws.toolkits.telemetry.AuthType
3740
import software.aws.toolkits.telemetry.AwsTelemetry
3841
import software.aws.toolkits.telemetry.MetricResult
42+
import software.aws.toolkits.telemetry.Result
3943
import java.math.BigInteger
4044
import java.time.Instant
4145
import java.util.Base64
@@ -149,15 +153,37 @@ internal class ToolkitOauthCredentialsAcquirer(
149153
private val redirectUri: String,
150154
) : OAuthCredentialsAcquirer<AccessToken> {
151155
override fun acquireCredentials(code: String): OAuthCredentialsAcquirer.AcquireCredentialsResult<AccessToken> {
152-
val token = buildUnmanagedSsoOidcClient(registration.region).use { client ->
153-
client.createToken {
154-
it.clientId(registration.clientId)
155-
it.clientSecret(registration.clientSecret)
156-
it.grantType("authorization_code")
157-
it.redirectUri(redirectUri)
158-
it.codeVerifier(codeVerifier)
159-
it.code(code)
156+
val grantType = "authorization_code"
157+
val startTime = Instant.now()
158+
val token = try {
159+
buildUnmanagedSsoOidcClient(registration.region).use { client ->
160+
client.createToken {
161+
it.clientId(registration.clientId)
162+
it.clientSecret(registration.clientSecret)
163+
it.grantType(grantType)
164+
it.redirectUri(redirectUri)
165+
it.codeVerifier(codeVerifier)
166+
it.code(code)
167+
}.also {
168+
val duration = java.time.Duration.between(startTime, Instant.now()).toMillis().toDouble()
169+
AuthTelemetry.ssoTokenOperation(
170+
result = Result.Succeeded,
171+
grantType = grantType,
172+
duration = duration
173+
)
174+
}
160175
}
176+
} catch (e: Exception) {
177+
val duration = java.time.Duration.between(startTime, Instant.now()).toMillis().toDouble()
178+
AuthTelemetry.ssoTokenOperation(
179+
result = Result.Failed,
180+
grantType = grantType,
181+
duration = duration,
182+
reason = e::class.simpleName,
183+
reasonDesc = e.message?.let { scrubNames(it) },
184+
httpStatusCode = (e as? SdkServiceException)?.statusCode()?.toString()
185+
)
186+
throw e
161187
}
162188

163189
return OAuthCredentialsAcquirer.AcquireCredentialsResult.Success(

0 commit comments

Comments
 (0)