You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2019/10/04 16:49:57 UTC
[tomcat] 01/02: Add a module check when processing the scan for
server endpoints
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 40021ab1a249366855a4ccb8643f9c58c19a81d0
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Oct 4 17:44:04 2019 +0100
Add a module check when processing the scan for server endpoints
---
java/org/apache/tomcat/util/compat/Jre9Compat.java | 21 +++++++++++++++++++++
java/org/apache/tomcat/util/compat/JreCompat.java | 13 +++++++++++++
java/org/apache/tomcat/websocket/server/WsSci.java | 9 +++++++--
webapps/docs/changelog.xml | 4 ++++
4 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/java/org/apache/tomcat/util/compat/Jre9Compat.java b/java/org/apache/tomcat/util/compat/Jre9Compat.java
index 98adc3d..29fef06 100644
--- a/java/org/apache/tomcat/util/compat/Jre9Compat.java
+++ b/java/org/apache/tomcat/util/compat/Jre9Compat.java
@@ -59,6 +59,8 @@ class Jre9Compat extends JreCompat {
private static final Object RUNTIME_VERSION;
private static final int RUNTIME_MAJOR_VERSION;
private static final Method canAccessMethod;
+ private static final Method getModuleMethod;
+ private static final Method isExportedMethod;
static {
Class<?> c1 = null;
@@ -77,6 +79,8 @@ class Jre9Compat extends JreCompat {
Object o14 = null;
Object o15 = null;
Method m16 = null;
+ Method m17 = null;
+ Method m18 = null;
try {
// Order is important for the error handling below.
@@ -107,6 +111,9 @@ class Jre9Compat extends JreCompat {
o14 = runtimeVersionMethod.invoke(null);
o15 = majorMethod.invoke(o14);
m16 = AccessibleObject.class.getMethod("canAccess", new Class<?>[] { Object.class });
+ m17 = Class.class.getMethod("getModule");
+ Class<?> moduleClass = Class.forName("java.lang.Module");
+ m18 = moduleClass.getMethod("isExported", String.class);
} catch (ClassNotFoundException e) {
if (c1 == null) {
@@ -144,6 +151,8 @@ class Jre9Compat extends JreCompat {
}
canAccessMethod = m16;
+ getModuleMethod = m17;
+ isExportedMethod = m18;
}
@@ -253,4 +262,16 @@ class Jre9Compat extends JreCompat {
return false;
}
}
+
+
+ @Override
+ public boolean isExported(Class<?> type) {
+ try {
+ String packageName = type.getPackage().getName();
+ Object module = getModuleMethod.invoke(type);
+ return ((Boolean) isExportedMethod.invoke(module, packageName)).booleanValue();
+ } catch (ReflectiveOperationException e) {
+ return false;
+ }
+ }
}
diff --git a/java/org/apache/tomcat/util/compat/JreCompat.java b/java/org/apache/tomcat/util/compat/JreCompat.java
index 9576fbd..b33175b 100644
--- a/java/org/apache/tomcat/util/compat/JreCompat.java
+++ b/java/org/apache/tomcat/util/compat/JreCompat.java
@@ -211,4 +211,17 @@ public class JreCompat {
// Java 8 doesn't support modules so default to true
return true;
}
+
+
+ /**
+ * Is the given class in an exported package?
+ *
+ * @param type The class to test
+ *
+ * @return Always {@code true} for Java 8. {@code true} if the enclosing
+ * package is exported for Java 9+
+ */
+ public boolean isExported(Class<?> type) {
+ return true;
+ }
}
diff --git a/java/org/apache/tomcat/websocket/server/WsSci.java b/java/org/apache/tomcat/websocket/server/WsSci.java
index 6f98f43..6396c60 100644
--- a/java/org/apache/tomcat/websocket/server/WsSci.java
+++ b/java/org/apache/tomcat/websocket/server/WsSci.java
@@ -31,6 +31,8 @@ import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpoint;
import javax.websocket.server.ServerEndpointConfig;
+import org.apache.tomcat.util.compat.JreCompat;
+
/**
* Registers an interest in any class that is annotated with
* {@link ServerEndpoint} so that Endpoint can be published via the WebSocket
@@ -60,11 +62,14 @@ public class WsSci implements ServletContainerInitializer {
String wsPackage = ContainerProvider.class.getName();
wsPackage = wsPackage.substring(0, wsPackage.lastIndexOf('.') + 1);
for (Class<?> clazz : clazzes) {
+ JreCompat jreCompat = JreCompat.getInstance();
int modifiers = clazz.getModifiers();
if (!Modifier.isPublic(modifiers) ||
Modifier.isAbstract(modifiers) ||
- Modifier.isInterface(modifiers)) {
- // Non-public, abstract or interface - skip it.
+ Modifier.isInterface(modifiers) ||
+ !jreCompat.isExported(clazz)) {
+ // Non-public, abstract, interface or not in an exported
+ // package (Java 9+) - skip it.
continue;
}
// Protect against scanning the WebSocket API JARs
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index cde6e30..239241e 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -93,6 +93,10 @@
Socket HTTP upgrade request only contains a port if a non-default port
is being used. (markt)
</fix>
+ <fix>
+ When running on Java 9 and above, don't attempt to instantiate WebSocket
+ Endpoints found in modules that are not exported. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Web Applications">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org