vhardy 02/05/02 08:46:27
Modified: resources/org/apache/batik/apps/svgbrowser/resources
svgbrowser.bin.policy svgbrowser.policy
resources/org/apache/batik/util/resources
Messages.properties
sources/org/apache/batik/apps/rasterizer Main.java
sources/org/apache/batik/apps/svgbrowser Main.java
Added: resources/org/apache/batik/apps/rasterizer/resources
rasterizer.bin.policy rasterizer.policy
sources/org/apache/batik/util
ApplicationSecurityEnforcer.java Messages.java
Log:
Created utility to let class easily enforce script security. This is now used by the
browser and the rasterizer
Revision Changes Path
1.1
xml-batik/resources/org/apache/batik/apps/rasterizer/resources/rasterizer.bin.policy
Index: rasterizer.bin.policy
===================================================================
grant codeBase "${app.jar.base}/classes/" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/crimson-parser.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/batik-rasterizer.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-ext.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-dom.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-css.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-svg-dom.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-gvt.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-parser.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-script.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-bridge.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-swing.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-transcoder.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-gui-util.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-awt-util.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-util.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/batik-xml.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.jar.base}/lib/js.jar" {
permission java.lang.RuntimePermission "createClassLoader";
permission java.net.SocketPermission "*", "listen, connect, resolve, accept";
};
1.1
xml-batik/resources/org/apache/batik/apps/rasterizer/resources/rasterizer.policy
Index: rasterizer.policy
===================================================================
/* AUTOMATICALLY GENERATED ON Wed Apr 17 13:44:15 CEST 2002*/
/* DO NOT EDIT */
grant codeBase "${app.dev.base}/classes/" {
permission java.security.AllPermission;
};
grant codeBase "${app.dev.base}/lib/crimson-parser.jar" {
permission java.security.AllPermission;
};
grant codeBase "${app.dev.base}/lib/js.jar" {
permission java.lang.RuntimePermission "createClassLoader";
permission java.net.SocketPermission "*", "listen, connect, resolve, accept";
};
1.3 +18 -18
xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.bin.policy
Index: svgbrowser.bin.policy
===================================================================
RCS file:
/home/cvs/xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.bin.policy,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- svgbrowser.bin.policy 30 Apr 2002 15:05:18 -0000 1.2
+++ svgbrowser.bin.policy 2 May 2002 15:46:26 -0000 1.3
@@ -1,72 +1,72 @@
-grant codeBase "${squiggle.jar.base}/classes/" {
+grant codeBase "${app.jar.base}/classes/" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/crimson-parser.jar" {
+grant codeBase "${app.jar.base}/lib/crimson-parser.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/batik-svgbrowser.jar" {
+grant codeBase "${app.jar.base}/batik-svgbrowser.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-ext.jar" {
+grant codeBase "${app.jar.base}/lib/batik-ext.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-dom.jar" {
+grant codeBase "${app.jar.base}/lib/batik-dom.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-css.jar" {
+grant codeBase "${app.jar.base}/lib/batik-css.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-svg-dom.jar" {
+grant codeBase "${app.jar.base}/lib/batik-svg-dom.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-gvt.jar" {
+grant codeBase "${app.jar.base}/lib/batik-gvt.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-parser.jar" {
+grant codeBase "${app.jar.base}/lib/batik-parser.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-script.jar" {
+grant codeBase "${app.jar.base}/lib/batik-script.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-bridge.jar" {
+grant codeBase "${app.jar.base}/lib/batik-bridge.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-swing.jar" {
+grant codeBase "${app.jar.base}/lib/batik-swing.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-transcoder.jar" {
+grant codeBase "${app.jar.base}/lib/batik-transcoder.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-gui-util.jar" {
+grant codeBase "${app.jar.base}/lib/batik-gui-util.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-awt-util.jar" {
+grant codeBase "${app.jar.base}/lib/batik-awt-util.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-util.jar" {
+grant codeBase "${app.jar.base}/lib/batik-util.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/batik-xml.jar" {
+grant codeBase "${app.jar.base}/lib/batik-xml.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.jar.base}/lib/js.jar" {
+grant codeBase "${app.jar.base}/lib/js.jar" {
permission java.lang.RuntimePermission "createClassLoader";
permission java.net.SocketPermission "*", "listen, connect, resolve, accept";
};
1.3 +3 -3
xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy
Index: svgbrowser.policy
===================================================================
RCS file:
/home/cvs/xml-batik/resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- svgbrowser.policy 30 Apr 2002 15:05:18 -0000 1.2
+++ svgbrowser.policy 2 May 2002 15:46:26 -0000 1.3
@@ -1,15 +1,15 @@
/* AUTOMATICALLY GENERATED ON Wed Apr 17 13:44:15 CEST 2002*/
/* DO NOT EDIT */
-grant codeBase "${squiggle.dev.base}/classes/" {
+grant codeBase "${app.dev.base}/classes/" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.dev.base}/lib/crimson-parser.jar" {
+grant codeBase "${app.dev.base}/lib/crimson-parser.jar" {
permission java.security.AllPermission;
};
-grant codeBase "${squiggle.dev.base}/lib/js.jar" {
+grant codeBase "${app.dev.base}/lib/js.jar" {
permission java.lang.RuntimePermission "createClassLoader";
permission java.net.SocketPermission "*", "listen, connect, resolve, accept";
};
1.1
xml-batik/sources/org/apache/batik/util/ApplicationSecurityEnforcer.java
Index: ApplicationSecurityEnforcer.java
===================================================================
/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.batik.util;
import java.net.URL;
import java.security.Policy;
/**
* This is a helper class which helps applications enforce secure
* script execution.
* <br />
* It is used by the Squiggle browser as well as the rasterizer.
* <br />
* This class can install a <tt>SecurityManager</tt> for an application
* and resolves whether the application runs in a development
* environment or from a jar file (in other words, it resolves code-base
* issues for the application).
* <br />
*
* @author <a mailto="[EMAIL PROTECTED]">Vincent Hardy</a>
* @version $Id: ApplicationSecurityEnforcer.java,v 1.1 2002/05/02 15:46:26 vhardy
Exp $
*/
public class ApplicationSecurityEnforcer {
/**
* Message for the SecurityException thrown when there is already
* a SecurityManager installed at the time Squiggle tries
* to install its own security settings.
*/
public static final String EXCEPTION_ALIEN_SECURITY_MANAGER
=
"ApplicationSecurityEnforcer.message.security.exception.alien.security.manager";
/**
* Message for the NullPointerException thrown when no policy
* file can be found.
*/
public static final String EXCEPTION_NO_POLICY_FILE
=
"ApplicationSecurityEnforcer.message.null.pointer.exception.no.policy.file";
/**
* System property for specifying an additional policy file.
*/
public static final String PROPERTY_JAVA_SECURITY_POLICY
= "java.security.policy";
/**
* Files in a jar file have a URL with the jar protocol
*/
public static final String JAR_PROTOCOL
= "jar:";
/**
* Used in jar file urls to separate the jar file name
* from the referenced file
*/
public static final String JAR_URL_FILE_SEPARATOR
= "!/";
/**
* System property for App's development base directory
*/
public static final String PROPERTY_APP_DEV_BASE
= "app.dev.base";
/**
* System property for App's jars base directory
*/
public static final String PROPERTY_APP_JAR_BASE
= "app.jar.base";
/**
* Directory where classes are expanded in the development
* version
*/
public static final String APP_MAIN_CLASS_DIR
= "classes/";
/**
* The application's main entry point
*/
protected Class appMainClass;
/**
* The application's security policy
*/
protected String securityPolicy;
/**
* The jar file into which the application is packaged
*/
protected String appJarFile;
/**
* The resource name for the application's main class
*/
protected String appMainClassRelativeURL;
/**
* Keeps track of the last SecurityManager installed
*/
protected SecurityManager lastSecurityManagerInstalled;
/**
* @param appClass class of the applications's main entry point
* @param securityPolicy resource for the security policy which
* should be enforced for the application.
* @param appJarFile the Jar file into which the application is
* packaged.
*/
public ApplicationSecurityEnforcer(Class appMainClass,
String securityPolicy,
String appJarFile){
this.appMainClass = appMainClass;
this.securityPolicy = securityPolicy;
this.appJarFile = appJarFile;
this.appMainClassRelativeURL =
appMainClass.getName().replace('.', '/')
+
".class";
}
/**
* Enforces security by installing a <tt>SecurityManager</tt>.
* This will throw a <tt>SecurityException</tt> if installing
* a <tt>SecurityManager</tt> requires overriding an existing
* <tt>SecurityManager</tt>. In other words, this method will
* not install a new <tt>SecurityManager</tt> if there is
* already one it did not install in place.
*/
public void enforceSecurity(boolean enforce){
SecurityManager sm = System.getSecurityManager();
if (sm != null && sm != lastSecurityManagerInstalled) {
// Throw a Security exception: we do not want to override
// an 'alien' SecurityManager with either null or
// a new SecurityManager.
throw new SecurityException
(Messages.getString(EXCEPTION_ALIEN_SECURITY_MANAGER));
}
if (enforce) {
// We want to install a SecurityManager.
if (sm == null) {
installSecurityManager();
}
} else {
if (sm != null) {
System.setSecurityManager(null);
lastSecurityManagerInstalled = null;
}
}
}
/**
* Installs a SecurityManager on behalf of the application
*/
public void installSecurityManager(){
Policy policy = Policy.getPolicy();
SecurityManager securityManager = new SecurityManager();
// Specify app's security policy in the
// system property.
ClassLoader cl = appMainClass.getClassLoader();
URL url = cl.getResource(securityPolicy);
if (url == null) {
throw new NullPointerException
(Messages.formatMessage(EXCEPTION_NO_POLICY_FILE,
new Object[]{securityPolicy}));
}
System.setProperty(PROPERTY_JAVA_SECURITY_POLICY,
url.toString());
//
// The following detects whether the application is running in the
// development environment, in which case it will set the
// app.dev.base property or if it is running in the binary
// distribution, in which case it will set the app.jar.base
// property. These properties are expanded in the security
// policy files.
// Property expansion is used to provide portability of the
// policy files between various code bases (e.g., file base,
// server base, etc..).
//
url = cl.getResource(appMainClassRelativeURL);
if (url == null){
// Something is really wrong: we would be running a class
// which can't be found....
throw new Error(appMainClassRelativeURL);
}
String expandedMainClassName = url.toString();
if (expandedMainClassName.startsWith(JAR_PROTOCOL) ) {
setJarBase(expandedMainClassName);
} else {
setDevBase(expandedMainClassName);
}
// Install new security manager
System.setSecurityManager(securityManager);
lastSecurityManagerInstalled = securityManager;
// Forces re-loading of the security policy
policy.refresh();
System.out.println("Enforcing secure script execution");
}
private void setJarBase(String expandedMainClassName){
expandedMainClassName =
expandedMainClassName.substring(JAR_PROTOCOL.length());
int codeBaseEnd =
expandedMainClassName.indexOf(appJarFile +
JAR_URL_FILE_SEPARATOR +
appMainClassRelativeURL);
if (codeBaseEnd == -1){
// Something is seriously wrong. This should *never* happen
// as the APP_SECURITY_POLICY_URL is such that it will be
// a substring of its corresponding URL value
throw new Error();
}
String appCodeBase = expandedMainClassName.substring(0, codeBaseEnd);
System.setProperty(PROPERTY_APP_JAR_BASE, appCodeBase);
}
/**
* Position the app.dev.base property for expansion in
* the policy file used when App is running in its
* development version
*/
private void setDevBase(String expandedMainClassName){
int codeBaseEnd =
expandedMainClassName.indexOf(APP_MAIN_CLASS_DIR +
appMainClassRelativeURL);
if (codeBaseEnd == -1){
// Something is seriously wrong. This should *never* happen
// as the APP_SECURITY_POLICY_URL is such that it will be
// a substring of its corresponding URL value
throw new Error();
}
String appCodeBase = expandedMainClassName.substring(0, codeBaseEnd);
System.setProperty(PROPERTY_APP_DEV_BASE, appCodeBase);
}
}
1.1 xml-batik/sources/org/apache/batik/util/Messages.java
Index: Messages.java
===================================================================
/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.batik.util;
import java.util.Locale;
import java.util.MissingResourceException;
import org.apache.batik.i18n.Localizable;
import org.apache.batik.i18n.LocalizableSupport;
import org.apache.batik.util.gui.resource.ResourceManager;
/**
* This class manages the message for the security utilities
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a>
* @version $Id: Messages.java,v 1.1 2002/05/02 15:46:26 vhardy Exp $
*/
public class Messages {
/**
* This class does not need to be instantiated.
*/
protected Messages() { }
/**
* The error messages bundle class name.
*/
protected final static String RESOURCES =
"org.apache.batik.util.security.resources.Messages";
/**
* The localizable support for the error messages.
*/
protected static LocalizableSupport localizableSupport =
new LocalizableSupport(RESOURCES);
/**
* The resource manager to decode messages.
*/
protected static ResourceManager resourceManager =
new ResourceManager(localizableSupport.getResourceBundle());
/**
* Implements {@link org.apache.batik.i18n.Localizable#setLocale(Locale)}.
*/
public static void setLocale(Locale l) {
localizableSupport.setLocale(l);
resourceManager = new
ResourceManager(localizableSupport.getResourceBundle());
}
/**
* Implements {@link org.apache.batik.i18n.Localizable#getLocale()}.
*/
public static Locale getLocale() {
return localizableSupport.getLocale();
}
/**
* Implements {@link
* org.apache.batik.i18n.Localizable#formatMessage(String,Object[])}.
*/
public static String formatMessage(String key, Object[] args)
throws MissingResourceException {
return localizableSupport.formatMessage(key, args);
}
public static String getString(String key)
throws MissingResourceException {
return resourceManager.getString(key);
}
public static int getInteger(String key)
throws MissingResourceException {
return resourceManager.getInteger(key);
}
public static int getCharacter(String key)
throws MissingResourceException {
return resourceManager.getCharacter(key);
}
}
1.3 +15 -2
xml-batik/resources/org/apache/batik/util/resources/Messages.properties
Index: Messages.properties
===================================================================
RCS file:
/home/cvs/xml-batik/resources/org/apache/batik/util/resources/Messages.properties,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Messages.properties 24 Nov 2000 10:43:43 -0000 1.2
+++ Messages.properties 2 May 2002 15:46:26 -0000 1.3
@@ -6,14 +6,27 @@
# the LICENSE file. #
#############################################################################
#
-# The error messages for the bridge.
+# The error messages for the utility package
#
# Author: Thierry Kormann
#
-### UnitProcessor ###
+#
+# UnitProcessor
+#
invalid.svg.unit=The given unit is invalid : {0}
invalid.css.unit=The given CSS unit is invalid : {0}
+
+#
+# Security Enforcer
+#
+
+ApplicationSecurityEnforcer.message.security.exception.alien.security.manager=\
+The application cannot install or remove a security manager when there is \
+already one it place that it did not install.
+
+ApplicationSecurityEnforcer.message.null.pointer.exception.no.policy.file=\
+The application could not load the specificed security policy ({0})
1.18 +30 -1 xml-batik/sources/org/apache/batik/apps/rasterizer/Main.java
Index: Main.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/apps/rasterizer/Main.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- Main.java 7 Mar 2002 09:02:56 -0000 1.17
+++ Main.java 2 May 2002 15:46:26 -0000 1.18
@@ -28,6 +28,7 @@
import java.util.StringTokenizer;
import java.net.URL;
import java.net.MalformedURLException;
+
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
@@ -35,6 +36,9 @@
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.apache.batik.transcoder.image.TIFFTranscoder;
+
+import org.apache.batik.util.ApplicationSecurityEnforcer;
+
import org.xml.sax.InputSource;
/**
@@ -46,10 +50,22 @@
* <tt>SVGConverter</tt> which is used to perform the conversion.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a>
- * @version $Id: Main.java,v 1.17 2002/03/07 09:02:56 tkormann Exp $
+ * @version $Id: Main.java,v 1.18 2002/05/02 15:46:26 vhardy Exp $
*/
public class Main implements SVGConverterController {
/**
+ * Name of the rasterizer jar file
+ */
+ public static final String RASTERIZER_JAR_NAME
+ = "batik-rasterizer.jar";
+
+ /**
+ * URL for Squiggle's security policy file
+ */
+ public static final String RASTERIZER_SECURITY_POLICY
+ = "org/apache/batik/apps/rasterizer/resources/rasterizer.policy";
+
+ /**
* Interface for handling one command line option
*/
public static interface OptionHandler {
@@ -629,11 +645,24 @@
*/
protected Vector args;
+ /**
+ * Script security enforcement is delegated to the
+ * security utility
+ */
+ protected ApplicationSecurityEnforcer securityEnforcer;
+
public Main(String[] args){
this.args = new Vector();
for (int i=0; i<args.length; i++){
this.args.addElement(args[i]);
}
+
+ securityEnforcer =
+ new ApplicationSecurityEnforcer(this.getClass(),
+ RASTERIZER_SECURITY_POLICY,
+ RASTERIZER_JAR_NAME);
+
+ securityEnforcer.enforceSecurity(true);
}
protected void error(String errorCode,
1.30 +24 -217 xml-batik/sources/org/apache/batik/apps/svgbrowser/Main.java
Index: Main.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/apps/svgbrowser/Main.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- Main.java 30 Apr 2002 08:45:14 -0000 1.29
+++ Main.java 2 May 2002 15:46:26 -0000 1.30
@@ -51,13 +51,14 @@
import org.apache.batik.util.XMLResourceDescriptor;
import org.apache.batik.util.SVGConstants;
+import org.apache.batik.util.ApplicationSecurityEnforcer;
import org.apache.batik.util.gui.resource.ResourceManager;
/**
* This class contains the main method of an SVG viewer.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: Main.java,v 1.29 2002/04/30 08:45:14 vhardy Exp $
+ * @version $Id: Main.java,v 1.30 2002/05/02 15:46:26 vhardy Exp $
*/
public class Main implements Application {
/**
@@ -83,81 +84,16 @@
"org.apache.batik.apps.svgbrowser.resources.Main";
/**
- * Message for the SecurityException thrown when there is already
- * a SecurityManager installed at the time Squiggle tries
- * to install its own security settings.
- */
- public static final String EXCEPTION_ALIEN_SECURITY_MANAGER
- =
Resources.getString("Main.message.security.exception.alien.security.manager");
-
- /**
- * Message for the NullPointerException thrown when no policy
- * file can be found.
- */
- public static final String EXCEPTION_NO_SQUIGGLE_POLICY_FILE
- =
Resources.getString("Main.message.null.pointer.exception.no.squiggle.policy.file");
-
- /**
- * System property for specifying an additional policy file.
- */
- public static final String PROPERTY_JAVA_SECURITY_POLICY
- = "java.security.policy";
-
- /**
- * System property for Squiggle's development base directory
- */
- public static final String PROPERTY_SQUIGGLE_DEV_BASE
- = "squiggle.dev.base";
-
- /**
- * System property for Squiggle's jars base directory
- */
- public static final String PROPERTY_SQUIGGLE_JAR_BASE
- = "squiggle.jar.base";
-
- /**
- * URL for Squiggle's security policy file
- */
- public static final String SQUIGGLE_SECURITY_POLICY_URL
- = "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy"; //
"resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy";
-
- /**
- * URL for Squiggle's main class.
- */
- public static final String SQUIGGLE_MAIN_CLASS_URL
- = "org/apache/batik/apps/svgbrowser/Main.class";
-
- /**
- * Used in jar file urls to separate the jar file name
- * from the referenced file
- */
- public static final String JAR_URL_FILE_SEPARATOR
- = "!/";
-
- /**
- * Files in a jar file have a URL with the jar protocol
- */
- public static final String JAR_PROTOCOL
- = "jar:";
-
- /**
- * Directory where classes are expanded in the development
- * version
- */
- public static final String SQUIGGLE_MAIN_CLASS_DIR
- = "classes/";
-
- /**
* Name of the batik browser jar file
*/
- public static final String SQUIGGLE_ENTRY_JAR_NAME
+ public static final String SQUIGGLE_JAR_NAME
= "batik-svgbrowser.jar";
/**
- * Resource directory for the security policy
+ * URL for Squiggle's security policy file
*/
- public static final String SQUIGGLE_RESOURCE_DIR
- = "resources/";
+ public static final String SQUIGGLE_SECURITY_POLICY
+ = "org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy";
/**
* The resource bundle
@@ -190,10 +126,10 @@
protected String[] arguments;
/**
- * Controls whether the initial SecurityManager check
- * has been done.
+ * Script security enforcement is delegated to the
+ * security utility
*/
- protected boolean initialSecurityCheckDone;
+ protected ApplicationSecurityEnforcer securityEnforcer;
/**
* The option handlers.
@@ -220,6 +156,7 @@
public Main(String[] args) {
arguments = args;
+ //
// Preferences
//
Map defaults = new HashMap(11);
@@ -253,6 +190,11 @@
defaults.put(PreferenceDialog.PREFERENCE_KEY_CONSTRAIN_SCRIPT_ORIGIN,
Boolean.TRUE);
+ securityEnforcer
+ = new ApplicationSecurityEnforcer(this.getClass(),
+ SQUIGGLE_SECURITY_POLICY,
+ SQUIGGLE_JAR_NAME);
+
try {
preferenceManager = new XMLPreferenceManager("preferences.xml",
defaults);
@@ -263,8 +205,10 @@
preferenceManager.load();
setPreferences();
} catch (Exception e) {
+ e.printStackTrace();
}
+ //
// Initialization
//
final AboutDialog initDialog = new AboutDialog();
@@ -306,6 +250,9 @@
});
c.setSize(100, 100);
c.loadSVGDocument(Main.class.getResource("resources/init.svg").toString());
+
+
+
}
/**
@@ -552,150 +499,10 @@
System.setProperty("proxyPort", preferenceManager.getString
(PreferenceDialog.PREFERENCE_KEY_PROXY_PORT));
- if (!initialSecurityCheckDone){
- setInitialSecurityPreferences();
- } else {
- setSecurityPreferences();
- }
- }
-
- private void setSecurityPreferences() {
- boolean enforceSecureScripting
- =
preferenceManager.getBoolean(PreferenceDialog.PREFERENCE_KEY_ENFORCE_SECURE_SCRIPTING);
-
- if (enforceSecureScripting) {
- //
- // Check if there is an already installed SecurityManager
- //
- SecurityManager currentManager = System.getSecurityManager();
- if (currentManager == null){
- installSecurityManager();
- }
- } else {
- System.setSecurityManager(null);
- }
- }
-
- private void setInitialSecurityPreferences(){
- boolean enforceSecureScripting
- =
preferenceManager.getBoolean(PreferenceDialog.PREFERENCE_KEY_ENFORCE_SECURE_SCRIPTING);
-
- if (enforceSecureScripting) {
- //
- // Check if there is an already installed SecurityManager
- //
- SecurityManager currentManager = System.getSecurityManager();
- if (currentManager != null){
- //
- // It would be unsafe to continue if there is already a
SecurityManager
- // in place. This means Squiggle is not running as it was expected
to.
- // Therefore, we throw a SecurityException
- //
- throw new SecurityException(EXCEPTION_ALIEN_SECURITY_MANAGER);
- } else {
- initialSecurityCheckDone = true;
- }
-
- installSecurityManager();
- }
- }
-
- private void installSecurityManager(){
- // Make sure the security policy is enforced.
- Policy policy = Policy.getPolicy();
-
- // Install a new SecurityManager
- SecurityManager securityManager = new SecurityManager();
-
- // Specify squiggle's security policy in the
- // system property.
-
- ClassLoader cl = this.getClass().getClassLoader();
- URL url = cl.getResource(SQUIGGLE_SECURITY_POLICY_URL);
-
- if (url == null) {
- throw new NullPointerException(EXCEPTION_NO_SQUIGGLE_POLICY_FILE);
- }
-
- System.setProperty(PROPERTY_JAVA_SECURITY_POLICY,
- url.toString());
-
- //
- // The following detects whether the browser is running in the
- // development environment, in which case it will set the
- // squiggle.dev.base property or if it is running in the binary
- // distribution, in which case it will set the squiggle.jar.base
- // property. These properties are expanded in the security
- // policy files.
- // Property expansion is used to provide portability of the
- // policy files between various code bases (e.g., file base,
- // server base, etc..).
- //
- url = cl.getResource(SQUIGGLE_MAIN_CLASS_URL);
- if (url == null){
- // Something is really wrong: we would be running a class
- // which can't be found....
- throw new Error();
- }
-
- String expandedMainClassName = url.toString();
- if (expandedMainClassName.indexOf(SQUIGGLE_ENTRY_JAR_NAME) != -1) {
- setSquiggleJarBase(expandedMainClassName);
- } else {
- setSquiggleDevBase(expandedMainClassName);
- }
-
- // Install new security manager
- System.setSecurityManager(securityManager);
-
- System.out.flush();
- policy.refresh();
-
- }
-
- private void setSquiggleJarBase(String expandedMainClassName){
- if (!expandedMainClassName.startsWith(JAR_PROTOCOL)){
- // Something is seriously wrong here
- throw new Error();
- }
-
- expandedMainClassName =
expandedMainClassName.substring(JAR_PROTOCOL.length());
-
- int codeBaseEnd =
- expandedMainClassName.indexOf(SQUIGGLE_ENTRY_JAR_NAME +
- JAR_URL_FILE_SEPARATOR +
- SQUIGGLE_MAIN_CLASS_URL);
-
- if (codeBaseEnd == -1){
- // Something is seriously wrong. This should *never* happen
- // as the SQUIGGLE_SECURITY_POLICY_URL is such that it will be
- // a substring of its corresponding URL value
- throw new Error();
- }
-
- String squiggleCodeBase = expandedMainClassName.substring(0, codeBaseEnd);
- System.setProperty(PROPERTY_SQUIGGLE_JAR_BASE, squiggleCodeBase);
- }
-
- /**
- * Position the squiggle.dev.base property for expansion in
- * the policy file used when Squiggle is running in its
- * development version
- */
- private void setSquiggleDevBase(String expandedMainClassName){
- int codeBaseEnd =
- expandedMainClassName.indexOf(SQUIGGLE_MAIN_CLASS_DIR +
- SQUIGGLE_MAIN_CLASS_URL);
-
- if (codeBaseEnd == -1){
- // Something is seriously wrong. This should *never* happen
- // as the SQUIGGLE_SECURITY_POLICY_URL is such that it will be
- // a substring of its corresponding URL value
- throw new Error();
- }
-
- String squiggleCodeBase = expandedMainClassName.substring(0, codeBaseEnd);
- System.setProperty(PROPERTY_SQUIGGLE_DEV_BASE, squiggleCodeBase);
+ securityEnforcer.enforceSecurity
+ (preferenceManager.getBoolean
+ (PreferenceDialog.PREFERENCE_KEY_ENFORCE_SECURE_SCRIPTING)
+ );
}
private void setPreferences(JSVGViewerFrame vf) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]