14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file
44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information
54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file
64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License.
84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at
94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software
134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and
164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License.
174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: SecuritySupport12.java 468655 2006-10-28 07:12:06Z minchau $
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xpath.functions;
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.File;
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.FileInputStream;
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.FileNotFoundException;
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.io.InputStream;
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.security.AccessController;
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.security.PrivilegedAction;
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.security.PrivilegedActionException;
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.security.PrivilegedExceptionAction;
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.util.Properties;
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class is duplicated for each Xalan-Java subpackage so keep it in sync.
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * It is package private and therefore is not exposed as part of the Xalan-Java
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * API.
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Security related methods that only work on J2SE 1.2 and newer.
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonclass SecuritySupport12 extends SecuritySupport {
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    ClassLoader getContextClassLoader() {
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return (ClassLoader)
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                AccessController.doPrivileged(new PrivilegedAction() {
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            public Object run() {
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                ClassLoader cl = null;
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                try {
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    cl = Thread.currentThread().getContextClassLoader();
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                } catch (SecurityException ex) { }
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                return cl;
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            }
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        });
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    ClassLoader getSystemClassLoader() {
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return (ClassLoader)
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    ClassLoader cl = null;
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    try {
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                        cl = ClassLoader.getSystemClassLoader();
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    } catch (SecurityException ex) {}
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return cl;
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            });
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    ClassLoader getParentClassLoader(final ClassLoader cl) {
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return (ClassLoader)
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    ClassLoader parent = null;
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    try {
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                        parent = cl.getParent();
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    } catch (SecurityException ex) {}
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    // eliminate loops in case of the boot
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    // ClassLoader returning itself as a parent
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return (parent == cl) ? null : parent;
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            });
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    String getSystemProperty(final String propName) {
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return (String)
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return System.getProperty(propName);
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            });
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    FileInputStream getFileInputStream(final File file)
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        throws FileNotFoundException
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        try {
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            return (FileInputStream)
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                AccessController.doPrivileged(new PrivilegedExceptionAction() {
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    public Object run() throws FileNotFoundException {
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                        return new FileInputStream(file);
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    }
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                });
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        } catch (PrivilegedActionException e) {
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throw (FileNotFoundException)e.getException();
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    InputStream getResourceAsStream(final ClassLoader cl,
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                           final String name)
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        return (InputStream)
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    InputStream ris;
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    if (cl == null) {
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                        ris = ClassLoader.getSystemResourceAsStream(name);
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    } else {
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                        ris = cl.getResourceAsStream(name);
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    }
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return ris;
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            });
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    boolean getFileExists(final File f) {
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return ((Boolean)
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return new Boolean(f.exists());
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            })).booleanValue();
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    long getLastModified(final File f) {
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return ((Long)
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            AccessController.doPrivileged(new PrivilegedAction() {
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                public Object run() {
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    return new Long(f.lastModified());
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                }
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            })).longValue();
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
147