mkwan       2002/11/25 10:04:51

  Modified:    java/src/org/apache/xalan/templates OutputProperties.java
  Log:
  Commit Ramesh Mandava's ([EMAIL PROTECTED]) patch to allow xalan to read
  property files without opening upcontainer permissions when Xalan is used as
  part of a secure container, such as J2EE RI.
  
  The change makes use of the PrivilegedAction interface in JDK 1.2+. It was
  written with JDK 1.1.8 compatibility in mind so that it will do the same
  thing as before in JDK 1.1.8.
  
  Revision  Changes    Path
  1.23      +61 -7     
xml-xalan/java/src/org/apache/xalan/templates/OutputProperties.java
  
  Index: OutputProperties.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/templates/OutputProperties.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- OutputProperties.java     3 Oct 2002 19:08:44 -0000       1.22
  +++ OutputProperties.java     25 Nov 2002 18:04:51 -0000      1.23
  @@ -189,7 +189,7 @@
      * @param resourceName non-null reference to resource name.
      * @param defaults Default properties, which may be null.
      */
  -  static private Properties loadPropertiesFile(String resourceName, 
Properties defaults)
  +  static private Properties loadPropertiesFile(final String resourceName, 
Properties defaults)
       throws IOException
     {
   
  @@ -201,19 +201,73 @@
   
       InputStream is = null;
       BufferedInputStream bis = null;
  +    Class accessControllerClass = null;
   
       try {
         try {
  -        java.lang.reflect.Method getCCL = 
Thread.class.getMethod("getContextClassLoader", NO_CLASSES);
  -        if (getCCL != null) {
  -          ClassLoader contextClassLoader = (ClassLoader) 
getCCL.invoke(Thread.currentThread(), NO_OBJS);
  -          is = 
contextClassLoader.getResourceAsStream("org/apache/xalan/templates/" + 
resourceName);
  -        }
  +     try {   
  +
  +       // This Class was introduced in JDK 1.2. With the re-architecture of
  +       // security mechanism ( starting in JDK 1.2 ), we have option of
  +       // giving privileges to certain part of code using doPrivileged block.
  +       // In JDK1.1.X applications won't be having security manager and if 
  +       // there is security manager ( in applets ), code need to be signed
  +       // and trusted for having access to resources. 
  +
  +       
accessControllerClass=Class.forName("java.security.AccessController"); 
  +
  +       // If we are here means user is using JDK >= 1.2. 
  +       // Using doPrivileged to be able to read property file without opening
  +          // up secured container permissions like J2EE container
  +
  +       is =(InputStream)java.security.AccessController.doPrivileged (
  +            new java.security.PrivilegedAction() {
  +
  +            public Object run() {
  +              try {
  +                java.lang.reflect.Method getCCL = Thread.class.getMethod(
  +                    "getContextClassLoader", NO_CLASSES);
  +                if (getCCL != null) {
  +                  ClassLoader contextClassLoader = (ClassLoader)
  +                      getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +                  return ( contextClassLoader.getResourceAsStream (
  +                      "org/apache/xalan/templates/" + resourceName) );
  +                }
  +              } catch ( Exception e ) { }
  +
  +              return null;
  +
  +            }
  +          });
  +     } catch ( ClassNotFoundException e ) {
  +       //User may be using older JDK ( JDK <1.2 ). Allow him/her to use it.  
  +       // But don't try to use doPrivileged
  +       try {
  +                java.lang.reflect.Method getCCL = Thread.class.getMethod(
  +                    "getContextClassLoader", NO_CLASSES);
  +                if (getCCL != null) {
  +                  ClassLoader contextClassLoader = (ClassLoader)
  +                      getCCL.invoke(Thread.currentThread(), NO_OBJS);
  +                  is = contextClassLoader.getResourceAsStream (
  +                      "org/apache/xalan/templates/" + resourceName );
  +                }
  +       } catch ( Exception exception ) { }
  +     }         
         }
         catch (Exception e) {}
   
         if ( is == null ) {
  -        is = OutputProperties.class.getResourceAsStream(resourceName);
  +     if ( accessControllerClass != null ) {
  +          is=(InputStream)java.security.AccessController.doPrivileged( 
  +           new java.security.PrivilegedAction(){
  +         public Object run() {
  +              return 
OutputProperties.class.getResourceAsStream(resourceName);
  +            }
  +          });
  +     } else {
  +       // User may be using older JDK ( JDK < 1.2 )
  +       is = OutputProperties.class.getResourceAsStream(resourceName);
  +     }
         }
         
         bis = new BufferedInputStream(is);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to