Skip to content

Commit 02ee7ab

Browse files
committed
Made fixes and added to integration test
Signed-off-by: S V <vats02581@gmail.com>
1 parent d911718 commit 02ee7ab

File tree

8 files changed

+54
-32
lines changed

8 files changed

+54
-32
lines changed

r2dbc-mysql/src/main/java/io/asyncer/r2dbc/mysql/InitFlow.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,12 @@ final class InitFlow {
126126
* @param password the password of the {@code user}.
127127
* @param compressionAlgorithms the list of compression algorithms.
128128
* @param zstdCompressionLevel the zstd compression level.
129+
* @param serverRSAPublicKeyFile the local file path of the MySQL server's public key
129130
* @return a {@link Mono} that indicates the initialization is done, or an error if the initialization failed.
130131
*/
131132
static Mono<Void> initHandshake(Client client, SslMode sslMode, String database, String user,
132133
@Nullable CharSequence password, Set<CompressionAlgorithm> compressionAlgorithms, int zstdCompressionLevel,
133-
@Nullable String serverRsaPublicKeyFile) {
134+
@Nullable String serverRSAPublicKeyFile) {
134135
return client.exchange(new HandshakeExchangeable(
135136
client,
136137
sslMode,
@@ -139,7 +140,7 @@ static Mono<Void> initHandshake(Client client, SslMode sslMode, String database,
139140
password,
140141
compressionAlgorithms,
141142
zstdCompressionLevel,
142-
serverRsaPublicKeyFile
143+
serverRSAPublicKeyFile
143144
)).then();
144145
}
145146

@@ -514,11 +515,11 @@ final class HandshakeExchangeable extends FluxExchangeable<Void> {
514515
private boolean sslCompleted;
515516

516517
@Nullable
517-
private String serverRsaPublicKeyFile;
518+
private String serverRSAPublicKeyFile;
518519

519520
HandshakeExchangeable(Client client, SslMode sslMode, String database, String user,
520521
@Nullable CharSequence password, Set<CompressionAlgorithm> compressions,
521-
int zstdCompressionLevel, @Nullable String serverRsaPublicKeyFile) {
522+
int zstdCompressionLevel, @Nullable String serverRSAPublicKeyFile) {
522523
this.client = client;
523524
this.sslMode = sslMode;
524525
this.database = database;
@@ -527,7 +528,7 @@ final class HandshakeExchangeable extends FluxExchangeable<Void> {
527528
this.compressions = compressions;
528529
this.zstdCompressionLevel = zstdCompressionLevel;
529530
this.sslCompleted = sslMode == SslMode.TUNNEL;
530-
this.serverRsaPublicKeyFile = serverRsaPublicKeyFile;
531+
this.serverRSAPublicKeyFile = serverRSAPublicKeyFile;
531532
}
532533

533534
@Override
@@ -611,9 +612,10 @@ private AuthResponse createAuthResponse(String phase) {
611612
MySqlAuthProvider authProvider = getAndNextProvider();
612613

613614
if (authProvider.isSslNecessary() && !sslCompleted) {
614-
if (serverRsaPublicKeyFile != null && sslMode.equals(SslMode.DISABLED)) {
615+
if (serverRSAPublicKeyFile != null && sslMode.equals(SslMode.DISABLED)) {
615616
return new AuthResponse(MySqlAuthProvider.rsaEncryption(authProvider.authentication(
616-
password, salt, client.getContext().getClientCollation()), serverRsaPublicKeyFile));
617+
password, salt, client.getContext().getClientCollation()), serverRSAPublicKeyFile,
618+
client.getContext().getServerVersion()));
617619
}
618620
throw new R2dbcPermissionDeniedException(authFails(authProvider.getType(), phase), CLI_SPECIFIC);
619621
}
@@ -719,14 +721,14 @@ private MySqlAuthProvider getAndNextProvider() {
719721
private HandshakeResponse createHandshakeResponse(Capability capability) {
720722
MySqlAuthProvider authProvider = getAndNextProvider();
721723

722-
if (authProvider.isSslNecessary() && !sslCompleted && serverRsaPublicKeyFile == null) {
724+
if (authProvider.isSslNecessary() && !sslCompleted && serverRSAPublicKeyFile == null) {
723725
throw new R2dbcPermissionDeniedException(authFails(authProvider.getType(), "handshake"), CLI_SPECIFIC);
724726
}
725727

726728
byte[] authorization = authProvider.authentication(password, salt, client.getContext().getClientCollation());
727729

728730
if (authProvider.isSslNecessary() && !sslCompleted && sslMode.equals(SslMode.DISABLED)) {
729-
authorization = MySqlAuthProvider.rsaEncryption(authorization, serverRsaPublicKeyFile);
731+
authorization = MySqlAuthProvider.rsaEncryption(authorization, serverRSAPublicKeyFile, client.getContext().getServerVersion());
730732
}
731733

732734
String authType = authProvider.getType();

r2dbc-mysql/src/main/java/io/asyncer/r2dbc/mysql/MySqlConnectionConfiguration.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public final class MySqlConnectionConfiguration {
137137
private final boolean tinyInt1isBit;
138138

139139
@Nullable
140-
private final String serverRsaPublicKeyFile;
140+
private final String serverRSAPublicKeyFile;
141141

142142
private MySqlConnectionConfiguration(
143143
boolean isHost, String domain, int port, MySqlSslConfiguration ssl,
@@ -156,7 +156,7 @@ private MySqlConnectionConfiguration(
156156
Extensions extensions, @Nullable Publisher<String> passwordPublisher,
157157
@Nullable AddressResolverGroup<?> resolver,
158158
boolean metrics,
159-
boolean tinyInt1isBit, @Nullable String serverRsaPublicKeyFile) {
159+
boolean tinyInt1isBit, @Nullable String serverRSAPublicKeyFile) {
160160
this.isHost = isHost;
161161
this.domain = domain;
162162
this.port = port;
@@ -188,7 +188,7 @@ private MySqlConnectionConfiguration(
188188
this.resolver = resolver;
189189
this.metrics = metrics;
190190
this.tinyInt1isBit = tinyInt1isBit;
191-
this.serverRsaPublicKeyFile = serverRsaPublicKeyFile;
191+
this.serverRSAPublicKeyFile = serverRSAPublicKeyFile;
192192
}
193193

194194
/**
@@ -333,8 +333,8 @@ boolean isTinyInt1isBit() {
333333
}
334334

335335
@Nullable
336-
String getServerRsaPublicKeyFile() {
337-
return serverRsaPublicKeyFile;
336+
String getServerRSAPublicKeyFile() {
337+
return serverRSAPublicKeyFile;
338338
}
339339

340340
@Override
@@ -377,7 +377,7 @@ public boolean equals(Object o) {
377377
Objects.equals(resolver, that.resolver) &&
378378
metrics == that.metrics &&
379379
tinyInt1isBit == that.tinyInt1isBit &&
380-
serverRsaPublicKeyFile.equals(that.serverRsaPublicKeyFile);
380+
serverRSAPublicKeyFile.equals(that.serverRSAPublicKeyFile);
381381
}
382382

383383
@Override
@@ -393,7 +393,7 @@ public int hashCode() {
393393
queryCacheSize, prepareCacheSize,
394394
compressionAlgorithms, zstdCompressionLevel,
395395
loopResources, extensions, passwordPublisher, resolver, metrics, tinyInt1isBit,
396-
serverRsaPublicKeyFile);
396+
serverRSAPublicKeyFile);
397397
}
398398

399399
@Override
@@ -430,7 +430,7 @@ private String buildCommonToStringPart() {
430430
", resolver=" + resolver +
431431
", metrics=" + metrics +
432432
", tinyInt1isBit=" + tinyInt1isBit +
433-
", serverRsaPublicKeyFile=" + serverRsaPublicKeyFile;
433+
", serverRsaPublicKeyFile=" + serverRSAPublicKeyFile;
434434
}
435435

436436
/**
@@ -535,7 +535,7 @@ public static final class Builder {
535535
private boolean tinyInt1isBit = true;
536536

537537
@Nullable
538-
private String serverRsaPublicKeyFile;
538+
private String serverRSAPublicKeyFile;
539539

540540
/**
541541
* Builds an immutable {@link MySqlConnectionConfiguration} with current options.
@@ -572,7 +572,7 @@ public MySqlConnectionConfiguration build() {
572572
localInfileBufferSize, queryCacheSize, prepareCacheSize,
573573
compressionAlgorithms, zstdCompressionLevel, loopResources,
574574
Extensions.from(extensions, autodetectExtensions), passwordPublisher, resolver, metrics, tinyInt1isBit,
575-
serverRsaPublicKeyFile);
575+
serverRSAPublicKeyFile);
576576
}
577577

578578
/**
@@ -1260,8 +1260,8 @@ public Builder tinyInt1isBit(boolean tinyInt1isBit) {
12601260
* @return this {@link Builder}
12611261
* @since 1.4.2
12621262
*/
1263-
public Builder serverRsaPublicKeyFile(@Nullable String serverRsaPublicKeyFile) {
1264-
this.serverRsaPublicKeyFile = serverRsaPublicKeyFile;
1263+
public Builder serverRSAPublicKeyFile(@Nullable String serverRSAPublicKeyFile) {
1264+
this.serverRSAPublicKeyFile = serverRSAPublicKeyFile;
12651265
return this;
12661266
}
12671267

r2dbc-mysql/src/main/java/io/asyncer/r2dbc/mysql/MySqlConnectionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private static Mono<MySqlConnection> getMySqlConnection(
163163
password,
164164
configuration.getCompressionAlgorithms(),
165165
configuration.getZstdCompressionLevel(),
166-
configuration.getServerRsaPublicKeyFile()
166+
configuration.getServerRSAPublicKeyFile()
167167
).then(InitFlow.initSession(
168168
client,
169169
sessionDb,

r2dbc-mysql/src/main/java/io/asyncer/r2dbc/mysql/MySqlConnectionFactoryProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ public final class MySqlConnectionFactoryProvider implements ConnectionFactoryPr
348348
*
349349
* @since 1.4.2
350350
*/
351-
public static final Option<String> SERVER_RSA_PUBLIC_KEY_FILE = Option.valueOf("serverRsaPublicKeyFile");
351+
public static final Option<String> SERVER_RSA_PUBLIC_KEY_FILE = Option.valueOf("serverRSAPublicKeyFile");
352352

353353
@Override
354354
public ConnectionFactory create(ConnectionFactoryOptions options) {
@@ -448,7 +448,7 @@ static MySqlConnectionConfiguration setup(ConnectionFactoryOptions options) {
448448
mapper.optional(TINY_INT_1_IS_BIT).asBoolean()
449449
.to(builder::tinyInt1isBit);
450450
mapper.optional(SERVER_RSA_PUBLIC_KEY_FILE).asString()
451-
.to(builder::serverRsaPublicKeyFile);
451+
.to(builder::serverRSAPublicKeyFile);
452452

453453
return builder.build();
454454
}

r2dbc-mysql/src/main/java/io/asyncer/r2dbc/mysql/authentication/MySqlAuthProvider.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.asyncer.r2dbc.mysql.authentication;
1818

19+
import io.asyncer.r2dbc.mysql.ServerVersion;
1920
import io.asyncer.r2dbc.mysql.collation.CharCollation;
2021
import io.r2dbc.spi.R2dbcPermissionDeniedException;
2122
import org.jetbrains.annotations.Nullable;
@@ -146,9 +147,10 @@ static MySqlAuthProvider build(String type) {
146147
* Encrypts data with the RSA Public Key of MySQL server
147148
* @param bytesToEncrypt the data to encrypt
148149
* @param serverRSAPublicKeyFile the file path on the local system of the database server's RSA Public Key
150+
* @param serverVersion the version of the MySQL server
149151
* @return the encrypted bytes
150152
*/
151-
static byte[] rsaEncryption(byte[] bytesToEncrypt, String serverRsaPublicKeyFile) {
153+
static byte[] rsaEncryption(byte[] bytesToEncrypt, String serverRsaPublicKeyFile, ServerVersion serverVersion) {
152154
try {
153155
String key = new String(Files.readAllBytes(Paths.get(serverRsaPublicKeyFile)), Charset.defaultCharset());
154156

@@ -163,7 +165,12 @@ static byte[] rsaEncryption(byte[] bytesToEncrypt, String serverRsaPublicKeyFile
163165
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
164166
RSAPublicKey pk = (RSAPublicKey) keyFactory.generatePublic(keySpec);
165167

166-
Cipher cipher = Cipher.getInstance("RSA");
168+
Cipher cipher;
169+
if (serverVersion.isGreaterThanOrEqualTo(ServerVersion.create(8, 0, 5))) {
170+
cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
171+
} else {
172+
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
173+
}
167174
cipher.init(Cipher.ENCRYPT_MODE, pk);
168175
return cipher.doFinal(bytesToEncrypt);
169176
} catch (IOException e) {

r2dbc-mysql/src/test/java/io/asyncer/r2dbc/mysql/MySqlConnectionConfigurationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ private static MySqlConnectionConfiguration filledUp() {
282282
.lockWaitTimeout(Duration.ofSeconds(5))
283283
.statementTimeout(Duration.ofSeconds(10))
284284
.autodetectExtensions(false)
285-
.serverRsaPublicKeyFile("/path/to/mysql/serverRSAPublicKey.pem")
285+
.serverRSAPublicKeyFile("/path/to/mysql/serverRSAPublicKey.pem")
286286
.build();
287287
}
288288
}

r2dbc-mysql/src/test/java/io/asyncer/r2dbc/mysql/MySqlConnectionFactoryProviderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,15 +532,15 @@ void sessionVariables(String input, List<String> expected) {
532532
}
533533

534534
@Test
535-
void validServerRsaPublicKeyFile() {
535+
void validServerRSAPublicKeyFile() {
536536
ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
537537
.option(DRIVER, "mysql")
538538
.option(HOST, "127.0.0.1")
539539
.option(USER, "root")
540540
.option(SERVER_RSA_PUBLIC_KEY_FILE, "/path/to/mysql/serverRSAPublicKey.pem")
541541
.build();
542542

543-
assertThat(MySqlConnectionFactoryProvider.setup(options).getServerRsaPublicKeyFile()).isEqualTo("/path/to/mysql/serverRSAPublicKey.pem");
543+
assertThat(MySqlConnectionFactoryProvider.setup(options).getServerRSAPublicKeyFile()).isEqualTo("/path/to/mysql/serverRSAPublicKey.pem");
544544
}
545545

546546
static Stream<Arguments> sessionVariables() {

r2dbc-mysql/src/test/java/io/asyncer/r2dbc/mysql/RsaEncryptionTest.java renamed to r2dbc-mysql/src/test/java/io/asyncer/r2dbc/mysql/RsaEncryptionIntegrationTest.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2024 asyncer.io projects
2+
* Copyright 2025 asyncer.io projects
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package io.asyncer.r2dbc.mysql;
1818

19+
import static org.assertj.core.api.Assertions.assertThat;
1920
import static org.junit.jupiter.api.Assertions.assertThrows;
2021

2122
import org.junit.Assume;
@@ -28,7 +29,7 @@
2829
import io.r2dbc.spi.R2dbcPermissionDeniedException;
2930

3031
@ExtendWith(TestContainerExtension.class)
31-
public class RsaEncryptionTest {
32+
public class RsaEncryptionIntegrationTest {
3233

3334
@Test
3435
void rsaEnabledSslDisabledTest() {
@@ -52,9 +53,21 @@ void rsaEnabledSslDisabledTest() {
5253
.password(TestServerUtil.getPassword())
5354
.database(TestServerUtil.getDatabase())
5455
.sslMode(SslMode.DISABLED)
55-
.serverRsaPublicKeyFile("/path/to/mysql/serverRSAPublicKey.pem")
56+
.serverRSAPublicKeyFile("/path/to/mysql/serverRSAPublicKey.pem")
5657
.build();
5758

5859
assertThrows(IllegalArgumentException.class, () -> MySqlConnectionFactory.from(configuration2));
60+
61+
MySqlConnectionConfiguration configuration3 = MySqlConnectionConfiguration.builder()
62+
.host("localhost")
63+
.port(TestServerUtil.getPort())
64+
.user(TestServerUtil.getUsername())
65+
.password(TestServerUtil.getPassword())
66+
.database(TestServerUtil.getDatabase())
67+
.sslMode(SslMode.DISABLED)
68+
.serverRSAPublicKeyFile("/usr/local/mysql/data/public_key.pem")
69+
.build();
70+
71+
assertThat(MySqlConnectionFactory.from(configuration2)).isExactlyInstanceOf(MySqlConnectionFactory.class);
5972
}
6073
}

0 commit comments

Comments
 (0)