Replace MySQL use-ssl boolean with explicit connection-parameters (sslMode)
Build / build (push) Successful in 1m12s

This commit is contained in:
Michael Burgess
2026-08-07 07:21:43 -04:00
parent 1c16f9a83b
commit f470b30130
4 changed files with 29 additions and 8 deletions
+12 -1
View File
@@ -166,10 +166,21 @@ storage:
database: blockparty
username: blockparty
password: password
use-ssl: false
table-prefix: "bp_"
connection-parameters: "sslMode=PREFERRED&verifyServerCertificate=false"
```
`connection-parameters` is appended verbatim to the JDBC URL, so TLS behavior is
controlled with real MySQL Connector/J flags rather than a single `use-ssl` toggle.
Common values:
- `sslMode=DISABLED` — no TLS.
- `sslMode=PREFERRED&verifyServerCertificate=false` (default) — TLS if the server offers
it, without validating the certificate; good for a private/internal database host.
- `sslMode=REQUIRED&verifyServerCertificate=false` — TLS mandatory, certificate not validated.
- `sslMode=VERIFY_IDENTITY` — TLS mandatory and the server certificate is validated
against a trust store (production-grade; requires a properly signed/trusted cert).
The MySQL JDBC driver (`mysql-connector-j`) is bundled in the plugin jar, so no extra
download is required. The stats table is created automatically on startup if it doesn't
exist. All queries run asynchronously off the main thread regardless of storage type.
@@ -90,14 +90,14 @@ public class ConfigManager {
config.getString("storage.mysql.database", "blockparty"),
config.getString("storage.mysql.username", "blockparty"),
config.getString("storage.mysql.password", ""),
config.getBoolean("storage.mysql.use-ssl", false),
config.getString("storage.mysql.table-prefix", "bp_")
config.getString("storage.mysql.table-prefix", "bp_"),
config.getString("storage.mysql.connection-parameters", "sslMode=PREFERRED&verifyServerCertificate=false")
);
}
/** Immutable snapshot of the storage.* config section. */
public record StorageSettings(String type, String host, int port, String database,
String username, String password, boolean useSsl, String tablePrefix) {
String username, String password, String tablePrefix, String connectionParameters) {
public boolean isMysql() {
return "mysql".equalsIgnoreCase(type);
@@ -53,9 +53,14 @@ public class StatsDatabase {
private void connectMysql() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://" + settings.host() + ":" + settings.port() + "/" + settings.database()
+ "?useSSL=" + settings.useSsl() + "&autoReconnect=true&characterEncoding=utf8";
connection = DriverManager.getConnection(url, settings.username(), settings.password());
String extra = settings.connectionParameters() == null ? "" : settings.connectionParameters().trim();
StringBuilder url = new StringBuilder("jdbc:mysql://")
.append(settings.host()).append(':').append(settings.port()).append('/').append(settings.database())
.append("?autoReconnect=true&characterEncoding=utf8");
if (!extra.isEmpty()) {
url.append('&').append(extra);
}
connection = DriverManager.getConnection(url.toString(), settings.username(), settings.password());
}
private String createTableStatement() {
+6 -1
View File
@@ -54,8 +54,13 @@ storage:
database: blockparty
username: blockparty
password: password
use-ssl: false
table-prefix: "bp_"
# Raw JDBC connection parameters appended to the connection URL (without a leading '?' or '&').
# Tune SSL/TLS behavior here instead of a single use-ssl toggle, e.g.:
# "sslMode=REQUIRED&verifyServerCertificate=false"
# "sslMode=VERIFY_IDENTITY" (validates the server cert against a trust store)
# "sslMode=DISABLED" (no TLS at all)
connection-parameters: "sslMode=PREFERRED&verifyServerCertificate=false"
rewards:
winner: