diff --git a/dependencyCheckSuppression.xml b/dependencyCheckSuppression.xml
index 5f8f9d157b..e05aa61253 100644
--- a/dependencyCheckSuppression.xml
+++ b/dependencyCheckSuppression.xml
@@ -194,5 +194,27 @@
^pkg:maven/io\.github\.x-stream/mxparser@.*$
cpe:/a:xstream:xstream
-
+
+
+
+
+ ^pkg:maven/org\.itadaki/bzip2@.*$
+ CVE-2019-12900
+
+
+
+ ^pkg:maven/org\.itadaki/bzip2@.*$
+ CVE-2010-0405
+
+
+
+ ^pkg:maven/org\.itadaki/bzip2@.*$
+ CVE-2005-1260
+
diff --git a/gradle.properties b/gradle.properties
index 2d66b83b58..cd4d71ad49 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -44,7 +44,7 @@ buildFromSource=true
# The default version for LabKey artifacts that are built or that we depend on.
# override in an individual module's gradle.properties file as necessary
-labkeyVersion=25.3.11
+labkeyVersion=25.3.12
labkeyClientApiVersion=6.2.0
# Version numbers for the various binary artifacts that are included when
@@ -99,7 +99,7 @@ apacheDirectoryVersion=2.1.7
apacheMinaVersion=2.2.4
# Usually matches the version specified as a Spring Boot dependency (see springBootVersion below)
-apacheTomcatVersion=10.1.40
+apacheTomcatVersion=10.1.41
# (mothership) -> json-path -> json-smart -> accessor-smart
# (core) -> graalvm
diff --git a/server/configs/application.properties b/server/configs/application.properties
index 2cdc072243..8f85e56fca 100644
--- a/server/configs/application.properties
+++ b/server/configs/application.properties
@@ -58,6 +58,7 @@ context.encryptionKey=@@encryptionKey@@
#context.additionalWebapps.firstContextPath=/my/webapp/path
#context.additionalWebapps.secondContextPath=/my/other/webapp/path
+#context.externalModules=/path/to/external/modules/dir
#context.requiredModules=
#context.pipelineConfig=/path/to/pipeline/config/dir
#context.serverGUID=
diff --git a/server/embedded/src/org/labkey/embedded/LabKeyServer.java b/server/embedded/src/org/labkey/embedded/LabKeyServer.java
index 0ed7ce5d14..54057d5750 100644
--- a/server/embedded/src/org/labkey/embedded/LabKeyServer.java
+++ b/server/embedded/src/org/labkey/embedded/LabKeyServer.java
@@ -431,6 +431,8 @@ public static class ContextProperties
private String contextPath = "";
private String pipelineConfig;
private String requiredModules;
+ /** Path to external modules directory */
+ private String externalModules;
private boolean bypass2FA = false;
private String serverGUID;
private Integer httpPort;
@@ -576,6 +578,16 @@ public void setRequiredModules(String requiredModules)
this.requiredModules = requiredModules;
}
+ public String getExternalModules()
+ {
+ return externalModules;
+ }
+
+ public void setExternalModules(String externalModules)
+ {
+ this.externalModules = externalModules;
+ }
+
public boolean isBypass2FA()
{
return bypass2FA;
diff --git a/server/embedded/src/org/labkey/embedded/LabKeyTomcatServletWebServerFactory.java b/server/embedded/src/org/labkey/embedded/LabKeyTomcatServletWebServerFactory.java
index d70bb4b16f..a02a5312e1 100644
--- a/server/embedded/src/org/labkey/embedded/LabKeyTomcatServletWebServerFactory.java
+++ b/server/embedded/src/org/labkey/embedded/LabKeyTomcatServletWebServerFactory.java
@@ -175,6 +175,11 @@ protected TomcatWebServer getTomcatWebServer(Tomcat tomcat)
{
context.addParameter("requiredModules", contextProperties.getRequiredModules());
}
+ if (contextProperties.getExternalModules() != null)
+ {
+ // We've long supported configuring this via a system property so propagate the value
+ System.setProperty("labkey.externalModulesDir", contextProperties.getExternalModules());
+ }
if (contextProperties.getPipelineConfig() != null)
{
context.addParameter("org.labkey.api.pipeline.config", contextProperties.getPipelineConfig());