diff --git a/modules/javafx.base/src/main/java/com/sun/javafx/SecurityUtil.java b/modules/javafx.base/src/main/java/com/sun/javafx/SecurityUtil.java new file mode 100644 index 00000000000..4a410eddde0 --- /dev/null +++ b/modules/javafx.base/src/main/java/com/sun/javafx/SecurityUtil.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.javafx; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Utility class to check for the presence of a security manager. + */ +public class SecurityUtil { + + // Prevent class from being instantiated. + private SecurityUtil() {} + + /** + * Check for the presence of a security manager (from an older JDK) and + * throw UnsupportedOperationException if enabled. Use reflection to avoid + * a dependency on an API that is deprecated for removal. This method does + * nothing if the security manager is not enabled or if + * System::getSecurityManager cannot be invoked. + * + * @throws UnsupportedOperationException if the security manager is enabled + */ + public static void checkSecurityManager() { + try { + // Call System.getSecurityManager() using reflection. Throw an + // UnsupportedOperationException if it returns a non-null object. + // If we cannot find or invoke getSecurityManager, ignore the error. + Method meth = System.class.getMethod("getSecurityManager"); + Object sm = meth.invoke(null); + if (sm != null) { + throw new UnsupportedOperationException("JavaFX does not support running with the Security Manager"); + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + // Ignore the error + } + } +} diff --git a/modules/javafx.base/src/main/java/com/sun/javafx/reflect/MethodUtil.java b/modules/javafx.base/src/main/java/com/sun/javafx/reflect/MethodUtil.java index 7f5a83cc31a..01d30b90e8c 100644 --- a/modules/javafx.base/src/main/java/com/sun/javafx/reflect/MethodUtil.java +++ b/modules/javafx.base/src/main/java/com/sun/javafx/reflect/MethodUtil.java @@ -25,6 +25,7 @@ package com.sun.javafx.reflect; +import com.sun.javafx.SecurityUtil; import java.security.AllPermission; import java.security.AccessController; import java.security.PermissionCollection; @@ -77,6 +78,12 @@ private static Object invoke(Method m, Object obj, Object[] params) * Create a trampoline class. */ public final class MethodUtil extends SecureClassLoader { + + static { + // Check for security manager (throws exception if enabled) + SecurityUtil.checkSecurityManager(); + } + private static final String MISC_PKG = "com.sun.javafx.reflect."; private static final String TRAMPOLINE = MISC_PKG + "Trampoline"; private static final Method bounce = getTrampoline(); diff --git a/modules/javafx.base/src/main/java/com/sun/javafx/reflect/ReflectUtil.java b/modules/javafx.base/src/main/java/com/sun/javafx/reflect/ReflectUtil.java index 64ebd55dc38..5a5e99dfde9 100644 --- a/modules/javafx.base/src/main/java/com/sun/javafx/reflect/ReflectUtil.java +++ b/modules/javafx.base/src/main/java/com/sun/javafx/reflect/ReflectUtil.java @@ -26,10 +26,16 @@ package com.sun.javafx.reflect; +import com.sun.javafx.SecurityUtil; import java.lang.reflect.Proxy; public final class ReflectUtil { + static { + // Check for security manager (throws exception if enabled) + SecurityUtil.checkSecurityManager(); + } + private ReflectUtil() { } diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/application/LauncherImpl.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/application/LauncherImpl.java index 950b8ffc13a..75b4a8783e6 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/application/LauncherImpl.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/application/LauncherImpl.java @@ -26,6 +26,7 @@ package com.sun.javafx.application; import com.sun.javafx.PlatformUtil; +import com.sun.javafx.SecurityUtil; import javafx.application.Application; import javafx.application.Preloader; import javafx.application.Preloader.ErrorNotification; @@ -57,12 +58,8 @@ public class LauncherImpl { static { - @SuppressWarnings("removal") - var sm = System.getSecurityManager(); - if (sm != null) { - throw new UnsupportedOperationException("JavaFX does not support running with the Security Manager"); - } - + // Check for security manager (throws exception if enabled) + SecurityUtil.checkSecurityManager(); } /** diff --git a/modules/javafx.graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java b/modules/javafx.graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java index 03e6bad0812..19b69fefc03 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java +++ b/modules/javafx.graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java @@ -26,6 +26,7 @@ package com.sun.javafx.application; import com.sun.javafx.PlatformUtil; +import com.sun.javafx.SecurityUtil; import com.sun.javafx.application.preferences.PlatformPreferences; import com.sun.javafx.application.preferences.PreferenceMapping; import com.sun.javafx.css.StyleManager; @@ -59,12 +60,8 @@ public class PlatformImpl { static { - @SuppressWarnings("removal") - var sm = System.getSecurityManager(); - if (sm != null) { - throw new UnsupportedOperationException("JavaFX does not support running with the Security Manager"); - } - + // Check for security manager (throws exception if enabled) + SecurityUtil.checkSecurityManager(); } private static AtomicBoolean initialized = new AtomicBoolean(false);