Skip to content

Commit 418d66e

Browse files
committed
Remove scopes from config on signout
1 parent 523a177 commit 418d66e

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
package software.aws.toolkits.jetbrains.core.credentials
55

6+
import com.intellij.openapi.application.ApplicationManager
7+
import com.intellij.openapi.fileEditor.FileDocumentManager
68
import software.amazon.awssdk.profiles.Profile
79
import software.amazon.awssdk.profiles.ProfileFile
810
import software.amazon.awssdk.profiles.ProfileFileLocation
@@ -15,6 +17,8 @@ import software.aws.toolkits.core.utils.touch
1517
import software.aws.toolkits.core.utils.tryDirOp
1618
import software.aws.toolkits.core.utils.tryFileOp
1719
import software.aws.toolkits.core.utils.writeText
20+
import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileWatcher
21+
import software.aws.toolkits.jetbrains.core.credentials.profiles.SsoSessionConstants
1822
import software.aws.toolkits.jetbrains.core.credentials.profiles.ssoSessions
1923
import java.nio.file.Path
2024

@@ -35,6 +39,9 @@ interface ConfigFilesFacade {
3539
fun appendProfileToCredentials(profile: Profile)
3640
fun appendSectionToConfig(sectionName: String, profile: Profile)
3741
fun updateSectionInConfig(sectionName: String, profile: Profile)
42+
43+
fun deleteSsoConnectionFromConfig(sessionName: String)
44+
fun deleteSsoProfileScopesFromConfig(sessionName: String)
3845
}
3946

4047
class DefaultConfigFilesFacade(
@@ -173,6 +180,49 @@ class DefaultConfigFilesFacade(
173180
}
174181
}
175182

183+
override fun deleteSsoConnectionFromConfig(sessionName: String) {
184+
val filePath = configPath
185+
val lines = filePath.inputStreamIfExists()?.reader()?.readLines().orEmpty()
186+
val ssoHeaderLine = lines.indexOfFirst { it.startsWith("[${SsoSessionConstants.SSO_SESSION_SECTION_NAME} $sessionName]") }
187+
if (ssoHeaderLine == -1) return
188+
val nextHeaderLine = lines.subList(ssoHeaderLine + 1, lines.size).indexOfFirst { it.startsWith("[") }
189+
val endIndex = if (nextHeaderLine == -1) lines.size else ssoHeaderLine + nextHeaderLine + 1
190+
val updatedArray = lines.subList(0, ssoHeaderLine) + lines.subList(endIndex, lines.size)
191+
val profileHeaderLine = getCorrespondingSsoSessionProfilePosition(updatedArray, sessionName)
192+
filePath.writeText(profileHeaderLine.joinToString("\n"))
193+
194+
val applicationManager = ApplicationManager.getApplication()
195+
if (applicationManager != null && !applicationManager.isUnitTestMode) {
196+
FileDocumentManager.getInstance().saveAllDocuments()
197+
ProfileWatcher.getInstance().forceRefresh()
198+
}
199+
}
200+
201+
override fun deleteSsoProfileScopesFromConfig(sessionName: String) {
202+
val filePath = configPath
203+
val lines = filePath.inputStreamIfExists()?.reader()?.readLines().orEmpty().toMutableList()
204+
val ssoHeaderLine = lines.indexOfFirst { it.startsWith("[${SsoSessionConstants.SSO_SESSION_SECTION_NAME} $sessionName]") }
205+
if (ssoHeaderLine == -1) return
206+
val nextHeaderLine = lines.subList(ssoHeaderLine + 1, lines.size).indexOfFirst { it.startsWith("[") }
207+
val endIndex = if (nextHeaderLine == -1) lines.size else ssoHeaderLine + nextHeaderLine + 1
208+
209+
// Find and remove the sso_registration_scopes line
210+
for (i in ssoHeaderLine until endIndex) {
211+
if (lines[i].trim().startsWith("sso_registration_scopes=")) {
212+
lines.removeAt(i)
213+
break
214+
}
215+
}
216+
217+
filePath.writeText(lines.joinToString("\n"))
218+
219+
val applicationManager = ApplicationManager.getApplication()
220+
if (applicationManager != null && !applicationManager.isUnitTestMode) {
221+
FileDocumentManager.getInstance().saveAllDocuments()
222+
ProfileWatcher.getInstance().forceRefresh()
223+
}
224+
}
225+
176226
private fun getCorrespondingSsoSessionProfilePosition(updatedArray: List<String>, sessionName: String): List<String> {
177227
var content = updatedArray
178228
val finalContent = mutableListOf<String>()

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
1313
import software.aws.toolkits.core.ClientConnectionSettings
1414
import software.aws.toolkits.core.ConnectionSettings
1515
import software.aws.toolkits.core.TokenConnectionSettings
16+
import software.aws.toolkits.core.credentials.CredentialIdentifier
1617
import software.aws.toolkits.core.credentials.ToolkitBearerTokenProvider
1718
import software.aws.toolkits.core.utils.getLogger
1819
import software.aws.toolkits.core.utils.info
1920
import software.aws.toolkits.core.utils.warn
2021
import software.aws.toolkits.jetbrains.core.credentials.pinning.FeatureWithPinnedConnection
22+
import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileCredentialsIdentifierSso
23+
import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileWatcher
2124
import software.aws.toolkits.jetbrains.core.credentials.profiles.SsoSessionConstants.SSO_SESSION_SECTION_NAME
2225
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
2326
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
@@ -202,6 +205,13 @@ fun loginSso(
202205
fun logoutFromSsoConnection(project: Project?, connection: AwsBearerTokenConnection, callback: () -> Unit = {}) {
203206
try {
204207
ToolkitAuthManager.getInstance().deleteConnection(connection.id)
208+
ProfileWatcher.getInstance().forceRefresh()
209+
project?.let { ToolkitConnectionManager.getInstance(it).switchConnection(null) }
210+
211+
if (connection is ProfileSsoManagedBearerSsoConnection) {
212+
deleteSsoConnection(connection)
213+
}
214+
205215
} finally {
206216
callback()
207217
}
@@ -327,6 +337,19 @@ fun maybeReauthProviderIfNeeded(
327337
}
328338
}
329339

340+
fun deleteSsoConnection(connection: ProfileSsoManagedBearerSsoConnection) =
341+
deleteSsoConnection(connection.configSessionName)
342+
343+
fun deleteSsoConnection(connection: CredentialIdentifier) =
344+
deleteSsoConnection(getSsoSessionProfileNameFromCredentials(connection))
345+
346+
fun deleteSsoConnection(sessionName: String) = DefaultConfigFilesFacade().deleteSsoProfileScopesFromConfig(sessionName)
347+
348+
private fun getSsoSessionProfileNameFromCredentials(connection: CredentialIdentifier): String {
349+
connection as ProfileCredentialsIdentifierSso
350+
return connection.ssoSessionName
351+
}
352+
330353
private fun recordLoginWithBrowser(
331354
credentialStartUrl: String? = null,
332355
credentialSourceId: CredentialSourceId? = null,

0 commit comments

Comments
 (0)