1 /** 2 * 3 * Copyright 2003-2005 The Apache Software Foundation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.geronimo.security; 19 20 import java.security.Policy; 21 import javax.security.jacc.PolicyConfigurationFactory; 22 import javax.security.jacc.PolicyContextException; 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 import org.apache.geronimo.gbean.GBeanInfo; 26 import org.apache.geronimo.gbean.GBeanInfoBuilder; 27 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 28 import org.apache.geronimo.security.jacc.PolicyContextHandlerContainerSubject; 29 import org.apache.geronimo.security.jacc.PolicyContextHandlerHttpServletRequest; 30 import org.apache.geronimo.security.jacc.PolicyContextHandlerSOAPMessage; 31 import org.apache.geronimo.security.util.ConfigurationUtil; 32 import org.apache.geronimo.system.serverinfo.ServerInfo; 33 34 35 /** 36 * An MBean that registers the JACC factory and handlers. 37 * 38 * @version $Rev: 406493 $ $Date: 2006-05-14 18:14:11 -0700 (Sun, 14 May 2006) $ 39 */ 40 public class SecurityServiceImpl implements SecurityService { 41 42 public static boolean POLICY_INSTALLED = false; 43 44 private final Log log = LogFactory.getLog(SecurityServiceImpl.class); 45 46 /** 47 * Permissions that protect access to sensitive security information 48 */ 49 public static final GeronimoSecurityPermission CONFIGURE = new GeronimoSecurityPermission("configure"); 50 51 public SecurityServiceImpl(ClassLoader classLoader, ServerInfo serverInfo, String policyConfigurationFactory, 52 String policyProvider, String keyStore, String keyStorePassword, 53 String trustStore, String trustStorePassword) 54 throws PolicyContextException, ClassNotFoundException, IllegalAccessException, InstantiationException 55 { 56 57 /** 58 * @see "JSR 115 4.6.1" Container Subject Policy Context Handler 59 */ 60 ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerContainerSubject(), true); 61 ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerSOAPMessage(), true); 62 ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerHttpServletRequest(), true); 63 64 if (!POLICY_INSTALLED) { 65 policyProvider = sysOverRide(policyProvider, POLICY_PROVIDER); 66 67 if (policyProvider != null) { 68 Policy policy = (Policy) classLoader.loadClass(policyProvider).newInstance(); 69 policy.refresh(); 70 Policy.setPolicy(policy); 71 } 72 73 POLICY_INSTALLED = true; 74 } 75 76 policyConfigurationFactory = sysOverRide(policyConfigurationFactory, POLICY_CONFIG_FACTORY); 77 if (policyConfigurationFactory != null) { 78 Thread currentThread = Thread.currentThread(); 79 ClassLoader oldClassLoader = currentThread.getContextClassLoader(); 80 currentThread.setContextClassLoader(classLoader); 81 try { 82 PolicyConfigurationFactory.getPolicyConfigurationFactory(); 83 } finally { 84 currentThread.setContextClassLoader(oldClassLoader); 85 } 86 } 87 if (keyStore != null) sysOverRide(serverInfo.resolveServerPath(keyStore), KEYSTORE); 88 if (keyStorePassword != null) sysOverRide(keyStorePassword, KEYSTORE_PASSWORD); 89 90 if (trustStore != null) sysOverRide(serverInfo.resolveServerPath(trustStore), TRUSTSTORE); 91 if (trustStorePassword != null) sysOverRide(trustStorePassword, TRUSTSTORE_PASSWORD); 92 93 log.debug(KEYSTORE + ": " + System.getProperty(KEYSTORE)); 94 log.debug(TRUSTSTORE + ": " + System.getProperty(TRUSTSTORE)); 95 96 log.debug("JACC factory registered"); 97 } 98 99 private String sysOverRide(String attribute, String sysVar) { 100 101 String sysValue = System.getProperty(sysVar); 102 103 /** 104 * System variable gets highest priority 105 */ 106 if (sysValue != null) 107 return sysValue; 108 109 if (attribute != null) { 110 System.setProperty(sysVar, attribute); 111 } 112 113 return attribute; 114 115 } 116 117 public static final GBeanInfo GBEAN_INFO; 118 119 static { 120 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(SecurityServiceImpl.class); 121 122 infoFactory.addAttribute("classLoader", ClassLoader.class, false); 123 infoFactory.addReference("ServerInfo", ServerInfo.class, NameFactory.GERONIMO_SERVICE); 124 infoFactory.addAttribute("policyConfigurationFactory", String.class, true); 125 infoFactory.addAttribute("policyProvider", String.class, true); 126 infoFactory.addAttribute("keyStore", String.class, true); 127 infoFactory.addAttribute("keyStorePassword", String.class, true); 128 infoFactory.addAttribute("trustStore", String.class, true); 129 infoFactory.addAttribute("trustStorePassword", String.class, true); 130 131 infoFactory.setConstructor(new String[]{"classLoader", "ServerInfo", "policyConfigurationFactory", 132 "policyProvider", "keyStore", "keyStorePassword", "trustStore", 133 "trustStorePassword"}); 134 135 GBEAN_INFO = infoFactory.getBeanInfo(); 136 } 137 138 public static GBeanInfo getGBeanInfo() { 139 return GBEAN_INFO; 140 } 141 }