@@ -8,6 +8,8 @@ import com.intellij.openapi.components.service
88import com.intellij.openapi.extensions.ExtensionPointName
99import com.intellij.openapi.progress.ProcessCanceledException
1010import com.intellij.openapi.project.Project
11+ import kotlinx.coroutines.delay
12+ import kotlinx.coroutines.runBlocking
1113import migration.software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
1214import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
1315import software.aws.toolkits.core.ClientConnectionSettings
@@ -25,13 +27,17 @@ import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAu
2527import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
2628import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
2729import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.InteractiveBearerTokenProvider
30+ import software.aws.toolkits.jetbrains.utils.notifyInfo
2831import software.aws.toolkits.jetbrains.utils.runUnderProgressIfNeeded
2932import software.aws.toolkits.resources.AwsCoreBundle
3033import software.aws.toolkits.telemetry.AuthTelemetry
34+ import software.aws.toolkits.resources.AwsCoreBundle.message
3135import software.aws.toolkits.telemetry.CredentialSourceId
3236import software.aws.toolkits.telemetry.CredentialType
3337import software.aws.toolkits.telemetry.Result
38+ import java.net.UnknownHostException
3439import java.time.Instant
40+ import kotlin.math.min
3541
3642sealed interface ToolkitConnection {
3743 val id: String
@@ -310,7 +316,7 @@ fun maybeReauthProviderIfNeeded(
310316 onReauthRequired : (SsoOidcException ? ) -> Any ,
311317): Boolean {
312318 val state = tokenProvider.state()
313- when (state) {
319+ return when (state) {
314320 BearerTokenAuthState .NOT_AUTHENTICATED -> {
315321 getLogger<ToolkitAuthManager >().info { " Token provider NOT_AUTHENTICATED, requesting login" }
316322 onReauthRequired(null )
@@ -323,13 +329,36 @@ fun maybeReauthProviderIfNeeded(
323329 return runUnderProgressIfNeeded(project, AwsCoreBundle .message(" credentials.refreshing" ), true ) {
324330 tokenProvider.resolveToken()
325331 BearerTokenProviderListener .notifyCredUpdate(tokenProvider.id)
332+ hasNotifiedNetworkErrorOnce = false
326333 return @runUnderProgressIfNeeded false
327334 }
328335 } catch (e: SsoOidcException ) {
329336 AuthTelemetry .sourceOfRefresh(authRefreshSource = reauthSource.toString())
330337 getLogger<ToolkitAuthManager >().warn(e) { " Redriving bearer token login flow since token could not be refreshed" }
331338 onReauthRequired(e)
332339 return true
340+ } catch (e: Exception ) {
341+ when {
342+ e is SsoOidcException -> {
343+ getLogger<ToolkitAuthManager >().warn(e) { " Redriving bearer token login flow since token could not be refreshed" }
344+ onReauthRequired(e)
345+ return true
346+ }
347+
348+ e is UnknownHostException || e.message?.contains(" Unable to execute HTTP request" ) == true -> {
349+ getLogger<ToolkitAuthManager >().error(" Failed to refresh token" , e)
350+ if (! hasNotifiedNetworkErrorOnce) {
351+ hasNotifiedNetworkErrorOnce = true
352+ notifyInfo(
353+ message(" general.auth.network.error" ),
354+ message(" general.auth.network.error.message" ),
355+ project
356+ )
357+ }
358+ return false
359+ }
360+ else -> {return false }
361+ }
333362 }
334363 }
335364
@@ -410,6 +439,8 @@ private fun recordAddConnection(
410439 }
411440}
412441
442+ private var hasNotifiedNetworkErrorOnce = false
443+
413444data class ConnectionMetadata (
414445 val sourceId : String? = null ,
415446)
0 commit comments