GUACAMOLE-1979: Allow setting required properties for connecting to MySQL 8.4 and later.

This commit is contained in:
James Muehlner
2024-08-13 17:53:13 +00:00
parent 3310272b7e
commit 7a66ec9a7f
3 changed files with 73 additions and 3 deletions

View File

@@ -76,6 +76,10 @@ public class MySQLAuthenticationProviderModule implements Module {
myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true"); myBatisProperties.setProperty("mybatis.pooled.pingEnabled", "true");
myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1"); myBatisProperties.setProperty("mybatis.pooled.pingQuery", "SELECT 1");
// Set whether public key retrieval from the server is allowed
driverProperties.setProperty("allowPublicKeyRetrieval",
environment.getMYSQLAllowPublicKeyRetrieval() ? "true" : "false");
// Use UTF-8 in database // Use UTF-8 in database
driverProperties.setProperty("characterEncoding", "UTF-8"); driverProperties.setProperty("characterEncoding", "UTF-8");
@@ -113,10 +117,22 @@ public class MySQLAuthenticationProviderModule implements Module {
if (clientPassword != null) if (clientPassword != null)
driverProperties.setProperty("clientCertificateKeyStorePassword", driverProperties.setProperty("clientCertificateKeyStorePassword",
clientPassword); clientPassword);
// Get the MySQL-compatible driver to use. // Get the MySQL-compatible driver to use.
mysqlDriver = environment.getMySQLDriver(); mysqlDriver = environment.getMySQLDriver();
// Set the path to the server public key, if any
// Note that the property name casing is slightly different for MySQL
// and MariaDB drivers. See
// https://dev.mysql.com/doc/connector-j/en/connector-j-connp-props-security.html#cj-conn-prop_serverRSAPublicKeyFile
// and https://mariadb.com/kb/en/about-mariadb-connector-j/#infrequently-used-parameters
String publicKeyFile = environment.getMYSQLServerRSAPublicKeyFile();
if (publicKeyFile != null)
driverProperties.setProperty(
mysqlDriver == MySQLDriver.MYSQL
? "serverRSAPublicKeyFile" : "serverRsaPublicKeyFile",
publicKeyFile);
// If timezone is present, set it. // If timezone is present, set it.
TimeZone serverTz = environment.getServerTimeZone(); TimeZone serverTz = environment.getServerTimeZone();
if (serverTz != null) if (serverTz != null)

View File

@@ -442,4 +442,35 @@ public class MySQLEnvironment extends JDBCEnvironment {
true); true);
} }
/**
* Returns the absolute path to the public key for the server being connected to,
* if any, or null if the configuration property is unset.
*
* @return
* The absolute path to the public key for the server being connected to.
*
* @throws GuacamoleException
* If an error occurs retrieving the configuration value.
*/
public String getMYSQLServerRSAPublicKeyFile() throws GuacamoleException {
return getProperty(MySQLGuacamoleProperties.MYSQL_SERVER_RSA_PUBLIC_KEY_FILE);
}
/**
* Returns true if the database server public key should be automatically
* retrieved from the MySQL server, or false otherwise.
*
* @return
* Whether the database server public key should be automatically
* retrieved from the MySQL server.
*
* @throws GuacamoleException
* If an error occurs retrieving the configuration value.
*/
public boolean getMYSQLAllowPublicKeyRetrieval() throws GuacamoleException {
return getProperty(
MySQLGuacamoleProperties.MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL,
false);
}
} }

View File

@@ -301,6 +301,29 @@ public class MySQLGuacamoleProperties {
@Override @Override
public String getName() { return "mysql-batch-size"; } public String getName() { return "mysql-batch-size"; }
}; };
/**
* The absolute path to the public key for the server being connected to, if any.
*/
public static final StringGuacamoleProperty MYSQL_SERVER_RSA_PUBLIC_KEY_FILE =
new StringGuacamoleProperty() {
@Override
public String getName() { return "mysql-server-rsa-public-key-file"; }
};
/**
* Whether or not the server public key should be automatically retreived from
* the MySQL server.
*/
public static final BooleanGuacamoleProperty MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL =
new BooleanGuacamoleProperty() {
@Override
public String getName() { return "mysql-allow-public-key-retrieval"; }
};
} }