package fitnesse.slim.instructions; import java.security.Permission; public class SystemExitSecurityManager extends SecurityManager { public static final String PREVENT_SYSTEM_EXIT = "prevent.system.exit"; private SecurityManager delegate; /** * The {@link SystemExitSecurityManager} overrides the behavior of the wrapped * original {@link SecurityManager} to prevent {@link System#exit(int)} calls * from being executed. * * @author Anis Ben Hamidene * */ private SystemExitSecurityManager(SecurityManager delegate) { this.delegate = delegate; } /** * Replaces the current {@link SecurityManager} with a * {@link SystemExitSecurityManager}. */ public static void activateIfWanted() { if (isPreventSystemExit()) { SecurityManager currentSecMgr = System.getSecurityManager(); SystemExitSecurityManager systemExitSecurityManager = new SystemExitSecurityManager( currentSecMgr); System.setSecurityManager(systemExitSecurityManager); } } public static void restoreOriginalSecurityManager() { SecurityManager currentSecMgr = System.getSecurityManager(); if (currentSecMgr != null && currentSecMgr instanceof SystemExitSecurityManager) { SecurityManager originalSecurityManager = ((SystemExitSecurityManager) currentSecMgr).delegate; System.setSecurityManager(originalSecurityManager); } } private static boolean isPreventSystemExit() { String preventSystemExitString = System.getProperty(PREVENT_SYSTEM_EXIT); if (preventSystemExitString != null) { return Boolean.parseBoolean(preventSystemExitString); } else { return true; } } @Override public void checkExit(int status) { throw new SystemExitException("prevented system exit with exit code " + status); } @Override public void checkPermission(Permission perm, Object context) { if (delegate != null) { delegate.checkPermission(perm, context); } } @Override public void checkPermission(Permission perm) { if (delegate != null) { delegate.checkPermission(perm); } } @Override public void checkCreateClassLoader() { if (delegate != null) { delegate.checkCreateClassLoader(); } } @Override public void checkAccess(Thread t) { if (delegate != null) { delegate.checkAccess(t); } } @Override public void checkAccess(ThreadGroup g) { if (delegate != null) { delegate.checkAccess(g); } } @Override public void checkExec(String cmd) { if (delegate != null) { delegate.checkExec(cmd); } } @Override public void checkLink(String lib) { if (delegate != null) { delegate.checkLink(lib); } } @Override public void checkRead(String file) { if (delegate != null) { delegate.checkRead(file); } } @Override public void checkRead(String file, Object context) { if (delegate != null) { delegate.checkRead(file, context); } } @Override public void checkWrite(String file) { if (delegate != null) { delegate.checkWrite(file); } } @Override public void checkDelete(String file) { if (delegate != null) { delegate.checkDelete(file); } } @Override public void checkConnect(String host, int port) { if (delegate != null) { delegate.checkConnect(host, port); } } @Override public void checkConnect(String host, int port, Object context) { if (delegate != null) { delegate.checkConnect(host, port, context); } } @Override public void checkListen(int port) { if (delegate != null) { delegate.checkListen(port); } } @Override public void checkAccept(String host, int port) { if (delegate != null) { delegate.checkAccept(host, port); } } @Override public void checkPropertiesAccess() { if (delegate != null) { delegate.checkPropertiesAccess(); } } @Override public void checkPropertyAccess(String key) { if (delegate != null) { delegate.checkPropertyAccess(key); } } @Override public boolean checkTopLevelWindow(Object window) { if (delegate != null) { return delegate.checkTopLevelWindow(window); } else { return false; } } @Override public void checkPrintJobAccess() { if (delegate != null) { delegate.checkPrintJobAccess(); } } @Override public void checkSystemClipboardAccess() { if (delegate != null) { delegate.checkSystemClipboardAccess(); } } @Override public void checkAwtEventQueueAccess() { if (delegate != null) { delegate.checkAwtEventQueueAccess(); } } @Override public void checkPackageAccess(String pkg) { if (delegate != null) { delegate.checkPackageAccess(pkg); } } @Override public void checkPackageDefinition(String pkg) { if (delegate != null) { delegate.checkPackageDefinition(pkg); } } @Override public void checkSetFactory() { if (delegate != null) { delegate.checkSetFactory(); } } @Override public void checkMemberAccess(Class<?> clazz, int which) { if (delegate != null) { delegate.checkMemberAccess(clazz, which); } } @Override public void checkSecurityAccess(String target) { if (delegate != null) { delegate.checkSecurityAccess(target); } } public static class SystemExitException extends SecurityException { public SystemExitException(String message) { super(message); } private static final long serialVersionUID = 2584644457111168436L; } }