From 661d70ddb6c6a0775ae1f1bae9e2b9c5e6c50442 Mon Sep 17 00:00:00 2001 From: Maciej Kwidzinski Date: Tue, 11 Jan 2022 13:28:12 +0100 Subject: [PATCH 1/4] JPERF-729: Simplify encryption abstractions If we'll need to change the "encryption method" SQL without changing the "update password" SQL, then we can think about reintroducing some indirection. Right now it relies on passing the same `SshSqlClient`, the same schema name, and it creates more areas for mistakes than it saves by the decoupling. If the detection SQL is really problematic, then consumers can write their own `JiraUserPasswordOverridingDatabase` to opt-out short term. --- .../JiraUserPasswordEncryptor.kt | 40 ------- .../JiraUserPasswordOverridingDatabase.kt | 46 ++++---- ...raUserPasswordEncryptionTypeServiceTest.kt | 101 ------------------ .../JiraUserPasswordOverridingDatabaseTest.kt | 19 ++-- 4 files changed, 35 insertions(+), 171 deletions(-) delete mode 100644 src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordEncryptor.kt delete mode 100644 src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/DefaultJiraUserPasswordEncryptionTypeServiceTest.kt diff --git a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordEncryptor.kt b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordEncryptor.kt deleted file mode 100644 index ffa84a5a..00000000 --- a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordEncryptor.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.atlassian.performance.tools.infrastructure.api.database.passwordoverride - -import com.atlassian.performance.tools.infrastructure.database.SshSqlClient -import com.atlassian.performance.tools.ssh.api.SshConnection -import java.util.function.Function - -interface JiraUserPasswordEncryptor { - fun getEncryptedPassword(plainTextPassword: String): String -} - -interface JiraUserPasswordEncryptorProvider { - fun getEncryptor(ssh: SshConnection, sqlClient: SshSqlClient): JiraUserPasswordEncryptor -} - -class DefaultJiraUserPasswordEncryptorProvider( - private val jiraDatabaseSchemaName: String, - private val plainTextPasswordEncryptor: JiraUserPasswordEncryptor, - private val encryptedPasswordEncryptor: JiraUserPasswordEncryptor -) : JiraUserPasswordEncryptorProvider { - - override fun getEncryptor(ssh: SshConnection, sqlClient: SshSqlClient): JiraUserPasswordEncryptor { - val sqlResult = - sqlClient.runSql(ssh, "select attribute_value from ${jiraDatabaseSchemaName}.cwd_directory_attribute where attribute_name = 'user_encryption_method';").output - return when { - sqlResult.contains("plaintext") -> plainTextPasswordEncryptor - sqlResult.contains("atlassian-security") -> encryptedPasswordEncryptor - else -> throw RuntimeException("Unknown jira user password encryption type") - } - } -} - -class EncryptedJiraUserPasswordEncryptor( - private val passwordEncryptFunction: Function -) : JiraUserPasswordEncryptor { - override fun getEncryptedPassword(plainTextPassword: String) = passwordEncryptFunction.apply(plainTextPassword) -} - -class PlainTextJiraUserPasswordEncryptor : JiraUserPasswordEncryptor { - override fun getEncryptedPassword(plainTextPassword: String) = plainTextPassword -} diff --git a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt index b0ac37d8..b44a1956 100644 --- a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt +++ b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt @@ -14,8 +14,8 @@ class JiraUserPasswordOverridingDatabase internal constructor( private val sqlClient: SshSqlClient, private val username: String, private val jiraDatabaseSchemaName: String, - private val userPasswordPlainText: String, - private val userPasswordEncryptorProvider: JiraUserPasswordEncryptorProvider + private val plainTextPassword: String, + private val passwordEncryption: Function ) : Database { private val logger: Logger = LogManager.getLogger(this::class.java) @@ -26,17 +26,24 @@ class JiraUserPasswordOverridingDatabase internal constructor( ssh: SshConnection ) { databaseDelegate.start(jira, ssh) - val userPasswordEncryptor = userPasswordEncryptorProvider.getEncryptor(ssh, sqlClient) - val password = userPasswordEncryptor.getEncryptedPassword(userPasswordPlainText) - sqlClient.runSql(ssh, "UPDATE ${jiraDatabaseSchemaName}.cwd_user SET credential='$password' WHERE user_name='$username';") - logger.debug("Password for user '$username' updated to '${userPasswordPlainText}'") + val methodSelect = "SELECT attribute_value FROM $jiraDatabaseSchemaName.cwd_directory_attribute" + + " WHERE attribute_name = 'user_encryption_method';" + val encryptionMethod = sqlClient.runSql(ssh, methodSelect).output + val password = when { + encryptionMethod.contains("plaintext") -> plainTextPassword + encryptionMethod.contains("atlassian-security") -> passwordEncryption.apply(plainTextPassword) + else -> throw RuntimeException("Unknown jira user password encryption type") + } + val passwordUpdate = "UPDATE $jiraDatabaseSchemaName.cwd_user SET credential='$password'" + + " WHERE user_name='$username';" + sqlClient.runSql(ssh, passwordUpdate) + logger.debug("Password for user '$username' updated to '$plainTextPassword'") } - class Builder( private var databaseDelegate: Database, private var userPasswordPlainText: String, - private var userPasswordEncryptorProvider: JiraUserPasswordEncryptorProvider + private var passwordEncryption: Function ) { private var sqlClient: SshSqlClient = SshMysqlClient() private var jiraDatabaseSchemaName: String = "jiradb" @@ -46,39 +53,36 @@ class JiraUserPasswordOverridingDatabase internal constructor( fun username(username: String) = apply { this.username = username } fun userPasswordPlainText(userPassword: String) = apply { this.userPasswordPlainText = userPassword } fun sqlClient(sqlClient: SshSqlClient) = apply { this.sqlClient = sqlClient } - fun jiraDatabaseSchemaName(jiraDatabaseSchemaName: String) = apply { this.jiraDatabaseSchemaName = jiraDatabaseSchemaName } - fun userPasswordEncryptorProvider(userPasswordEncryptorProvider: JiraUserPasswordEncryptorProvider) = - apply { this.userPasswordEncryptorProvider = userPasswordEncryptorProvider } + fun jiraDatabaseSchemaName(jiraDatabaseSchemaName: String) = + apply { this.jiraDatabaseSchemaName = jiraDatabaseSchemaName } + fun passwordEncryption(passwordEncryption: Function) = + apply { this.passwordEncryption = passwordEncryption} fun build() = JiraUserPasswordOverridingDatabase( databaseDelegate = databaseDelegate, sqlClient = sqlClient, username = username, - userPasswordPlainText = userPasswordPlainText, - jiraDatabaseSchemaName = jiraDatabaseSchemaName, - userPasswordEncryptorProvider = userPasswordEncryptorProvider + plainTextPassword = userPasswordPlainText, + passwordEncryption = passwordEncryption, + jiraDatabaseSchemaName = jiraDatabaseSchemaName ) } } /** - * @param passwordEncryptFunction Based on [retrieving-the-jira-administrator](https://confluence.atlassian.com/jira/retrieving-the-jira-administrator-192836.html) + * @param passwordEncryption Based on [retrieving-the-jira-administrator](https://confluence.atlassian.com/jira/retrieving-the-jira-administrator-192836.html) * to encode the password in Jira format use [com.atlassian.crowd.password.encoder.AtlassianSecurityPasswordEncoder](https://docs.atlassian.com/atlassian-crowd/4.2.2/com/atlassian/crowd/password/encoder/AtlassianSecurityPasswordEncoder.html) * from the [com.atlassian.crowd.crowd-password-encoders](https://mvnrepository.com/artifact/com.atlassian.crowd/crowd-password-encoders/4.2.2). * */ -fun Database.withAdminPassword(adminPasswordPlainText: String, passwordEncryptFunction: Function): Database { +fun Database.withAdminPassword(adminPasswordPlainText: String, passwordEncryption: Function): Database { val jiraDatabaseSchemaName = "jiradb" val sqlClient = SshMysqlClient() return JiraUserPasswordOverridingDatabase.Builder( databaseDelegate = this, userPasswordPlainText = adminPasswordPlainText, - userPasswordEncryptorProvider = DefaultJiraUserPasswordEncryptorProvider( - jiraDatabaseSchemaName = jiraDatabaseSchemaName, - plainTextPasswordEncryptor = PlainTextJiraUserPasswordEncryptor(), - encryptedPasswordEncryptor = EncryptedJiraUserPasswordEncryptor(passwordEncryptFunction) - ) + passwordEncryption = passwordEncryption ) .jiraDatabaseSchemaName(jiraDatabaseSchemaName) .sqlClient(sqlClient) diff --git a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/DefaultJiraUserPasswordEncryptionTypeServiceTest.kt b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/DefaultJiraUserPasswordEncryptionTypeServiceTest.kt deleted file mode 100644 index 3f3acf17..00000000 --- a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/DefaultJiraUserPasswordEncryptionTypeServiceTest.kt +++ /dev/null @@ -1,101 +0,0 @@ -package com.atlassian.performance.tools.infrastructure.api.database.passwordoverride - -import com.atlassian.performance.tools.infrastructure.mock.MockSshSqlClient -import com.atlassian.performance.tools.infrastructure.mock.RememberingSshConnection -import com.atlassian.performance.tools.ssh.api.SshConnection -import org.assertj.core.api.Assertions.assertThat -import org.junit.Before -import org.junit.Test -import java.util.function.Function - -class DefaultJiraUserPasswordEncryptionTypeServiceTest { - private lateinit var sqlClient: MockSshSqlClient - private lateinit var sshConnection: RememberingSshConnection - private lateinit var tested: JiraUserPasswordEncryptorProvider - private val plainTextPasswordEncryptor: JiraUserPasswordEncryptor = PlainTextJiraUserPasswordEncryptor() - private val encryptedPasswordEncryptor: JiraUserPasswordEncryptor = EncryptedJiraUserPasswordEncryptor(Function { "" }) - - @Before - fun setup() { - sqlClient = MockSshSqlClient() - sshConnection = RememberingSshConnection() - tested = DefaultJiraUserPasswordEncryptorProvider( - jiraDatabaseSchemaName = "jiradb", - plainTextPasswordEncryptor = plainTextPasswordEncryptor, - encryptedPasswordEncryptor = encryptedPasswordEncryptor - ) - } - - @Test - fun shouldQueryEncryptionMethod() { - // given - sqlClient.queueReturnedSqlCommandResult( - SshConnection.SshResult( - exitStatus = 0, - output = """attribute_value - atlassian-security -""".trimMargin(), - errorOutput = "" - ) - ) - // when - tested.getEncryptor(sshConnection, sqlClient) - // then - assertThat(sqlClient.getLog()) - .`as`("sql queries executed") - .containsExactly( - "select attribute_value from jiradb.cwd_directory_attribute where attribute_name = 'user_encryption_method';" - ) - } - - @Test - fun shouldThrowExceptionWhenUnknownEncryption() { - // when - var exception: RuntimeException? = null - try { - tested.getEncryptor(sshConnection, sqlClient) - } catch (e: RuntimeException) { - exception = e - } - // then - assertThat(exception).isNotNull() - assertThat(exception!!.message).isEqualTo("Unknown jira user password encryption type") - } - - @Test - fun shouldReturnEncrypted() { - // given - sqlClient.queueReturnedSqlCommandResult( - SshConnection.SshResult( - exitStatus = 0, - output = """attribute_value - atlassian-security -""".trimMargin(), - errorOutput = "" - ) - ) - // when - val passwordEncryptor = tested.getEncryptor(sshConnection, sqlClient) - // then - assertThat(passwordEncryptor).isEqualTo(encryptedPasswordEncryptor) - } - - @Test - fun shouldReturnPlainText() { - // given - sqlClient.queueReturnedSqlCommandResult( - SshConnection.SshResult( - exitStatus = 0, - output = """attribute_value - plaintext -""".trimMargin(), - errorOutput = "" - ) - ) - // when - val passwordEncryptor = tested.getEncryptor(sshConnection, sqlClient) - // then - assertThat(passwordEncryptor).isEqualTo(plainTextPasswordEncryptor) - } - -} \ No newline at end of file diff --git a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt index 05fb5514..f513e92b 100644 --- a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt +++ b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt @@ -1,7 +1,6 @@ package com.atlassian.performance.tools.infrastructure.api.database.passwordoverride import com.atlassian.performance.tools.infrastructure.api.database.Database -import com.atlassian.performance.tools.infrastructure.database.SshSqlClient import com.atlassian.performance.tools.infrastructure.mock.MockSshSqlClient import com.atlassian.performance.tools.infrastructure.mock.RememberingDatabase import com.atlassian.performance.tools.infrastructure.mock.RememberingSshConnection @@ -10,6 +9,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.Before import org.junit.Test import java.net.URI +import java.util.function.Function class JiraUserPasswordOverridingDatabaseTest { @@ -31,17 +31,18 @@ class JiraUserPasswordOverridingDatabaseTest { .Builder( databaseDelegate = underlyingDatabase, userPasswordPlainText = samplePassword, - userPasswordEncryptorProvider = object : JiraUserPasswordEncryptorProvider { - override fun getEncryptor(ssh: SshConnection, sqlClient: SshSqlClient): JiraUserPasswordEncryptor { - return object : JiraUserPasswordEncryptor { - override fun getEncryptedPassword(plainTextPassword: String) = expectedEncryptedPassword - } - } - } + passwordEncryption = Function { expectedEncryptedPassword } ) .sqlClient(sqlClient) .jiraDatabaseSchemaName("jira") .build() + sqlClient.queueReturnedSqlCommandResult( + SshConnection.SshResult( + exitStatus = 0, + output = "atlassian-security", + errorOutput = "" + ) + ) } @Test @@ -74,7 +75,7 @@ class JiraUserPasswordOverridingDatabaseTest { // then assertThat(sqlClient.getLog()) .`as`("sql queries executed") - .containsExactly( + .contains( "UPDATE jira.cwd_user SET credential='${expectedEncryptedPassword}' WHERE user_name='admin';" ) } From e09bc48692a6679856d32faa393efed40421e914 Mon Sep 17 00:00:00 2001 From: Maciej Kwidzinski Date: Tue, 11 Jan 2022 13:38:01 +0100 Subject: [PATCH 2/4] JPERF-729: Reuse defaults from the builder --- CHANGELOG.md | 1 + .../JiraUserPasswordOverridingDatabase.kt | 23 ++++++++----------- .../JiraUserPasswordOverridingDatabaseTest.kt | 10 ++++---- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fb8d042..d7583289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Dropping a requirement of a major version of a dependency is a new contract. [Unreleased]: https://github.com/atlassian/infrastructure/compare/release-4.18.0...master ### Added - `JiraUserPasswordOverridingDatabase` to support providing custom admin password during database setup [JPERF-729] +- Add static `Database.overridePassword` (a Kotlin extension). [JPERF-729]: https://ecosystem.atlassian.net/browse/JPERF-729 diff --git a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt index b44a1956..097518b0 100644 --- a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt +++ b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt @@ -56,7 +56,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( fun jiraDatabaseSchemaName(jiraDatabaseSchemaName: String) = apply { this.jiraDatabaseSchemaName = jiraDatabaseSchemaName } fun passwordEncryption(passwordEncryption: Function) = - apply { this.passwordEncryption = passwordEncryption} + apply { this.passwordEncryption = passwordEncryption } fun build() = JiraUserPasswordOverridingDatabase( databaseDelegate = databaseDelegate, @@ -74,17 +74,12 @@ class JiraUserPasswordOverridingDatabase internal constructor( * @param passwordEncryption Based on [retrieving-the-jira-administrator](https://confluence.atlassian.com/jira/retrieving-the-jira-administrator-192836.html) * to encode the password in Jira format use [com.atlassian.crowd.password.encoder.AtlassianSecurityPasswordEncoder](https://docs.atlassian.com/atlassian-crowd/4.2.2/com/atlassian/crowd/password/encoder/AtlassianSecurityPasswordEncoder.html) * from the [com.atlassian.crowd.crowd-password-encoders](https://mvnrepository.com/artifact/com.atlassian.crowd/crowd-password-encoders/4.2.2). - * */ -fun Database.withAdminPassword(adminPasswordPlainText: String, passwordEncryption: Function): Database { - val jiraDatabaseSchemaName = "jiradb" - val sqlClient = SshMysqlClient() - return JiraUserPasswordOverridingDatabase.Builder( - databaseDelegate = this, - userPasswordPlainText = adminPasswordPlainText, - passwordEncryption = passwordEncryption - ) - .jiraDatabaseSchemaName(jiraDatabaseSchemaName) - .sqlClient(sqlClient) - .build() -} \ No newline at end of file +fun Database.overridePassword( + adminPasswordPlainText: String, + passwordEncryption: Function +): JiraUserPasswordOverridingDatabase.Builder = JiraUserPasswordOverridingDatabase.Builder( + databaseDelegate = this, + userPasswordPlainText = adminPasswordPlainText, + passwordEncryption = passwordEncryption +) \ No newline at end of file diff --git a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt index f513e92b..5dba1a19 100644 --- a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt +++ b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt @@ -27,12 +27,10 @@ class JiraUserPasswordOverridingDatabaseTest { underlyingDatabase = RememberingDatabase() sshConnection = RememberingSshConnection() sqlClient = MockSshSqlClient() - database = JiraUserPasswordOverridingDatabase - .Builder( - databaseDelegate = underlyingDatabase, - userPasswordPlainText = samplePassword, - passwordEncryption = Function { expectedEncryptedPassword } - ) + database = underlyingDatabase.overridePassword( + samplePassword, + Function { expectedEncryptedPassword } + ) .sqlClient(sqlClient) .jiraDatabaseSchemaName("jira") .build() From a43dc28ca40de4fd1293c806c6b07b7fc5abeb7f Mon Sep 17 00:00:00 2001 From: Maciej Kwidzinski Date: Tue, 11 Jan 2022 13:42:17 +0100 Subject: [PATCH 3/4] JPERF-729: Add default password to override --- .../JiraUserPasswordOverridingDatabase.kt | 8 +++----- .../JiraUserPasswordOverridingDatabaseTest.kt | 6 ++---- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt index 097518b0..85c95e6f 100644 --- a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt +++ b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt @@ -42,16 +42,16 @@ class JiraUserPasswordOverridingDatabase internal constructor( class Builder( private var databaseDelegate: Database, - private var userPasswordPlainText: String, private var passwordEncryption: Function ) { private var sqlClient: SshSqlClient = SshMysqlClient() private var jiraDatabaseSchemaName: String = "jiradb" private var username: String = "admin" + private var plainTextPassword: String = "admin" fun databaseDelegate(databaseDelegate: Database) = apply { this.databaseDelegate = databaseDelegate } fun username(username: String) = apply { this.username = username } - fun userPasswordPlainText(userPassword: String) = apply { this.userPasswordPlainText = userPassword } + fun plainTextPassword(passwordPlainText: String) = apply { this.plainTextPassword = passwordPlainText } fun sqlClient(sqlClient: SshSqlClient) = apply { this.sqlClient = sqlClient } fun jiraDatabaseSchemaName(jiraDatabaseSchemaName: String) = apply { this.jiraDatabaseSchemaName = jiraDatabaseSchemaName } @@ -62,7 +62,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( databaseDelegate = databaseDelegate, sqlClient = sqlClient, username = username, - plainTextPassword = userPasswordPlainText, + plainTextPassword = plainTextPassword, passwordEncryption = passwordEncryption, jiraDatabaseSchemaName = jiraDatabaseSchemaName ) @@ -76,10 +76,8 @@ class JiraUserPasswordOverridingDatabase internal constructor( * from the [com.atlassian.crowd.crowd-password-encoders](https://mvnrepository.com/artifact/com.atlassian.crowd/crowd-password-encoders/4.2.2). */ fun Database.overridePassword( - adminPasswordPlainText: String, passwordEncryption: Function ): JiraUserPasswordOverridingDatabase.Builder = JiraUserPasswordOverridingDatabase.Builder( databaseDelegate = this, - userPasswordPlainText = adminPasswordPlainText, passwordEncryption = passwordEncryption ) \ No newline at end of file diff --git a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt index 5dba1a19..a06fdfda 100644 --- a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt +++ b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt @@ -27,10 +27,8 @@ class JiraUserPasswordOverridingDatabaseTest { underlyingDatabase = RememberingDatabase() sshConnection = RememberingSshConnection() sqlClient = MockSshSqlClient() - database = underlyingDatabase.overridePassword( - samplePassword, - Function { expectedEncryptedPassword } - ) + database = underlyingDatabase.overridePassword(Function { expectedEncryptedPassword }) + .plainTextPassword(samplePassword) .sqlClient(sqlClient) .jiraDatabaseSchemaName("jira") .build() From 2adebed79e00bc56c9454233f33ad3dc3c2e7e66 Mon Sep 17 00:00:00 2001 From: Maciej Kwidzinski Date: Tue, 11 Jan 2022 13:44:59 +0100 Subject: [PATCH 4/4] JPERF-729: Clean up the constructor --- .../JiraUserPasswordOverridingDatabase.kt | 19 +++++++++---------- .../JiraUserPasswordOverridingDatabaseTest.kt | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt index 85c95e6f..1363b761 100644 --- a/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt +++ b/src/main/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabase.kt @@ -9,13 +9,13 @@ import org.apache.logging.log4j.Logger import java.net.URI import java.util.function.Function -class JiraUserPasswordOverridingDatabase internal constructor( +class JiraUserPasswordOverridingDatabase private constructor( private val databaseDelegate: Database, - private val sqlClient: SshSqlClient, private val username: String, - private val jiraDatabaseSchemaName: String, private val plainTextPassword: String, - private val passwordEncryption: Function + private val passwordEncryption: Function, + private val sqlClient: SshSqlClient, + private val schema: String ) : Database { private val logger: Logger = LogManager.getLogger(this::class.java) @@ -26,7 +26,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( ssh: SshConnection ) { databaseDelegate.start(jira, ssh) - val methodSelect = "SELECT attribute_value FROM $jiraDatabaseSchemaName.cwd_directory_attribute" + + val methodSelect = "SELECT attribute_value FROM $schema.cwd_directory_attribute" + " WHERE attribute_name = 'user_encryption_method';" val encryptionMethod = sqlClient.runSql(ssh, methodSelect).output val password = when { @@ -34,7 +34,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( encryptionMethod.contains("atlassian-security") -> passwordEncryption.apply(plainTextPassword) else -> throw RuntimeException("Unknown jira user password encryption type") } - val passwordUpdate = "UPDATE $jiraDatabaseSchemaName.cwd_user SET credential='$password'" + + val passwordUpdate = "UPDATE $schema.cwd_user SET credential='$password'" + " WHERE user_name='$username';" sqlClient.runSql(ssh, passwordUpdate) logger.debug("Password for user '$username' updated to '$plainTextPassword'") @@ -45,7 +45,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( private var passwordEncryption: Function ) { private var sqlClient: SshSqlClient = SshMysqlClient() - private var jiraDatabaseSchemaName: String = "jiradb" + private var schema: String = "jiradb" private var username: String = "admin" private var plainTextPassword: String = "admin" @@ -53,8 +53,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( fun username(username: String) = apply { this.username = username } fun plainTextPassword(passwordPlainText: String) = apply { this.plainTextPassword = passwordPlainText } fun sqlClient(sqlClient: SshSqlClient) = apply { this.sqlClient = sqlClient } - fun jiraDatabaseSchemaName(jiraDatabaseSchemaName: String) = - apply { this.jiraDatabaseSchemaName = jiraDatabaseSchemaName } + fun schema(jiraDatabaseSchemaName: String) = apply { this.schema = jiraDatabaseSchemaName } fun passwordEncryption(passwordEncryption: Function) = apply { this.passwordEncryption = passwordEncryption } @@ -64,7 +63,7 @@ class JiraUserPasswordOverridingDatabase internal constructor( username = username, plainTextPassword = plainTextPassword, passwordEncryption = passwordEncryption, - jiraDatabaseSchemaName = jiraDatabaseSchemaName + schema = schema ) } diff --git a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt index a06fdfda..7f8d377a 100644 --- a/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt +++ b/src/test/kotlin/com/atlassian/performance/tools/infrastructure/api/database/passwordoverride/JiraUserPasswordOverridingDatabaseTest.kt @@ -30,7 +30,7 @@ class JiraUserPasswordOverridingDatabaseTest { database = underlyingDatabase.overridePassword(Function { expectedEncryptedPassword }) .plainTextPassword(samplePassword) .sqlClient(sqlClient) - .jiraDatabaseSchemaName("jira") + .schema("jira") .build() sqlClient.queueReturnedSqlCommandResult( SshConnection.SshResult(