From ca443c8a346f34fa2ae2c7afee61f31a4cb0652a Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 21 Jun 2021 14:41:07 -0700 Subject: [PATCH 1/3] GUACAMOLE-641: Add support for all MyBatis JDBC properties to DynamicallyAuthenticatedDataSource. Without support for these properties, important database configuration aspects are ignored, including driver-specific configuration properties like MySQL Connector/J's "allowMultiQueries". --- .../DynamicallyAuthenticatedDataSource.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java index 4c804a6ca..3dfd4bdd0 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java @@ -24,6 +24,7 @@ import com.google.inject.Singleton; import com.google.inject.name.Named; import java.sql.Connection; import java.sql.SQLException; +import java.util.Properties; import org.apache.guacamole.GuacamoleException; import org.apache.ibatis.datasource.pooled.PooledDataSource; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; @@ -73,4 +74,68 @@ public class DynamicallyAuthenticatedDataSource extends PooledDataSource { } + @Override + @Inject(optional=true) + public void setPoolPingConnectionsNotUsedFor( + @Named("mybatis.pooled.pingConnectionsNotUsedFor") int milliseconds) { + super.setPoolPingConnectionsNotUsedFor(milliseconds); + } + + @Override + @Inject(optional=true) + public void setPoolPingEnabled(@Named("mybatis.pooled.pingEnabled") boolean poolPingEnabled) { + super.setPoolPingEnabled(poolPingEnabled); + } + + @Override + @Inject(optional=true) + public void setPoolPingQuery(@Named("mybatis.pooled.pingQuery") String poolPingQuery) { + super.setPoolPingQuery(poolPingQuery); + } + + @Override + @Inject(optional=true) + public void setPoolTimeToWait(@Named("mybatis.pooled.timeToWait") int poolTimeToWait) { + super.setPoolTimeToWait(poolTimeToWait); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumCheckoutTime( + @Named("mybatis.pooled.maximumCheckoutTime") int poolMaximumCheckoutTime) { + super.setPoolMaximumCheckoutTime(poolMaximumCheckoutTime); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumIdleConnections( + @Named("mybatis.pooled.maximumIdleConnections") int poolMaximumIdleConnections) { + super.setPoolMaximumIdleConnections(poolMaximumIdleConnections); + } + + @Override + @Inject(optional=true) + public void setPoolMaximumActiveConnections( + @Named("mybatis.pooled.maximumActiveConnections") int poolMaximumActiveConnections) { + super.setPoolMaximumActiveConnections(poolMaximumActiveConnections); + } + + @Override + @Inject(optional=true) + public void setDriverProperties(@Named("JDBC.driverProperties") Properties driverProps) { + super.setDriverProperties(driverProps); + } + + @Override + @Inject(optional=true) + public void setDefaultAutoCommit(@Named("JDBC.autoCommit") boolean defaultAutoCommit) { + super.setDefaultAutoCommit(defaultAutoCommit); + } + + @Override + @Inject(optional=true) + public void setLoginTimeout(@Named("JDBC.loginTimeout") int loginTimeout) { + super.setLoginTimeout(loginTimeout); + } + } From 6ef951cd611e4df42cfcfcd519ce2829c390f533 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 21 Jun 2021 14:43:19 -0700 Subject: [PATCH 2/3] GUACAMOLE-641: Log creation of new database connections. --- .../auth/jdbc/DynamicallyAuthenticatedDataSource.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java index 3dfd4bdd0..1936d1e96 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java @@ -28,6 +28,8 @@ import java.util.Properties; import org.apache.guacamole.GuacamoleException; import org.apache.ibatis.datasource.pooled.PooledDataSource; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Pooled DataSource implementation which dynamically retrieves the database @@ -37,6 +39,11 @@ import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; @Singleton public class DynamicallyAuthenticatedDataSource extends PooledDataSource { + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(DynamicallyAuthenticatedDataSource.class); + /** * Creates a new DynamicallyAuthenticatedDataSource which dynamically * retrieves database credentials from the given JDBCEnvironment each time @@ -63,6 +70,7 @@ public class DynamicallyAuthenticatedDataSource extends PooledDataSource { @Override public Connection getConnection() throws SQLException { try { + logger.debug("Creating new database connection for pool."); return super.getConnection(environment.getUsername(), environment.getPassword()); } catch (GuacamoleException e) { From eab80688cce76f66583e870abb1b8f6131c78720 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 21 Jun 2021 14:44:09 -0700 Subject: [PATCH 3/3] GUACAMOLE-641: Ensure MyBatis "expectedConnectionTypeCode" is generated and matches valid database connections. --- .../auth/jdbc/DynamicallyAuthenticatedDataSource.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java index 1936d1e96..4c8e3c0f8 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/DynamicallyAuthenticatedDataSource.java @@ -80,6 +80,13 @@ public class DynamicallyAuthenticatedDataSource extends PooledDataSource { }); + // Force recalculation of expectedConnectionTypeCode. The + // PooledDataSource constructor accepting a single UnpooledDataSource + // will otherwise leave this value uninitialized, resulting in all + // connections failing to pass sanity checks and never being returned + // to the pool. + super.forceCloseAll(); + } @Override