|
What this is
Other links
The source code/* * Copyright 1999-2004 The Apache Sofware Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.modules.config; import java.io.File; import java.io.FilePermission; import java.io.IOException; import java.net.URL; import java.security.AllPermission; import java.security.CodeSource; import java.security.Permission; import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.security.ProtectionDomain; import java.util.Enumeration; import java.util.PropertyPermission; import org.apache.tomcat.core.BaseInterceptor; import org.apache.tomcat.core.Context; import org.apache.tomcat.core.ContextManager; import org.apache.tomcat.core.TomcatException; import org.apache.tomcat.util.io.FileUtil; import org.apache.tomcat.util.log.Log; /** * Set policy-based access to tomcat. * Must be hooked before class loader setter. * The context will have a single protection domain, pointing to the doc root. * That will include all classes loaded that belong to the context * ( jsps, WEB-INF/classes, WEB-INF/lib/ * * @author Glenn Nielsen * @author costin@dnt.ro */ public class PolicyInterceptor extends PolicyLoader { // BaseInterceptor { // PolicyLoader is used to load PolicyInterceptor String securityManagerClass="java.lang.SecurityManager"; String policyFile=null; public PolicyInterceptor() { } public void setSecurityManagerClass(String cls) { securityManagerClass=cls; } public void setPolicyFile( String pf) { policyFile=pf; } public void addInterceptor(ContextManager cm, Context ctx, BaseInterceptor module) throws TomcatException { // Just override parent } /** Set the security manager, so that policy will be used */ public void engineInit(ContextManager cm) throws TomcatException { initSecurityManager( cm ); } public void initSecurityManager(ContextManager cm) throws TomcatException { if( System.getSecurityManager() != null ) return; try { if( null == System.getProperty("java.security.policy")) { log( "Setting java.security.policy. This may fail on some VMs, please" + " set it as a system property before starting tomcat"); File f=null; if( policyFile==null ) { policyFile="conf/tomcat.policy"; } if( FileUtil.isAbsolute(policyFile)) f=new File(policyFile); else f=new File(cm.getHome() + File.separator + policyFile); try { policyFile=f.getCanonicalPath(); } catch(IOException ex ) {} if( debug > 0 ) log("Setting policy file to " + policyFile + " tomcat.home= " + System.getProperty( "tomcat.home") ); System.setProperty("java.security.policy", policyFile); } Class c=Class.forName(securityManagerClass); Object o=c.newInstance(); Policy.getPolicy().refresh(); System.setSecurityManager((SecurityManager)o); log("SANDBOX mode enabled"); if( ! "java.lang.SecurityManager".equals(securityManagerClass) ) log( "Security Manager=" + securityManagerClass); } catch( ClassNotFoundException ex ) { log("SecurityManager Class not found: " + securityManagerClass, Log.ERROR); } catch( Exception ex ) { ex.printStackTrace(); log("SecurityManager Class could not be loaded: " + securityManagerClass, Log.ERROR); } } /** Add a default set of permissions to the context */ protected void addDefaultPermissions( Context context,String base, Permissions p ) { if( context.isTrusted() ) { if( debug > 0 ) log( "All permissions for " + context ); AllPermission aP=new AllPermission(); p.add( aP ); return; } // Add default read "-" FilePermission for docBase, classes, lib FilePermission fp = new FilePermission(base + File.separator + "-", "read"); p.add(fp); // Add default write "-" FilePermission for docBase fp = new FilePermission(base + File.separator + "-", "write"); p.add(fp); // Add read permission for the directory itself, needed to use // exists() on the directory fp = new FilePermission(base,"read"); p.add(fp); fp = new FilePermission(context.getWorkDir() + File.separator + "-", "read"); p.add(fp); fp = new FilePermission(context.getWorkDir() + File.separator + "-", "write"); p.add(fp); // Add read permission for the work directory itself, needed to use // exists() on the directory fp = new FilePermission(context.getWorkDir().toString(),"read"); p.add(fp); // Read on the common and apps dir fp = new FilePermission(cm.getInstallDir() + File.separator + "lib" + File.separator + "common" + File.separator + "-", "read"); p.add(fp); fp = new FilePermission(cm.getInstallDir() + File.separator + "lib" + File.separator + "apps" + File.separator + "-", "read"); p.add(fp); RuntimePermission rp = new RuntimePermission("getClassLoader"); p.add( rp ); // JspFactory.getPageContext() runs in JSP Context and needs the below // permission during the init of a servlet generated from a JSP. PropertyPermission pp = new PropertyPermission("line.separator","read"); p.add(pp); pp = new PropertyPermission("file.separator", "read"); p.add(pp); pp = new PropertyPermission("path.separator", "read"); p.add(pp); if( debug > 0 || context.getDebug() > 0 ) context.log( "permissions " + p ); } public void contextInit( Context context) throws TomcatException { ContextManager cm = context.getContextManager(); String base = context.getAbsolutePath(); try { File dir = new File(base); URL url = new URL("file:" + dir.getAbsolutePath()); CodeSource cs = new CodeSource(url,null); /* We'll construct permissions for Jasper. Tomcat uses normal policy and URLClassLoader. We may add fancy config later, if needed */ Permissions p = new Permissions(); addDefaultPermissions( context, dir.getAbsolutePath(), p); /** Add whatever permissions are specified in the policy file */ Policy.getPolicy().refresh(); PermissionCollection pFileP=Policy.getPolicy().getPermissions(cs); if( pFileP!= null ) { Enumeration enum=pFileP.elements(); while(enum.hasMoreElements()) { p.add((Permission)enum.nextElement()); } } // This is used only for Jasper ! Should be replaced by // a standard URLClassLoader. ProtectionDomain pd = new ProtectionDomain(cs,p); // context.setProtectionDomain(pd); context.setAttribute( Context.ATTRIB_PROTECTION_DOMAIN, pd); // new permissions - added context manager and file to whatever was // specified by default // context.setPermissions( p ); } catch(Exception ex) { log("Security init for Context " + base + " failed", ex); } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.