You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by am...@apache.org on 2022/04/26 17:21:18 UTC
[knox] branch master updated: KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)
This is an automated email from the ASF dual-hosted git repository.
amagyar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 316340129 KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)
316340129 is described below
commit 3163401292d0640a6ade44d77cbefce1db8d9f10
Author: Attila Magyar <m....@gmail.com>
AuthorDate: Tue Apr 26 19:21:13 2022 +0200
KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)
---
gateway-server/pom.xml | 6 ++
.../org/apache/knox/gateway/util/JDBCUtils.java | 13 ++++
.../resources/createKnoxTokenDatabaseTable.sql | 2 +-
.../createKnoxTokenMetadataDatabaseTable.sql | 2 +-
.../token/impl/JDBCTokenStateServiceTest.java | 70 ++++++----------------
pom.xml | 6 ++
6 files changed, 46 insertions(+), 53 deletions(-)
diff --git a/gateway-server/pom.xml b/gateway-server/pom.xml
index 89da9d32b..bf6fa837c 100644
--- a/gateway-server/pom.xml
+++ b/gateway-server/pom.xml
@@ -448,6 +448,12 @@
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java b/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
index a44823fec..d01fc2032 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
@@ -23,6 +23,7 @@ import org.apache.derby.jdbc.ClientDataSource;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
import org.apache.knox.gateway.services.security.AliasServiceException;
+import org.hsqldb.jdbc.JDBCDataSource;
import org.postgresql.ds.PGSimpleDataSource;
import org.postgresql.jdbc.SslMode;
import org.postgresql.ssl.NonValidatingFactory;
@@ -34,6 +35,7 @@ public class JDBCUtils {
public static final String POSTGRESQL_DB_TYPE = "postgresql";
public static final String MYSQL_DB_TYPE = "mysql";
public static final String DERBY_DB_TYPE = "derbydb";
+ public static final String HSQL = "hsql";
public static final String DATABASE_USER_ALIAS_NAME = "gateway_database_user";
public static final String DATABASE_PASSWORD_ALIAS_NAME = "gateway_database_password";
public static final String DATABASE_TRUSTSTORE_PASSWORD_ALIAS_NAME = "gateway_database_ssl_truststore_password";
@@ -43,6 +45,8 @@ public class JDBCUtils {
return createPostgresDataSource(gatewayConfig, aliasService);
} else if (DERBY_DB_TYPE.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
return createDerbyDatasource(gatewayConfig, aliasService);
+ } else if (HSQL.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
+ return createHsqlDatasource(gatewayConfig, aliasService);
} else if (MYSQL_DB_TYPE.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
return createMySqlDataSource(gatewayConfig, aliasService);
}
@@ -87,6 +91,15 @@ public class JDBCUtils {
return derbyDatasource;
}
+
+ private static DataSource createHsqlDatasource(GatewayConfig gatewayConfig, AliasService aliasService) throws AliasServiceException {
+ JDBCDataSource hsqlDatasource = new JDBCDataSource();
+ hsqlDatasource.setUrl(gatewayConfig.getDatabaseConnectionUrl());
+ hsqlDatasource.setUser(getDatabaseUser(aliasService));
+ hsqlDatasource.setPassword(getDatabasePassword(aliasService));
+ return hsqlDatasource;
+ }
+
private static DataSource createMySqlDataSource(GatewayConfig gatewayConfig, AliasService aliasService) throws AliasServiceException, SQLException {
MysqlDataSource dataSource = new MysqlDataSource();
if (gatewayConfig.getDatabaseConnectionUrl() != null) {
diff --git a/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql b/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
index 598ed7ef1..ff0aba7e6 100644
--- a/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
+++ b/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
@@ -13,7 +13,7 @@
-- License for the specific language governing permissions and limitations under
-- the License.
-CREATE TABLE KNOX_TOKENS (
+CREATE TABLE IF NOT EXISTS KNOX_TOKENS ( -- IF NOT EXISTS syntax is not supported by Derby
token_id varchar(128) NOT NULL,
issue_time bigint NOT NULL,
expiration bigint NOT NULL,
diff --git a/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql b/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
index 9a1138072..5c69dc8cb 100644
--- a/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
+++ b/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
@@ -13,7 +13,7 @@
-- License for the specific language governing permissions and limitations under
-- the License.
-CREATE TABLE KNOX_TOKEN_METADATA (
+CREATE TABLE IF NOT EXISTS KNOX_TOKEN_METADATA ( -- IF NOT EXISTS syntax is not supported by Derby
token_id varchar(128) NOT NULL,
md_name varchar(32) NOT NULL,
md_value varchar(256) NOT NULL,
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
index ba4372833..d3f33df79 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
@@ -18,13 +18,13 @@
package org.apache.knox.gateway.services.token.impl;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.knox.gateway.util.JDBCUtils.HSQL;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.sql.Connection;
+import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -36,23 +36,18 @@ import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.derby.drda.NetworkServerControl;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
import org.apache.knox.gateway.services.security.token.KnoxToken;
import org.apache.knox.gateway.services.security.token.TokenMetadata;
import org.apache.knox.gateway.services.security.token.UnknownTokenException;
import org.apache.knox.gateway.services.security.token.impl.TokenMAC;
-import org.apache.knox.gateway.shell.jdbc.Database;
-import org.apache.knox.gateway.shell.jdbc.derby.DerbyDatabase;
import org.apache.knox.gateway.util.JDBCUtils;
import org.easymock.EasyMock;
-import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
@@ -60,67 +55,36 @@ import org.junit.rules.TemporaryFolder;
public class JDBCTokenStateServiceTest {
+ public static final String USERNAME = "SA";
+ public static final String PASSWORD = "";
private static final String GET_TOKENS_COUNT_SQL = "SELECT count(*) FROM " + TokenStateDatabase.TOKENS_TABLE_NAME;
private static final String TRUNCATE_KNOX_TOKENS_SQL = "DELETE FROM " + TokenStateDatabase.TOKENS_TABLE_NAME;
private static final String TRUNCATE_KNOX_TOKEN_METADATA_SQL = "DELETE FROM " + TokenStateDatabase.TOKEN_METADATA_TABLE_NAME;
@ClassRule
public static final TemporaryFolder testFolder = new TemporaryFolder();
-
- private static final String SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE = "derby.stream.error.file";
- private static final String SAMPLE_DERBY_DATABASE_NAME = "sampleDerbyDatabase";
- private static NetworkServerControl derbyNetworkServerControl;
- private static Database derbyDatabase;
+ public static final String CONNECTION_URL = "jdbc:hsqldb:mem:knox;ifexists=false";
+ public static final String DB_NAME = "knox";
private static JDBCTokenStateService jdbcTokenStateService;
private static TokenMAC tokenMAC;
@SuppressWarnings("PMD.JUnit4TestShouldUseBeforeAnnotation")
@BeforeClass
public static void setUp() throws Exception {
- final String username = "app";
- final String password = "P4ssW0rd!";
- System.setProperty(SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE, "/dev/null");
- derbyNetworkServerControl = new NetworkServerControl(username, password);
- derbyNetworkServerControl.start(null);
- TimeUnit.SECONDS.sleep(1); // give a bit of time for the server to start
- final Path derbyDatabaseFolder = Paths.get(testFolder.newFolder().toPath().toString(), SAMPLE_DERBY_DATABASE_NAME);
final GatewayConfig gatewayConfig = EasyMock.createNiceMock(GatewayConfig.class);
- EasyMock.expect(gatewayConfig.getDatabaseType()).andReturn(JDBCUtils.DERBY_DB_TYPE).anyTimes();
- EasyMock.expect(gatewayConfig.getDatabaseHost()).andReturn("localhost").anyTimes();
- EasyMock.expect(gatewayConfig.getDatabasePort()).andReturn(NetworkServerControl.DEFAULT_PORTNUMBER).anyTimes();
- EasyMock.expect(gatewayConfig.getDatabaseName()).andReturn(derbyDatabaseFolder.toString()).anyTimes();
+ EasyMock.expect(gatewayConfig.getDatabaseType()).andReturn(HSQL).anyTimes();
+ EasyMock.expect(gatewayConfig.getDatabaseConnectionUrl()).andReturn(CONNECTION_URL).anyTimes();
+ EasyMock.expect(gatewayConfig.getDatabaseName()).andReturn(DB_NAME).anyTimes();
final AliasService aliasService = EasyMock.createNiceMock(AliasService.class);
- EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_USER_ALIAS_NAME)).andReturn(username.toCharArray()).anyTimes();
- EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_PASSWORD_ALIAS_NAME)).andReturn(password.toCharArray()).anyTimes();
+ EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_USER_ALIAS_NAME)).andReturn(USERNAME.toCharArray()).anyTimes();
+ EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_PASSWORD_ALIAS_NAME)).andReturn(PASSWORD.toCharArray()).anyTimes();
EasyMock.replay(gatewayConfig, aliasService);
-
- derbyDatabase = prepareDerbyDatabase(derbyDatabaseFolder);
-
jdbcTokenStateService = new JDBCTokenStateService();
jdbcTokenStateService.setAliasService(aliasService);
jdbcTokenStateService.init(gatewayConfig, null);
-
- assertTrue(derbyDatabase.hasTable(TokenStateDatabase.TOKENS_TABLE_NAME));
-
tokenMAC = new TokenMAC(HmacAlgorithms.HMAC_SHA_256.getName(), "sPj8FCgQhCEi6G18kBfpswxYSki33plbelGLs0hMSbk".toCharArray());
}
- private static Database prepareDerbyDatabase(Path derbyDatabaseFolder) throws SQLException {
- final Database derbyDatabase = new DerbyDatabase(derbyDatabaseFolder.toString(), true);
- derbyDatabase.create();
- return derbyDatabase;
- }
-
- @SuppressWarnings("PMD.JUnit4TestShouldUseAfterAnnotation")
- @AfterClass
- public static void tearDown() throws Exception {
- if (derbyDatabase != null) {
- derbyDatabase.shutdown();
- }
- derbyNetworkServerControl.shutdown();
- System.clearProperty(SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE);
- }
-
@Test
public void testAddToken() throws Exception {
final String tokenId = UUID.randomUUID().toString();
@@ -266,7 +230,7 @@ public class JDBCTokenStateServiceTest {
}
private long getLongTokenAttributeFromDatabase(String tokenId, String sql) throws SQLException {
- try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
+ try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
if (tokenId != null) {
stmt.setString(1, tokenId);
}
@@ -277,7 +241,7 @@ public class JDBCTokenStateServiceTest {
}
private String getStringTokenAttributeFromDatabase(String tokenId, String sql) throws SQLException {
- try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
+ try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, tokenId);
try (ResultSet rs = stmt.executeQuery()) {
return rs.next() ? rs.getString(1) : null;
@@ -286,15 +250,19 @@ public class JDBCTokenStateServiceTest {
}
private void truncateDatabase() throws SQLException {
- try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKEN_METADATA_SQL)) {
+ try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKEN_METADATA_SQL)) {
stmt.executeUpdate();
}
- try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKENS_SQL)) {
+ try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKENS_SQL)) {
stmt.executeUpdate();
}
}
+ private Connection getConnection() throws SQLException {
+ return DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD);
+ }
+
private String getSelectMetadataSql(String metadataName) {
return "SELECT md_value FROM " + TokenStateDatabase.TOKEN_METADATA_TABLE_NAME + " WHERE token_id = ? AND md_name = '" + metadataName + "'";
}
diff --git a/pom.xml b/pom.xml
index 624d97cd0..412ca751f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -188,6 +188,7 @@
<curator.version>4.3.0</curator.version>
<dependency-check-maven.version>6.0.3</dependency-check-maven.version>
<derby.db.version>10.14.2.0</derby.db.version> <!-- 10.15.1.3 requires Java 9 -->
+ <hsql.db.version>2.4.0</hsql.db.version>
<dockerfile-maven-plugin.version>1.4.13</dockerfile-maven-plugin.version>
<dom4j.version>2.1.3</dom4j.version>
<easymock.version>4.2</easymock.version>
@@ -2482,6 +2483,11 @@
<version>${testcontainers.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ <version>${hsql.db.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>