/* * Copyright 2005 The Apache Software 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.felix.jmood; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; public class SecurityManagerHandler { private AgentContext ac; private boolean policyEmbedded; private String policyPath; public static final String IS_POLICY_EMBEDDED="policy.embedded"; public static final String JAVA_SECURITY_POLICY="java.security.policy"; public SecurityManagerHandler(AgentContext ac, boolean policyEmbedded, String policyPath){ this.ac=ac; this.policyEmbedded=policyEmbedded; this.policyPath=policyPath; } private void setSecurityManager() throws Exception{ //TODO check this when we add permission admin support to the bundle //It caused StackOverFlow the second time the framework was run(?) if (System.getSecurityManager() != null) { return; } try { this.ac.debug("Security manager does not exist"); if (policyEmbedded){ this.ac.debug("Policy is embedded, copying it to filesystem..."); //The policy is in the file system and should be copied... File file=this.ac.getBundleContext().getDataFile(policyPath); if (file.exists()) { this.ac.debug("trying to delete file..."); boolean deleted=file.delete(); if(!deleted) { this.ac.error("Could not delete existing policy file"); } else { this.ac.debug("successfully deleted"); } file=this.ac.getBundleContext().getDataFile(policyPath); file.createNewFile(); this.ac.debug("new file created"); } FileOutputStream o=new FileOutputStream (file); InputStream i=this.ac.getBundleContext().getBundle().getResource("/"+policyPath).openStream(); byte [] buffer=new byte [1024]; while (i.read(buffer)!=-1){ o.write(buffer); } i.close(); o.flush(); o.close(); System.setProperty(JAVA_SECURITY_POLICY, file.getAbsolutePath()); } else{ System.setProperty(JAVA_SECURITY_POLICY, policyPath); } System.setSecurityManager(new SecurityManager()); }catch(Exception e){ this.ac.error("Unexpected exception", e); } this.ac.debug("Security policy: "+System.getProperty(JAVA_SECURITY_POLICY)); this.ac.debug("Security manager toString(): "+System.getSecurityManager().toString()); } }