From 1a0d5646e51f14eb0206d86d37c6d045732894df Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 21 Sep 2026 21:30:49 +0100 Subject: [PATCH 1/5] Fix Scala compilation of linkis-module (#5482) bb26ad363 (#5456) referenced LinkisModuleErrorCodeSummary.CRYPT_KEY_INSECURE without adding it to the enum, and 047ebde76 (#5457) used CommonVars in SecurityFilter without importing it. Both broke scala-compile-first on linkis-module, which cascades to every downstream module. Co-Authored-By: Claude Opus 5 (1M context) --- .../linkis/errorcode/LinkisModuleErrorCodeSummary.java | 5 ++++- .../org/apache/linkis/server/security/SecurityFilter.scala | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/linkis-commons/linkis-module/src/main/java/org/apache/linkis/errorcode/LinkisModuleErrorCodeSummary.java b/linkis-commons/linkis-module/src/main/java/org/apache/linkis/errorcode/LinkisModuleErrorCodeSummary.java index 2331ba01624..986950f7f6c 100644 --- a/linkis-commons/linkis-module/src/main/java/org/apache/linkis/errorcode/LinkisModuleErrorCodeSummary.java +++ b/linkis-commons/linkis-module/src/main/java/org/apache/linkis/errorcode/LinkisModuleErrorCodeSummary.java @@ -41,7 +41,10 @@ public enum LinkisModuleErrorCodeSummary implements LinkisErrorCode { "The receive queue for WebSocket is full, please try again later(WebSocket的接收队列已满,请稍后重试)!"), WEBSOCKET_STOPPED( 11035, - "WebSocket consumer has stopped, please contact the administrator to handle(WebSocket的消费器已停止,请联系管理员处理)!"); + "WebSocket consumer has stopped, please contact the administrator to handle(WebSocket的消费器已停止,请联系管理员处理)!"), + CRYPT_KEY_INSECURE( + 11036, + "The wds.linkis.crypt.key is missing or insecure, refusing to start(wds.linkis.crypt.key 缺失或不安全,拒绝启动)"); /** error code(错误码) */ private final int errorCode; diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala index b4f0ae6cb32..04733f6d195 100644 --- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala +++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala @@ -17,7 +17,7 @@ package org.apache.linkis.server.security -import org.apache.linkis.common.conf.Configuration +import org.apache.linkis.common.conf.{CommonVars, Configuration} import org.apache.linkis.common.utils.{Logging, RSAUtils, Utils} import org.apache.linkis.errorcode.LinkisModuleErrorCodeSummary.ILLEGAL_USER_TOKEN import org.apache.linkis.server.{Message, _} From 5fdbb10f4662aceb022ae0ce5d6d309803f10640 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 21 Sep 2026 21:42:40 +0100 Subject: [PATCH 2/5] Apply spotless formatting so the code-format check passes Pre-existing violations from #5450/#5456/#5457/#5460 and EurekaSecurityConfig; produced by ./mvnw spotless:apply with no manual edits. Co-Authored-By: Claude Opus 5 (1M context) --- .../linkis/common/utils/TicketCipher.java | 13 +++---- .../server/conf/ServerConfiguration.scala | 6 ++- .../linkis/server/security/SSOUtils.scala | 3 +- .../server/security/SecurityFilter.scala | 6 ++- .../server/security/SecurityFilterTest.scala | 39 ++++++++++--------- .../linkis/eureka/EurekaSecurityConfig.java | 5 ++- 6 files changed, 40 insertions(+), 32 deletions(-) diff --git a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/TicketCipher.java b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/TicketCipher.java index 7e704b00959..9ad2c9aa082 100644 --- a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/TicketCipher.java +++ b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/TicketCipher.java @@ -37,8 +37,8 @@ *

Solves CVE-2026-XXXX vulnerabilities E (weak DES 56-bit cipher) and F (no integrity / * anti-tamper protection) when V2 mode is enabled. * - *

V2 (AES-256-GCM): key derivation via PBKDF2WithHmacSHA256 — deterministic across JVM - * vendors. GCM AEAD provides both confidentiality and integrity in one pass. + *

V2 (AES-256-GCM): key derivation via PBKDF2WithHmacSHA256 — deterministic across JVM vendors. + * GCM AEAD provides both confidentiality and integrity in one pass. * *

V1 (DES): retained for backward compatibility. When the V2 switch is toggled off, new tickets * are issued in the legacy DES format so that downstream systems that have not yet upgraded can @@ -54,8 +54,7 @@ public class TicketCipher { private static final int IV_LEN_BYTES = 12; // GCM standard 96-bit IV private static final int TAG_LEN_BITS = 128; // GCM auth tag private static final int PBKDF2_ITERATIONS = 10000; - private static final byte[] PBKDF2_SALT = - "linkis-ticket-v2".getBytes(StandardCharsets.UTF_8); + private static final byte[] PBKDF2_SALT = "linkis-ticket-v2".getBytes(StandardCharsets.UTF_8); private static final byte VERSION_V2 = 0x02; private final SecretKey encKey; @@ -93,9 +92,9 @@ public String encrypt(String plaintext) throws Exception { } /** - * Decrypt data. Auto-detects V2 (version byte 0x02) vs legacy DES. - * V2 tampering is rejected with AEADBadTagException. - * V2 tickets issued before a rollback are still decrypted correctly even when V2 is disabled. + * Decrypt data. Auto-detects V2 (version byte 0x02) vs legacy DES. V2 tampering is rejected with + * AEADBadTagException. V2 tickets issued before a rollback are still decrypted correctly even + * when V2 is disabled. */ public String decrypt(String data) throws Exception { if (StringUtils.isBlank(data)) { diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala index 39199018f62..14ea0cdc55f 100644 --- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala +++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/conf/ServerConfiguration.scala @@ -52,7 +52,9 @@ object ServerConfiguration extends Logging { private val CRYPT_KEY_MIN_LENGTH = 16 private val cryptKeyRaw: String = CommonVars("wds.linkis.crypt.key", "").getValue - private val allowInsecureCryptKey: Boolean = CommonVars("linkis.crypt.key.allow.insecure", "false").getValue.toBoolean + + private val allowInsecureCryptKey: Boolean = + CommonVars("linkis.crypt.key.allow.insecure", "false").getValue.toBoolean private def validateCryptKey(key: String): Unit = { val issues = scala.collection.mutable.ArrayBuffer.empty[String] @@ -92,8 +94,8 @@ object ServerConfiguration extends Logging { // have not yet been upgraded. Decryption auto-detects both formats. private val useTicketCipherV2: Boolean = CommonVars("linkis.ticket.cipher.v2.enabled", "true").getValue.toBoolean - val ticketCipher = new TicketCipher(cryptKeyRaw, useTicketCipherV2) + val ticketCipher = new TicketCipher(cryptKeyRaw, useTicketCipherV2) private val ticketHeader = CommonVars("wds.linkis.ticket.header", "bfs_").getValue diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala index 8efba0a4176..9ed9c3bc0d5 100644 --- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala +++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SSOUtils.scala @@ -211,7 +211,8 @@ object SSOUtils extends Logging { case _: LoginExpireException => logger.warn( "Ignore-timeout path rejected ticket: valid decryption " + - "but ticket not present in server-side session map") + "but ticket not present in server-side session map" + ) None } } diff --git a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala index 04733f6d195..6e02d324871 100644 --- a/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala +++ b/linkis-commons/linkis-module/src/main/scala/org/apache/linkis/server/security/SecurityFilter.scala @@ -196,14 +196,16 @@ object SecurityFilter { // peer). External clients cannot set this cookie to trigger the bypass. def isRequestIgnoreTimeout(req: HttpServletRequest): Boolean = { val hasCookie = Option(req.getCookies).exists( - _.exists(c => c.getName == ALLOW_ACCESS_WITHOUT_TIMEOUT && c.getValue == "true")) + _.exists(c => c.getName == ALLOW_ACCESS_WITHOUT_TIMEOUT && c.getValue == "true") + ) if (!hasCookie) return false if (!requireInternalIp) return true // escape hatch for legacy deployments val ip = getClientIp(req) if (!isTrustedInternal(ip)) { logger.warn( s"Ignore-timeout cookie present but client IP $ip is not in " + - "linkis.security.trusted.internal.sources; rejecting as potential auth bypass") + "linkis.security.trusted.internal.sources; rejecting as potential auth bypass" + ) return false } true diff --git a/linkis-commons/linkis-module/src/test/scala/org/apache/linkis/server/security/SecurityFilterTest.scala b/linkis-commons/linkis-module/src/test/scala/org/apache/linkis/server/security/SecurityFilterTest.scala index a68273b21b9..9d27be6c640 100644 --- a/linkis-commons/linkis-module/src/test/scala/org/apache/linkis/server/security/SecurityFilterTest.scala +++ b/linkis-commons/linkis-module/src/test/scala/org/apache/linkis/server/security/SecurityFilterTest.scala @@ -17,17 +17,20 @@ package org.apache.linkis.server.security +import javax.servlet.http.{Cookie, HttpServletRequest} + import org.junit.jupiter.api.{Assertions, DisplayName, Test} import org.mockito.Mockito.{mock, when} -import javax.servlet.http.{Cookie, HttpServletRequest} - class SecurityFilterTest { private val IGNORE_COOKIE_NAME = SecurityFilter.ALLOW_ACCESS_WITHOUT_TIMEOUT - private def mockRequest(remoteAddr: String, cookies: Array[Cookie] = null, - xForwardedFor: String = null): HttpServletRequest = { + private def mockRequest( + remoteAddr: String, + cookies: Array[Cookie] = null, + xForwardedFor: String = null + ): HttpServletRequest = { val req = mock(classOf[HttpServletRequest]) when(req.getRemoteAddr).thenReturn(remoteAddr) when(req.getCookies).thenReturn(cookies) @@ -49,8 +52,7 @@ class SecurityFilterTest { @Test @DisplayName("isRequestIgnoreTimeout_returnsTrueWhenCookieFromLoopback") def isRequestIgnoreTimeoutFromLoopbackTest(): Unit = { - val req = mockRequest("127.0.0.1", - cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) + val req = mockRequest("127.0.0.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) Assertions.assertTrue(SecurityFilter.isRequestIgnoreTimeout(req)) } @@ -58,50 +60,50 @@ class SecurityFilterTest { @DisplayName("isRequestIgnoreTimeout_returnsFalseWhenCookieFromExternalIP") def isRequestIgnoreTimeoutFromExternalIPTest(): Unit = { // 203.0.113.0/24 is TEST-NET-3, not in default RFC1918 trusted sources - val req = mockRequest("203.0.113.1", - cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) + val req = mockRequest("203.0.113.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) Assertions.assertFalse(SecurityFilter.isRequestIgnoreTimeout(req)) } @Test @DisplayName("isRequestIgnoreTimeout_returnsTrueFromPrivate10x") def isRequestIgnoreTimeoutFromPrivate10xTest(): Unit = { - val req = mockRequest("10.255.255.1", - cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) + val req = mockRequest("10.255.255.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) Assertions.assertTrue(SecurityFilter.isRequestIgnoreTimeout(req)) } @Test @DisplayName("isRequestIgnoreTimeout_returnsTrueFromPrivate172x") def isRequestIgnoreTimeoutFromPrivate172xTest(): Unit = { - val req = mockRequest("172.31.0.1", - cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) + val req = mockRequest("172.31.0.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true"))) Assertions.assertTrue(SecurityFilter.isRequestIgnoreTimeout(req)) } @Test @DisplayName("isRequestIgnoreTimeout_returnsFalseWhenCookieValueIsFalse") def isRequestIgnoreTimeoutCookieFalseTest(): Unit = { - val req = mockRequest("127.0.0.1", - cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "false"))) + val req = mockRequest("127.0.0.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "false"))) Assertions.assertFalse(SecurityFilter.isRequestIgnoreTimeout(req)) } @Test @DisplayName("isRequestIgnoreTimeout_honorsXForwardedForFromTrustedUpstream") def isRequestIgnoreTimeoutWithXForwardedForTest(): Unit = { - val req = mockRequest("127.0.0.1", + val req = mockRequest( + "127.0.0.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true")), - xForwardedFor = "10.0.0.5, 203.0.113.1") + xForwardedFor = "10.0.0.5, 203.0.113.1" + ) Assertions.assertTrue(SecurityFilter.isRequestIgnoreTimeout(req)) } @Test @DisplayName("isRequestIgnoreTimeout_ignoresXForwardedForFromUntrustedUpstream") def isRequestIgnoreTimeoutXForwardedForUntrustedTest(): Unit = { - val req = mockRequest("203.0.113.1", + val req = mockRequest( + "203.0.113.1", cookies = Array(new Cookie(IGNORE_COOKIE_NAME, "true")), - xForwardedFor = "10.0.0.5") + xForwardedFor = "10.0.0.5" + ) Assertions.assertFalse(SecurityFilter.isRequestIgnoreTimeout(req)) } @@ -122,4 +124,5 @@ class SecurityFilterTest { Assertions.assertEquals(-1, cookie.getMaxAge) Assertions.assertEquals("/", cookie.getPath) } + } diff --git a/linkis-spring-cloud-services/linkis-service-discovery/linkis-eureka/src/main/java/org/apache/linkis/eureka/EurekaSecurityConfig.java b/linkis-spring-cloud-services/linkis-service-discovery/linkis-eureka/src/main/java/org/apache/linkis/eureka/EurekaSecurityConfig.java index d296d921a55..ab25e76727a 100644 --- a/linkis-spring-cloud-services/linkis-service-discovery/linkis-eureka/src/main/java/org/apache/linkis/eureka/EurekaSecurityConfig.java +++ b/linkis-spring-cloud-services/linkis-service-discovery/linkis-eureka/src/main/java/org/apache/linkis/eureka/EurekaSecurityConfig.java @@ -17,14 +17,15 @@ package org.apache.linkis.eureka; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @Configuration public class EurekaSecurityConfig { From 8e73f42dc2f9ba3da9c0ca00a280f0ee8eab5d82 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 21 Sep 2026 21:44:05 +0100 Subject: [PATCH 3/5] linkis-dist: use managed hadoop-hdfs-client.artifact property bd059caaa (#5447) hardcoded hadoop-hdfs-client at ${hadoop.version}, but that artifact only exists from Hadoop 2.8, so the default 2.7.2 build (CI 'spark-3' job) fails to resolve it. The root pom already switches between hadoop-hdfs (2.x) and hadoop-hdfs-client (3.x) via ${hadoop-hdfs-client.artifact} and manages the version, so use that. Co-Authored-By: Claude Opus 5 (1M context) --- linkis-dist/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/linkis-dist/pom.xml b/linkis-dist/pom.xml index 5ffb17e07af..8949e9f4b41 100644 --- a/linkis-dist/pom.xml +++ b/linkis-dist/pom.xml @@ -165,8 +165,7 @@ org.apache.hadoop - hadoop-hdfs-client - ${hadoop.version} + ${hadoop-hdfs-client.artifact} From 6278865e7bd475b74d79105dda3f90801501821d Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 21 Sep 2026 21:58:15 +0100 Subject: [PATCH 4/5] linkis_dml.sql: fix column/value count mismatch on JDBC 'instance' rows f66a492f2 (#5450) added a value_regex to the 13 'instance' rows of linkis_ps_dm_datasource_type_key but left the NULL it replaced in place, giving 17 values for 16 columns. This breaks the sql-check CI job (ERROR 1136 at line 670). Drop the extra NULL on each row. Co-Authored-By: Claude Opus 5 (1M context) --- linkis-dist/package/db/linkis_dml.sql | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/linkis-dist/package/db/linkis_dml.sql b/linkis-dist/package/db/linkis_dml.sql index eb4cb680374..cffdead6027 100644 --- a/linkis-dist/package/db/linkis_dml.sql +++ b/linkis-dist/package/db/linkis_dml.sql @@ -679,7 +679,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'sid', 'SID', 'SID', NULL, 'TEXT', NULL, 0, 'SID', 'SID', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'serviceName', 'service_name', 'service_name', NULL, 'TEXT', NULL, 0, 'service_name', 'service_name', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'server', 'server', 'server', NULL, 'TEXT', NULL, 0, 'server', 'server', NULL, NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 0, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 0, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'dm'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -691,7 +691,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'kingbase'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -703,7 +703,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); -- https://jdbc.postgresql.org/documentation/use/ select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'postgresql'; @@ -716,7 +716,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); -- https://learn.microsoft.com/zh-cn/sql/connect/jdbc/building-the-connection-url?redirectedfrom=MSDN&view=sql-server-ver16 select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'sqlserver'; @@ -729,7 +729,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); -- https://www.ibm.com/docs/en/db2/11.5?topic=cdsudidsdjs-url-format-data-server-driver-jdbc-sqlj-type-4-connectivity select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'db2'; @@ -742,7 +742,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); -- https://greenplum.docs.pivotal.io/6-1/datadirect/datadirect_jdbc.html#topic_ylk_pbx_2bb select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'greenplum'; @@ -755,7 +755,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'doris'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -767,7 +767,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); -- https://github.com/ClickHouse/clickhouse-jdbc/tree/master/clickhouse-jdbc select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'clickhouse'; @@ -780,7 +780,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'hive'; @@ -800,7 +800,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 0, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'starrocks'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -812,7 +812,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 0, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'gaussdb'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -824,7 +824,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'oceanbase'; INSERT INTO `linkis_ps_dm_datasource_type_key` @@ -836,7 +836,7 @@ VALUES (@data_source_type_id, 'address', '地址', 'Address', NULL, 'TEXT', NULL (@data_source_type_id, 'params', '连接参数(Connection params)', 'Connection params', NULL, 'TEXT', NULL, 0, '输入JSON格式(Input JSON format): {"param":"value"}', 'Input JSON format: {"param":"value"}', NULL, NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'username', '用户名(Username)', 'Username', NULL, 'TEXT', NULL, 1, '用户名(Username)', 'Username', '^[0-9A-Za-z_-]+$', NULL, NULL, NULL, now(), now()), (@data_source_type_id, 'password', '密码(Password)', 'Password', NULL, 'PASSWORD', NULL, 1, '密码(Password)', 'Password', '', NULL, NULL, NULL, now(), now()), - (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, NULL, now(), now()); + (@data_source_type_id, 'instance', '实例名(instance)', 'Instance', NULL, 'TEXT', NULL, 1, '实例名(instance)', 'Instance', '^[A-Za-z0-9_.-]+$', NULL, NULL, NULL, now(), now()); select @data_source_type_id := id from `linkis_ps_dm_datasource_type` where `name` = 'doris'; UPDATE linkis_ps_dm_datasource_type_key SET `require` = 0 WHERE `key` ="password" and `data_source_type_id` = @data_source_type_id; From b346cd419b08b919e5126913b519228b86213c4b Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 21 Sep 2026 22:14:53 +0100 Subject: [PATCH 5/5] Add Spring Boot 2.7 / Security / reactor-netty jars to known-dependencies.txt The third-party-dependencies-check job fails on 48 jars pulled in by the recent dependency upgrades (Spring Boot 2.7.18, Spring Security 5.7.11, reactor-netty 1.0.39, thymeleaf 3.1.5, micrometer 1.9.17, httpclient5, libthrift 0.23.0, etc.) that were never added to the known list. Additions only; taken from the current_dependencies.txt generated by CI. Co-Authored-By: Claude Opus 5 (1M context) --- tool/dependencies/known-dependencies.txt | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tool/dependencies/known-dependencies.txt b/tool/dependencies/known-dependencies.txt index 3aec99db6b7..950567e7123 100644 --- a/tool/dependencies/known-dependencies.txt +++ b/tool/dependencies/known-dependencies.txt @@ -118,8 +118,10 @@ commons-codec-1.10.jar commons-codec-1.15.jar commons-collections-3.2.2.jar commons-collections4-4.4.jar +commons-compiler-3.1.10.jar commons-compiler-3.1.9.jar commons-compress-1.21.jar +commons-compress-1.26.0.jar commons-compress-1.26.1.jar commons-configuration-1.10.jar commons-configuration2-2.1.1.jar @@ -464,8 +466,11 @@ htrace-core4-4.2.0-incubating.jar httpasyncclient-4.1.5.jar httpclient-4.5.13.jar httpclient-4.5.14.jar +httpclient5-5.1.4.jar httpcore-4.4.16.jar httpcore-nio-4.4.16.jar +httpcore5-5.1.5.jar +httpcore5-h2-5.1.5.jar httpmime-4.5.13.jar httpmime-4.5.14.jar icu4j-67.1.jar @@ -513,6 +518,7 @@ jackson-module-parameter-names-2.13.4.jar jackson-module-parameter-names-2.15.0.jar jackson-module-scala_2.11-2.15.0.jar jackson-module-scala_2.12-2.13.4.jar +jackson-module-scala_2.12-2.15.0.jar jackson-xc-1.9.13.jar jackson-xc-1.9.2.jar jakarta.activation-1.2.2.jar @@ -525,6 +531,7 @@ jakarta.websocket-api-1.1.2.jar jakarta.xml.bind-api-2.3.3.jar jamon-runtime-2.3.1.jar jamon-runtime-2.4.1.jar +janino-3.1.10.jar janino-3.1.9.jar jasper-compiler-5.5.23.jar jasper-runtime-5.5.23.jar @@ -547,6 +554,7 @@ javolution-5.5.1.jar jaxb-api-2.3.1.jar jaxb-impl-2.2.3-1.jar jaxb-runtime-2.3.8.jar +jaxb-runtime-2.3.9.jar jboss-logging-3.4.3.Final.jar jcip-annotations-1.0-1.jar jcl-over-slf4j-1.7.36.jar @@ -708,6 +716,8 @@ leveldbjni-all-1.8.jar libfb303-0.9.3.jar libthrift-0.15.0.jar libthrift-0.15.0.pom +libthrift-0.23.0.jar +libthrift-0.23.0.pom libthrift-0.9.3.jar listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar log-0.191.jar @@ -732,12 +742,17 @@ mchange-commons-java-0.2.15.jar memory-0.9.0.jar metrics-core-2.2.0.jar metrics-core-4.2.18.jar +metrics-core-4.2.22.jar metrics-json-4.2.18.jar +metrics-json-4.2.22.jar metrics-jvm-4.2.18.jar +metrics-jvm-4.2.22.jar micrometer-core-1.9.10.jar micrometer-core-1.9.11.jar +micrometer-core-1.9.17.jar micrometer-registry-prometheus-1.9.10.jar micrometer-registry-prometheus-1.9.11.jar +micrometer-registry-prometheus-1.9.17.jar minlog-1.3.0.jar mongo-java-driver-3.12.8.jar msal4j-1.15.1.jar @@ -811,8 +826,10 @@ netty-handler-ssl-ocsp-4.1.86.Final.jar netty-handler-ssl-ocsp-4.2.7.Final.jar netty-incubator-codec-classes-quic-0.0.39.Final.jar netty-incubator-codec-classes-quic-0.0.40.Final.jar +netty-incubator-codec-classes-quic-0.0.52.Final.jar netty-incubator-codec-native-quic-0.0.39.Final-linux-x86_64.jar netty-incubator-codec-native-quic-0.0.40.Final-linux-x86_64.jar +netty-incubator-codec-native-quic-0.0.52.Final-linux-x86_64.jar netty-resolver-4.1.86.Final.jar netty-resolver-4.2.7.Final.jar netty-resolver-dns-4.1.86.Final.jar @@ -914,19 +931,24 @@ quartz-2.3.2.jar re2j-1.1.jar reactive-streams-1.0.4.jar reactor-core-3.4.29.jar +reactor-core-3.4.34.jar reactor-extra-3.4.10.jar reactor-netty-0.9.7.RELEASE.jar reactor-netty-1.0.31.jar reactor-netty-1.0.32.jar +reactor-netty-1.0.39.jar reactor-netty-core-1.0.31.jar reactor-netty-core-1.0.32.jar +reactor-netty-core-1.0.39.jar reactor-netty-http-1.0.31.jar reactor-netty-http-1.0.32.jar reactor-netty-http-1.0.39.jar reactor-netty-http-brave-1.0.31.jar reactor-netty-http-brave-1.0.32.jar +reactor-netty-http-brave-1.0.39.jar reactor-netty-incubator-quic-0.0.20.jar reactor-netty-incubator-quic-0.0.21.jar +reactor-netty-incubator-quic-0.0.28.jar reflections-0.9.12.jar reload4j-1.2.19.jar scala-compiler-2.11.12.jar @@ -993,45 +1015,64 @@ spring-beans-5.3.27.jar spring-beans-5.3.34.jar spring-boot-2.7.11.jar spring-boot-2.7.12.jar +spring-boot-2.7.18.jar spring-boot-actuator-2.7.11.jar spring-boot-actuator-2.7.12.jar +spring-boot-actuator-2.7.18.jar spring-boot-actuator-autoconfigure-2.7.11.jar spring-boot-actuator-autoconfigure-2.7.12.jar +spring-boot-actuator-autoconfigure-2.7.18.jar spring-boot-admin-server-2.7.16.jar spring-boot-admin-server-cloud-2.7.16.jar spring-boot-admin-server-ui-2.7.16.jar spring-boot-admin-starter-server-2.7.16.jar spring-boot-autoconfigure-2.7.11.jar spring-boot-autoconfigure-2.7.12.jar +spring-boot-autoconfigure-2.7.18.jar spring-boot-starter-2.7.11.jar spring-boot-starter-2.7.12.jar +spring-boot-starter-2.7.18.jar spring-boot-starter-actuator-2.7.11.jar spring-boot-starter-actuator-2.7.12.jar +spring-boot-starter-actuator-2.7.18.jar spring-boot-starter-aop-2.7.11.jar spring-boot-starter-aop-2.7.12.jar +spring-boot-starter-aop-2.7.18.jar spring-boot-starter-cache-2.7.11.jar spring-boot-starter-cache-2.7.12.jar +spring-boot-starter-cache-2.7.18.jar spring-boot-starter-freemarker-2.7.11.jar spring-boot-starter-freemarker-2.7.12.jar +spring-boot-starter-freemarker-2.7.18.jar spring-boot-starter-jdbc-2.7.11.jar spring-boot-starter-jetty-2.7.11.jar spring-boot-starter-jetty-2.7.12.jar +spring-boot-starter-jetty-2.7.18.jar spring-boot-starter-json-2.7.11.jar spring-boot-starter-json-2.7.12.jar +spring-boot-starter-json-2.7.18.jar spring-boot-starter-log4j2-2.7.11.jar spring-boot-starter-log4j2-2.7.12.jar +spring-boot-starter-log4j2-2.7.18.jar spring-boot-starter-quartz-2.7.11.jar spring-boot-starter-quartz-2.7.12.jar +spring-boot-starter-quartz-2.7.18.jar spring-boot-starter-reactor-netty-2.7.11.jar spring-boot-starter-reactor-netty-2.7.12.jar +spring-boot-starter-reactor-netty-2.7.18.jar +spring-boot-starter-security-2.7.18.jar spring-boot-starter-thymeleaf-2.7.11.jar spring-boot-starter-thymeleaf-2.7.12.jar +spring-boot-starter-thymeleaf-2.7.18.jar spring-boot-starter-validation-2.7.11.jar spring-boot-starter-validation-2.7.12.jar +spring-boot-starter-validation-2.7.18.jar spring-boot-starter-web-2.7.11.jar spring-boot-starter-web-2.7.12.jar +spring-boot-starter-web-2.7.18.jar spring-boot-starter-webflux-2.7.11.jar spring-boot-starter-webflux-2.7.12.jar +spring-boot-starter-webflux-2.7.18.jar spring-cloud-commons-3.1.7.jar spring-cloud-context-3.1.7.jar spring-cloud-gateway-server-3.1.8.jar @@ -1053,6 +1094,9 @@ spring-core-5.3.27.jar spring-core-5.3.34.jar spring-expression-5.3.27.jar spring-expression-5.3.34.jar +spring-security-config-5.7.11.jar +spring-security-core-5.7.11.jar +spring-security-web-5.7.11.jar springfox-bean-validators-2.10.5.jar springfox-bean-validators-3.0.0.jar springfox-boot-starter-3.0.0.jar @@ -1110,12 +1154,15 @@ tephra-core-0.6.0.jar tephra-hbase-compat-1.0-0.6.0.jar thymeleaf-3.0.15.RELEASE.jar thymeleaf-3.1.2.RELEASE.jar +thymeleaf-3.1.5.RELEASE.jar thymeleaf-extras-java8time-3.0.4.RELEASE.jar thymeleaf-spring5-3.0.15.RELEASE.jar thymeleaf-spring5-3.1.2.RELEASE.jar +thymeleaf-spring5-3.1.5.RELEASE.jar token-provider-1.0.1.jar tomcat-embed-el-9.0.74.jar tomcat-embed-el-9.0.75.jar +tomcat-embed-el-9.0.83.jar transaction-api-1.1.jar trino-client-371.jar twill-api-0.6.0-incubating.jar @@ -1125,6 +1172,7 @@ twill-discovery-api-0.6.0-incubating.jar twill-discovery-core-0.6.0-incubating.jar twill-zookeeper-0.6.0-incubating.jar txw2-2.3.8.jar +txw2-2.3.9.jar unbescape-1.1.6.RELEASE.jar units-1.3.jar units-1.6.jar