diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuth.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuth.kt index c76e0de3c04..0496fcd72ea 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuth.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuth.kt @@ -7,12 +7,10 @@ import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import com.intellij.credentialStore.Credentials -import com.intellij.database.access.DatabaseCredentials import com.intellij.database.dataSource.DatabaseAuthProvider.AuthWidget import com.intellij.database.dataSource.DatabaseConnectionInterceptor.ProtoConnection import com.intellij.database.dataSource.DatabaseCredentialsAuthProvider import com.intellij.database.dataSource.LocalDataSource -import com.intellij.openapi.project.Project import kotlinx.coroutines.future.future import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient import software.aws.toolkits.core.ConnectionSettings @@ -45,8 +43,7 @@ class SecretsManagerAuth : DatabaseAuthProviderCompatabilityAdapter { override fun getDisplayName(): String = message("datagrip.auth.secrets_manager") - override fun createWidget(project: Project?, creds: DatabaseCredentials, source: LocalDataSource): AuthWidget? = - SecretsManagerAuthWidget() + override fun createWidget(): AuthWidget? = SecretsManagerAuthWidget() override fun intercept( connection: ProtoConnection, diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidget.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidget.kt index 68308180974..4db5e772937 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidget.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidget.kt @@ -4,7 +4,8 @@ package software.aws.toolkits.jetbrains.datagrip.auth import com.intellij.database.dataSource.DataSourceUiUtil -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionConfig +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.ui.components.JBCheckBox import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBTextField @@ -38,28 +39,28 @@ class SecretsManagerAuthWidget : AwsAuthWidget(userFieldEnabled = false) { return panel } - override fun save(dataSource: LocalDataSource, copyCredentials: Boolean) { - super.save(dataSource, copyCredentials) + override fun save(config: DatabaseConnectionConfig, copyCredentials: Boolean) { + super.save(config, copyCredentials) DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, + config.additionalProperties, SECRET_ID_PROPERTY, secretIdSelector.text.nullize() ) DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, + config.additionalProperties, GET_URL_FROM_SECRET, urlFromSecret.isSelected.toString() ) } - override fun reset(dataSource: LocalDataSource, resetCredentials: Boolean) { - super.reset(dataSource, resetCredentials) - dataSource.additionalProperties[SECRET_ID_PROPERTY]?.nullize()?.let { + override fun reset(config: DatabaseConnectionPoint, resetCredentials: Boolean) { + super.reset(config, resetCredentials) + config.additionalProperties[SECRET_ID_PROPERTY]?.nullize()?.let { secretIdSelector.text = it } - dataSource.additionalProperties[GET_URL_FROM_SECRET]?.nullize()?.let { + config.additionalProperties[GET_URL_FROM_SECRET]?.nullize()?.let { urlFromSecret.isSelected = it.toBoolean() } } diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/compatability/DatabaseAuthProviderCompatabilityAdapter.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/compatability/DatabaseAuthProviderCompatabilityAdapter.kt index 8f611286b7d..9a12f599ff1 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/compatability/DatabaseAuthProviderCompatabilityAdapter.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/datagrip/auth/compatability/DatabaseAuthProviderCompatabilityAdapter.kt @@ -3,15 +3,33 @@ package software.aws.toolkits.jetbrains.datagrip.auth.compatability +import com.intellij.database.access.DatabaseCredentials import com.intellij.database.dataSource.DatabaseAuthProvider +import com.intellij.database.dataSource.DatabaseAuthProvider.ApplicabilityLevel +import com.intellij.database.dataSource.DatabaseConnectionConfig import com.intellij.database.dataSource.DatabaseConnectionInterceptor +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.LocalDataSource +import com.intellij.openapi.project.Project +@Suppress("UnstableApiUsage") interface DatabaseAuthProviderCompatabilityAdapter : DatabaseAuthProvider { - override fun isApplicable(dataSource: LocalDataSource, level: DatabaseAuthProvider.ApplicabilityLevel): Boolean = - isApplicable(dataSource) + override fun getApplicability( + point: DatabaseConnectionPoint, + level: ApplicabilityLevel, + ): ApplicabilityLevel.Result { + if (!isApplicable(point.dataSource)) return ApplicabilityLevel.Result.NOT_APPLICABLE + return super.getApplicability(point, level) + } + + override fun createWidget( + project: Project?, + credentials: DatabaseCredentials, + config: DatabaseConnectionConfig, + ): DatabaseAuthProvider.AuthWidget? = createWidget() fun isApplicable(dataSource: LocalDataSource): Boolean + fun createWidget(): DatabaseAuthProvider.AuthWidget? } fun DatabaseConnectionInterceptor.ProtoConnection.project() = project diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuth.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuth.kt index 2747857eaa4..11712df4d86 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuth.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuth.kt @@ -4,7 +4,6 @@ package software.aws.toolkits.jetbrains.services.rds.auth import com.intellij.credentialStore.Credentials -import com.intellij.database.access.DatabaseCredentials import com.intellij.database.connection.throwable.KnownDatabaseException import com.intellij.database.connection.throwable.info.ErrorInfo import com.intellij.database.connection.throwable.info.SimpleErrorInfo @@ -58,7 +57,7 @@ class IamAuth : DatabaseAuthProviderCompatabilityAdapter { override fun isApplicable(dataSource: LocalDataSource): Boolean = iamIsApplicable(dataSource) - override fun createWidget(project: Project?, credentials: DatabaseCredentials, dataSource: LocalDataSource): AuthWidget? = IamAuthWidget() + override fun createWidget(): AuthWidget? = IamAuthWidget() inner class SsoNoTokenFix(val project: Project, val connection: ProtoConnection) : ErrorInfo.Fix { diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidget.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidget.kt index c62f3c1d57e..6ad65fef448 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidget.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidget.kt @@ -4,7 +4,8 @@ package software.aws.toolkits.jetbrains.services.rds.auth import com.intellij.database.dataSource.DataSourceUiUtil -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionConfig +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.url.template.ParametersHolder import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBTextField @@ -37,8 +38,8 @@ class IamAuthWidget : AwsAuthWidget() { return panel } - override fun save(dataSource: LocalDataSource, copyCredentials: Boolean) { - super.save(dataSource, copyCredentials) + override fun save(config: DatabaseConnectionConfig, copyCredentials: Boolean) { + super.save(config, copyCredentials) // If the user has not specified a signing host/port we will try to use the URL in the connection val host = if (rdsSigningHostField.text.isNullOrBlank()) { @@ -47,7 +48,7 @@ class IamAuthWidget : AwsAuthWidget() { rdsSigningHostField.text } DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, + config.additionalProperties, RDS_SIGNING_HOST_PROPERTY, host ) @@ -58,16 +59,16 @@ class IamAuthWidget : AwsAuthWidget() { rdsSigningPortField.text } DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, + config.additionalProperties, RDS_SIGNING_PORT_PROPERTY, port ) } - override fun reset(dataSource: LocalDataSource, resetCredentials: Boolean) { - super.reset(dataSource, resetCredentials) - rdsSigningHostField.text = dataSource.additionalProperties[RDS_SIGNING_HOST_PROPERTY] - rdsSigningPortField.text = dataSource.additionalProperties[RDS_SIGNING_PORT_PROPERTY] + override fun reset(config: DatabaseConnectionPoint, resetCredentials: Boolean) { + super.reset(config, resetCredentials) + rdsSigningHostField.text = config.additionalProperties[RDS_SIGNING_HOST_PROPERTY] + rdsSigningPortField.text = config.additionalProperties[RDS_SIGNING_PORT_PROPERTY] } override fun updateFromUrl(holder: ParametersHolder) { diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuth.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuth.kt index 943b77b710a..da1a34a462b 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuth.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuth.kt @@ -4,12 +4,10 @@ package software.aws.toolkits.jetbrains.services.redshift.auth import com.intellij.credentialStore.Credentials -import com.intellij.database.access.DatabaseCredentials import com.intellij.database.dataSource.DatabaseAuthProvider.AuthWidget import com.intellij.database.dataSource.DatabaseConnectionInterceptor.ProtoConnection import com.intellij.database.dataSource.DatabaseCredentialsAuthProvider import com.intellij.database.dataSource.LocalDataSource -import com.intellij.openapi.project.Project import kotlinx.coroutines.future.future import software.amazon.awssdk.services.redshift.RedshiftClient import software.aws.toolkits.core.ConnectionSettings @@ -37,7 +35,7 @@ class IamAuth : DatabaseAuthProviderCompatabilityAdapter { override fun isApplicable(dataSource: LocalDataSource): Boolean = dataSource.dbms.isRedshift override fun getDisplayName(): String = message("redshift.auth.aws") - override fun createWidget(project: Project?, creds: DatabaseCredentials, source: LocalDataSource): AuthWidget? = IamAuthWidget() + override fun createWidget(): AuthWidget? = IamAuthWidget() override fun intercept(connection: ProtoConnection, silent: Boolean): CompletionStage? { LOG.info { "Intercepting db connection [$connection]" } diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidget.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidget.kt index 7a485f90dae..aedd999a98e 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidget.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidget.kt @@ -4,7 +4,8 @@ package software.aws.toolkits.jetbrains.services.redshift.auth import com.intellij.database.dataSource.DataSourceUiUtil -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionConfig +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.url.template.ParametersHolder import com.intellij.database.dataSource.url.template.UrlEditorModel import com.intellij.ui.components.JBLabel @@ -34,19 +35,19 @@ class IamAuthWidget : AwsAuthWidget() { return panel } - override fun save(dataSource: LocalDataSource, copyCredentials: Boolean) { - super.save(dataSource, copyCredentials) + override fun save(config: DatabaseConnectionConfig, copyCredentials: Boolean) { + super.save(config, copyCredentials) DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, + config.additionalProperties, CLUSTER_ID_PROPERTY, clusterIdSelector.text ) } - override fun reset(dataSource: LocalDataSource, resetCredentials: Boolean) { - super.reset(dataSource, resetCredentials) - clusterIdSelector.text = dataSource.additionalProperties[CLUSTER_ID_PROPERTY] + override fun reset(config: DatabaseConnectionPoint, resetCredentials: Boolean) { + super.reset(config, resetCredentials) + clusterIdSelector.text = config.additionalProperties[CLUSTER_ID_PROPERTY] } override fun updateFromUrl(holder: ParametersHolder) { diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidget.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidget.kt index e0bb4b128ff..61f585be1be 100644 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidget.kt +++ b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidget.kt @@ -1,19 +1,124 @@ -// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package software.aws.toolkits.jetbrains.ui +import com.intellij.database.dataSource.DataSourceUiUtil import com.intellij.database.dataSource.DatabaseConnectionConfig import com.intellij.database.dataSource.DatabaseConnectionPoint +import com.intellij.database.dataSource.DatabaseCredentialsAuthProviderUi +import com.intellij.database.dataSource.url.template.ParametersHolder +import com.intellij.database.dataSource.url.template.UrlEditorModel +import com.intellij.ui.components.JBLabel +import com.intellij.uiDesigner.core.GridLayoutManager +import com.intellij.util.text.nullize +import org.jetbrains.annotations.TestOnly +import software.aws.toolkits.jetbrains.UiConstraints +import software.aws.toolkits.jetbrains.core.credentials.CredentialManager +import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider +import software.aws.toolkits.jetbrains.datagrip.CREDENTIAL_ID_PROPERTY +import software.aws.toolkits.jetbrains.datagrip.REGION_ID_PROPERTY +import software.aws.toolkits.jetbrains.utils.ui.selected +import software.aws.toolkits.resources.message +import javax.swing.JPanel + +abstract class AwsAuthWidget(private val userFieldEnabled: Boolean = true) : DatabaseCredentialsAuthProviderUi.UserWidget() { + private val credentialSelector = CredentialProviderSelector() + private val regionSelector = RegionSelector() + + // These are defined in DataGrip and used in the url holder which is called in `updateFromUrl` + protected val hostParameter = "host" + protected val portParameter = "port" + + abstract fun getRegionFromUrl(url: String?): String? + abstract val serviceId: String + + open val rowCount: Int = 3 + open val columnCount: Int = 6 + + override fun createPanel(): JPanel { + val panel = JPanel(GridLayoutManager(rowCount, columnCount)) + addUserField(panel, 0) + + // Disable the user field if we treat it as immutable + myUserField.isEnabled = userFieldEnabled + + val credsLabel = JBLabel(message("aws_connection.credentials.label")) + val regionLabel = JBLabel(message("aws_connection.region.label")) + panel.add(credsLabel, UiConstraints.createLabelConstraints(1, 0, credsLabel.preferredSize.getWidth())) + panel.add(credentialSelector, UiConstraints.createSimpleConstraints(1, 1, 3)) + panel.add(regionLabel, UiConstraints.createLabelConstraints(2, 0, regionLabel.preferredSize.getWidth())) + panel.add(regionSelector, UiConstraints.createSimpleConstraints(2, 1, 3)) + + return panel + } -abstract class AwsAuthWidget(userFieldEnabled: Boolean = true) : @Suppress("DEPRECATION") AwsAuthWidgetBase(userFieldEnabled) { override fun save(config: DatabaseConnectionConfig, copyCredentials: Boolean) { super.save(config, copyCredentials) - save(config.dataSource, copyCredentials) + + DataSourceUiUtil.putOrRemove( + config.additionalProperties, + CREDENTIAL_ID_PROPERTY, + credentialSelector.getSelectedCredentialsProvider() + ) + DataSourceUiUtil.putOrRemove( + config.additionalProperties, + REGION_ID_PROPERTY, + regionSelector.selectedRegion?.id + ) } - override fun reset(point: DatabaseConnectionPoint, resetCredentials: Boolean) { - super.reset(point, resetCredentials) - reset(point.dataSource, resetCredentials) + override fun reset(config: DatabaseConnectionPoint, resetCredentials: Boolean) { + super.reset(config, resetCredentials) + + val regionProvider = AwsRegionProvider.getInstance() + val allRegions = regionProvider.allRegionsForService(serviceId) + regionSelector.setRegions(allRegions.values.toMutableList()) + val regionId = config.additionalProperties[REGION_ID_PROPERTY]?.nullize() + regionId?.let { + allRegions[regionId]?.let { region -> + regionSelector.selectedRegion = region + } + } + + val credentialManager = CredentialManager.getInstance() + credentialSelector.setCredentialsProviders(credentialManager.getCredentialIdentifiers()) + val credentialId = config.additionalProperties[CREDENTIAL_ID_PROPERTY]?.nullize() + if (credentialId != null) { + val credentialIdentifierById = credentialManager.getCredentialIdentifierById(credentialId) + if (credentialIdentifierById != null) { + credentialSelector.setSelectedCredentialsProvider(credentialIdentifierById) + } else { + credentialSelector.setSelectedInvalidCredentialsProvider(credentialId) + } + } else { + credentialSelector.model.selectedItem = null + } + } + + override fun isPasswordChanged(): Boolean = false + + override fun onChanged(r: Runnable) { + // Tries to set username so if we don't have one, don't set + if (userFieldEnabled) { + super.onChanged(r) + } } + + override fun updateFromUrl(holder: ParametersHolder) { + // Try to get region from url and set the region box on a best effort basis + val url = (holder as? UrlEditorModel)?.url + val regionId = getRegionFromUrl(url) + val region = AwsRegionProvider.getInstance().allRegions()[regionId] + region?.let { + regionSelector.selectedRegion = it + } + super.updateFromUrl(holder) + } + + @TestOnly + internal fun getSelectedCredential() = credentialSelector.getSelectedCredentialsProvider() + + @TestOnly + internal fun getSelectedRegion() = regionSelector.selected() } diff --git a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidgetBase.kt b/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidgetBase.kt deleted file mode 100644 index 995d1305518..00000000000 --- a/plugins/toolkit/jetbrains-ultimate/src/software/aws/toolkits/jetbrains/ui/AwsAuthWidgetBase.kt +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.ui - -import com.intellij.database.dataSource.DataSourceUiUtil -import com.intellij.database.dataSource.DatabaseCredentialsAuthProviderUi -import com.intellij.database.dataSource.LocalDataSource -import com.intellij.database.dataSource.url.template.ParametersHolder -import com.intellij.database.dataSource.url.template.UrlEditorModel -import com.intellij.ui.components.JBLabel -import com.intellij.uiDesigner.core.GridLayoutManager -import com.intellij.util.text.nullize -import org.jetbrains.annotations.TestOnly -import software.aws.toolkits.jetbrains.UiConstraints -import software.aws.toolkits.jetbrains.core.credentials.CredentialManager -import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider -import software.aws.toolkits.jetbrains.datagrip.CREDENTIAL_ID_PROPERTY -import software.aws.toolkits.jetbrains.datagrip.REGION_ID_PROPERTY -import software.aws.toolkits.jetbrains.utils.ui.selected -import software.aws.toolkits.resources.message -import javax.swing.JPanel - -@Deprecated("Use AwsAuthWidget shim instead") // FIX_WHEN_MIN_IS_221 -abstract class AwsAuthWidgetBase(private val userFieldEnabled: Boolean) : DatabaseCredentialsAuthProviderUi.UserWidget() { - private val credentialSelector = CredentialProviderSelector() - private val regionSelector = RegionSelector() - - // These are defined in DataGrip and used in the url holder which is called in `updateFromUrl` - protected val hostParameter = "host" - protected val portParameter = "port" - - abstract fun getRegionFromUrl(url: String?): String? - abstract val serviceId: String - - open val rowCount: Int = 3 - open val columnCount: Int = 6 - - override fun createPanel(): JPanel { - val panel = JPanel(GridLayoutManager(rowCount, columnCount)) - addUserField(panel, 0) - - // Disable the user field if we treat it as immutable - myUserField.isEnabled = userFieldEnabled - - val credsLabel = JBLabel(message("aws_connection.credentials.label")) - val regionLabel = JBLabel(message("aws_connection.region.label")) - panel.add(credsLabel, UiConstraints.createLabelConstraints(1, 0, credsLabel.preferredSize.getWidth())) - panel.add(credentialSelector, UiConstraints.createSimpleConstraints(1, 1, 3)) - panel.add(regionLabel, UiConstraints.createLabelConstraints(2, 0, regionLabel.preferredSize.getWidth())) - panel.add(regionSelector, UiConstraints.createSimpleConstraints(2, 1, 3)) - - return panel - } - - override fun save(dataSource: LocalDataSource, copyCredentials: Boolean) { - super.save(dataSource, copyCredentials) - - DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, - CREDENTIAL_ID_PROPERTY, - credentialSelector.getSelectedCredentialsProvider() - ) - DataSourceUiUtil.putOrRemove( - dataSource.additionalProperties, - REGION_ID_PROPERTY, - regionSelector.selectedRegion?.id - ) - } - - override fun reset(dataSource: LocalDataSource, resetCredentials: Boolean) { - super.reset(dataSource, resetCredentials) - - val regionProvider = AwsRegionProvider.getInstance() - val allRegions = regionProvider.allRegionsForService(serviceId) - regionSelector.setRegions(allRegions.values.toMutableList()) - val regionId = dataSource.additionalProperties[REGION_ID_PROPERTY]?.nullize() - regionId?.let { - allRegions[regionId]?.let { region -> - regionSelector.selectedRegion = region - } - } - - val credentialManager = CredentialManager.getInstance() - credentialSelector.setCredentialsProviders(credentialManager.getCredentialIdentifiers()) - val credentialId = dataSource.additionalProperties[CREDENTIAL_ID_PROPERTY]?.nullize() - if (credentialId != null) { - val credentialIdentifierById = credentialManager.getCredentialIdentifierById(credentialId) - if (credentialIdentifierById != null) { - credentialSelector.setSelectedCredentialsProvider(credentialIdentifierById) - } else { - credentialSelector.setSelectedInvalidCredentialsProvider(credentialId) - } - } else { - credentialSelector.model.selectedItem = null - } - } - - override fun isPasswordChanged(): Boolean = false - - override fun onChanged(r: Runnable) { - // Tries to set username so if we don't have one, don't set - if (userFieldEnabled) { - super.onChanged(r) - } - } - - override fun updateFromUrl(holder: ParametersHolder) { - // Try to get region from url and set the region box on a best effort basis - val url = (holder as? UrlEditorModel)?.url - val regionId = getRegionFromUrl(url) - val region = AwsRegionProvider.getInstance().allRegions()[regionId] - region?.let { - regionSelector.selectedRegion = it - } - super.updateFromUrl(holder) - } - - @TestOnly - internal fun getSelectedCredential() = credentialSelector.getSelectedCredentialsProvider() - - @TestOnly - internal fun getSelectedRegion() = regionSelector.selected() -} diff --git a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidgetTest.kt b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidgetTest.kt index 35fa95b3076..d3f9dde0dce 100644 --- a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidgetTest.kt +++ b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/datagrip/auth/SecretsManagerAuthWidgetTest.kt @@ -3,7 +3,7 @@ package software.aws.toolkits.jetbrains.datagrip.auth -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.url.template.UrlEditorModel import com.intellij.testFramework.ProjectRule import com.intellij.testFramework.RuleChain @@ -72,7 +72,7 @@ class SecretsManagerAuthWidgetTest { @Test fun `Sets region from Redshift URL`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:redshift://redshift-cluster.host.$defaultRegion.redshift.amazonaws.com:5439/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) assertThat(widget.getSelectedRegion()?.id).isEqualTo(defaultRegion) @@ -80,7 +80,7 @@ class SecretsManagerAuthWidgetTest { @Test fun `Sets region from RDS URL`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:postgresql://abc.host.$defaultRegion.rds.amazonaws.com:5432/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) assertThat(widget.getSelectedRegion()?.id).isEqualTo(defaultRegion) @@ -88,7 +88,7 @@ class SecretsManagerAuthWidgetTest { @Test fun `Does not unset region on invalid url`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:postgresql://abc.host.$defaultRegion.rds.amazonaws.com:5432/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) val badUrl = "jdbc:postgresql://abc.host.1000000%invalidregion.rds.amazonaws.com:5432/dev" @@ -96,7 +96,7 @@ class SecretsManagerAuthWidgetTest { assertThat(widget.getSelectedRegion()?.id).isEqualTo(defaultRegion) } - private fun buildDataSource(hasSecret: Boolean = true, getUrlFromSecret: Boolean = false): LocalDataSource = mock { + private fun buildDataSource(hasSecret: Boolean = true, getUrlFromSecret: Boolean = false): DatabaseConnectionPoint = mock { on { additionalProperties } doAnswer { mutableMapOf().also { it[CREDENTIAL_ID_PROPERTY] = credentialId diff --git a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidgetTest.kt b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidgetTest.kt index 8a9021e9672..a897cca8288 100644 --- a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidgetTest.kt +++ b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/rds/auth/IamAuthWidgetTest.kt @@ -3,7 +3,8 @@ package software.aws.toolkits.jetbrains.services.rds.auth -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionConfig +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.url.template.UrlEditorModel import com.intellij.testFramework.ProjectRule import org.assertj.core.api.Assertions.assertThat @@ -76,7 +77,7 @@ class IamAuthWidgetTest { @Test fun `Sets region from URL`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:postgresql://abc.host.$defaultRegion.rds.amazonaws.com:5432/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) assertThat(widget.getSelectedRegion()?.id).isEqualTo(defaultRegion) @@ -84,7 +85,7 @@ class IamAuthWidgetTest { @Test fun `Does not unset region on invalid url`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:postgresql://abc.host.$defaultRegion.rds.amazonaws.com:5432/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) val badUrl = "jdbc:postgresql://abc.host.1000000%invalidregion.rds.amazonaws.com:5432/dev" @@ -94,9 +95,17 @@ class IamAuthWidgetTest { @Test fun `Save saves set signing host and port if set`() { - widget.reset(mock { on { additionalProperties } doReturn mapOf(RDS_SIGNING_HOST_PROPERTY to "host", RDS_SIGNING_PORT_PROPERTY to "port") }, false) + widget.reset( + mock { + on { additionalProperties } doReturn mapOf( + RDS_SIGNING_HOST_PROPERTY to "host", + RDS_SIGNING_PORT_PROPERTY to "port" + ) + }, + false + ) val m = mutableMapOf() - widget.save(mock { on { additionalProperties } doReturn m }, false) + widget.save(mock { on { additionalProperties } doReturn m }, false) assertThat(m[RDS_SIGNING_HOST_PROPERTY]).isEqualTo("host") assertThat(m[RDS_SIGNING_PORT_PROPERTY]).isEqualTo("port") } @@ -104,7 +113,7 @@ class IamAuthWidgetTest { @Test fun `Save saves null signing host and port if not set`() { val m = mutableMapOf() - widget.save(mock { on { additionalProperties } doReturn m }, false) + widget.save(mock { on { additionalProperties } doReturn m }, false) assertThat(m[RDS_SIGNING_HOST_PROPERTY]).isNull() assertThat(m[RDS_SIGNING_PORT_PROPERTY]).isNull() } @@ -112,7 +121,7 @@ class IamAuthWidgetTest { private fun buildDataSource( hasCredentials: Boolean = true, hasRegion: Boolean = true, - ): LocalDataSource = mock { + ): DatabaseConnectionPoint = mock { on { additionalProperties } doAnswer { val m = mutableMapOf() if (hasCredentials) { diff --git a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidgetTest.kt b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidgetTest.kt index 66a2758a690..0752fc00441 100644 --- a/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidgetTest.kt +++ b/plugins/toolkit/jetbrains-ultimate/tst/software/aws/toolkits/jetbrains/services/redshift/auth/IamAuthWidgetTest.kt @@ -3,7 +3,7 @@ package software.aws.toolkits.jetbrains.services.redshift.auth -import com.intellij.database.dataSource.LocalDataSource +import com.intellij.database.dataSource.DatabaseConnectionPoint import com.intellij.database.dataSource.url.template.UrlEditorModel import com.intellij.testFramework.ProjectRule import org.assertj.core.api.Assertions.assertThat @@ -56,7 +56,7 @@ class IamAuthWidgetTest { @Test fun `Does not unset region on invalid url`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:redshift://redshift-cluster.host.$defaultRegion.redshift.amazonaws.com:5439/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) val badUrl = "jdbc:redshift://redshift-cluster.host.100000%InvalidRegion.redshift.amazonaws.com:5439/dev" @@ -66,13 +66,13 @@ class IamAuthWidgetTest { @Test fun `Sets region from URL`() { - widget.reset(mock(), false) + widget.reset(mock(), false) val endpointUrl = "jdbc:redshift://redshift-cluster.host.$defaultRegion.redshift.amazonaws.com:5439/dev" widget.updateFromUrl(mock { on { url } doReturn endpointUrl }) assertThat(widget.getSelectedRegion()?.id).isEqualTo(defaultRegion) } - private fun buildDataSource(hasCluster: Boolean = true): LocalDataSource = mock { + private fun buildDataSource(hasCluster: Boolean = true): DatabaseConnectionPoint = mock { on { additionalProperties } doAnswer { mutableMapOf().also { it[CREDENTIAL_ID_PROPERTY] = credentialId