8000 SSLMode support for MysqlConnectionFactoryProvider · jasync-sql/jasync-sql@f820caa · GitHub
[go: up one dir, main page]

Skip to content

Commit f820caa

Browse files
author
Tomasz Kurylek
committed
SSLMode support for MysqlConnectionFactoryProvider
Fixes #337
1 parent 5eae3d2 commit f820caa

File tree

4 files changed

+182
-1
lines changed

4 files changed

+182
-1
lines changed

r2dbc-mysql/src/main/java/MysqlConnectionFactoryProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ class MysqlConnectionFactoryProvider : ConnectionFactoryProvider {
7474
database = connectionFactoryOptions.getValue(DATABASE) as String?,
7575
applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME) as String?,
7676
connectionTimeout = (connectionFactoryOptions.getValue(CONNECT_TIMEOUT) as Duration?)?.toMillis()?.toInt() ?: 5000,
77-
queryTimeout = connectionFactoryOptions.getValue(QUERY_TIMEOUT) as Duration?
77+
queryTimeout = connectionFactoryOptions.getValue(QUERY_TIMEOUT) as Duration?,
78+
ssl = MysqlSSLConfigurationFactory.create(connectionFactoryOptions)
7879
)
7980
return JasyncConnectionFactory(MySQLConnectionFactory(configuration))
8081
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.github.jasync.r2dbc.mysql
2+
3+
import com.github.jasync.sql.db.SSLConfiguration
4+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Disable
5+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Prefer
6+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Require
7+
import com.github.jasync.sql.db.SSLConfiguration.Mode.VerifyCA
8+
import com.github.jasync.sql.db.SSLConfiguration.Mode.VerifyFull
9+
import io.r2dbc.spi.ConnectionFactoryOptions
10+
import io.r2dbc.spi.Option
11+
12+
object MysqlSSLConfigurationFactory {
13+
14+
private val SSL_MODE_OPTION = Option.valueOf<String>("sslMode")
15+
private val SSL_MODE_MAP = mapOf(
16+
"disabled" to Disable,
17+
"preferred" to Prefer,
18+
"required" to Require,
19+
"verify_ca" to VerifyCA,
20+
"verify_identity" to VerifyFull
21+
)
22+
23+
fun create(options: ConnectionFactoryOptions): SSLConfiguration {
24+
if (!options.hasOption(ConnectionFactoryOptions.SSL)) {
25+
return SSLConfiguration(mode = Disable)
26+
}
27+
if (!options.hasOption(SSL_MODE_OPTION)) {
28+
return SSLConfiguration(mode = Prefer)
29+
}
30+
val sslMode = options.getValue(SSL_MODE_OPTION) as String
31+
return SSLConfiguration(mode = SSL_MODE_MAP.getOrDefault(sslMode.lowercase(), Prefer))
32+
}
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.jasync.r2dbc.mysql
2+
3+
import com.github.jasync.sql.db.SSLConfiguration
4+
import io.mockk.every
5+
import io.mockk.mockkObject
6+
import io.mockk.verify
7+
import io.r2dbc.spi.ConnectionFactoryOptions
8+
import org.junit.Test
9+
10+
internal class MysqlConnectionFactoryProviderTest {
11+
12+
private val provider = MysqlConnectionFactoryProvider()
13+
14+
@Test
15+
fun shouldCreateMysqlConnectionWithMysqlSSLConfigurationFactory() {
16+
// given
17+
mockkObject(MysqlSSLConfigurationFactory)
18+
every { MysqlSSLConfigurationFactory.create(any()) } returns SSLConfiguration()
19+
20+
val options =
21+
ConnectionFactoryOptions.parse("r2dbc:mysql://user@host:443/")
22+
23+
// when
24+
provider.create(options)
25+
26+
// then
27+
verify {
28+
MysqlSSLConfigurationFactory.create(options)
29+
}
30+
}
31+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.github.jasync.r2dbc.mysql
2+
3+
import com.github.jasync.sql.db.SSLConfiguration
4+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Disable
5+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Prefer
6+
import com.github.jasync.sql.db.SSLConfiguration.Mode.Require
7+
import com.github.jasync.sql.db.SSLConfiguration.Mode.VerifyCA
8+
import com.github.jasync.sql.db.SSLConfiguration.Mode.VerifyFull
9+
import io.r2dbc.spi.ConnectionFactoryOptions
10+
import io.r2dbc.spi.ConnectionFactoryOptions.SSL
11+
import io.r2dbc.spi.Option
12+
import org.junit.Test
13+
import org.junit.runner.RunWith
14+
import org.junit.runners.Parameterized
15+
import kotlin.test.assertEquals
16+
17+
@RunWith(Parameterized::class)
18+
internal class MysqlSSLConfigurationFactoryTest(
19+
private val options: ConnectionFactoryOptions,
20+
private val expectedSSLConfiguration: SSLConfiguration,
21+
private val message: String
22+
) {
23+
24+
companion object {
25+
26+
private val SSL_MODE_OPTION = Option.valueOf<String>("sslMode")
27+
28+
@JvmStatic
29+
@Parameterized.Parameters
30+
fun data() = listOf(
31+
createTestParams(
32+
options = ConnectionFactoryOptions.builder().build(),
33+
expected = SSLConfiguration(),
34+
message = "sslMode should be 'disabled' for non-secure protocol"
35+
),
36+
createTestParams(
37+
options = ConnectionFactoryOptions.builder()
38+
.option(SSL, true)
39+
.build(),
40+
expected = SSLConfiguration(mode = Prefer),
41+
message = "sslMode should be 'preferred' by default"
42+
),
43+
createTestParams(
44+
options = ConnectionFactoryOptions.builder()
45+
.option(SSL, true)
46+
.option(SSL_MODE_OPTION, "invalid")
47+
.build(),
48+
expected = SSLConfiguration(mode = Prefer),
49+
message = "sslMode should be 'preferred' for invalid value"
50+
),
51+
createTestParams(
52+
options = ConnectionFactoryOptions.builder()
53+
.option(SSL, true)
54+
.option(SSL_MODE_OPTION, "REQUIRED")
55+
.build(),
56+
expected = SSLConfiguration(mode = Require),
57+
message = "sslMode should be case insensitive"
58+
),
59+
createTestParams(
60+
options = ConnectionFactoryOptions.builder()
61+
.option(SSL, true)
62+
.option(SSL_MODE_OPTION, "disabled")
63+
.build(),
64+
expected = SSLConfiguration(mode = Disable),
65+
message = "sslMode should be 'disabled'"
66+
),
67+
createTestParams(
68+
options = ConnectionFactoryOptions.builder()
69+
.option(SSL, true)
70+
.option(SSL_MODE_OPTION, "preferred")
71+
.build(),
72+
expected = SSLConfiguration(mode = Prefer),
73+
message = "sslMode should be 'preferred'"
74+
),
75+
createTestParams(
76+
options = ConnectionFactoryOptions.builder()
77+
.option(SSL, true)
78+
.option(SSL_MODE_OPTION, "required")
79+
.build(),
80+
expected = SSLConfiguration(mode = Require),
81+
message = "sslMode should be 'required'"
82+
),
83+
createTestParams(
84+
options = ConnectionFactoryOptions.builder()
85+
.option(SSL, true)
86+
.option(SSL_MODE_OPTION, "verify_ca")
87+
.build(),
88+
expected = SSLConfiguration(mode = VerifyCA),
89+
message = "sslMode should be 'verify_ca'"
90+
),
91+
createTestParams(
92+
options = ConnectionFactoryOptions.builder()
93+
.option(SSL, true)
94+
.option(SSL_MODE_OPTION, "verify_identity")
95+
.build(),
96+
expected = SSLConfiguration(mode = VerifyFull),
97+
message = "sslMode should be 'verify_identity'"
98+
),
99+
)
100+
101+
private fun createTestParams(
102+
options: ConnectionFactoryOptions,
103+
expected: SSLConfiguration,
104+
message: String
105+
) = arrayOf(options, expected, message)
106+
}
107+
108+
@Test
109+
fun shouldCreateProperSSLConfiguration() {
110+
// when
111+
val result = MysqlSSLConfigurationFactory.create(options)
112+
113+
// then
114+
assertEquals(expectedSSLConfiguration, result, message)
115+
}
116+
}

0 commit comments

Comments
 (0)
0