001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.security;
019    
020    import java.security.Policy;
021    import javax.security.jacc.PolicyConfigurationFactory;
022    import javax.security.jacc.PolicyContextException;
023    import org.apache.commons.logging.Log;
024    import org.apache.commons.logging.LogFactory;
025    import org.apache.geronimo.gbean.GBeanInfo;
026    import org.apache.geronimo.gbean.GBeanInfoBuilder;
027    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
028    import org.apache.geronimo.security.jacc.PolicyContextHandlerContainerSubject;
029    import org.apache.geronimo.security.jacc.PolicyContextHandlerHttpServletRequest;
030    import org.apache.geronimo.security.jacc.PolicyContextHandlerSOAPMessage;
031    import org.apache.geronimo.security.util.ConfigurationUtil;
032    import org.apache.geronimo.system.serverinfo.ServerInfo;
033    
034    
035    /**
036     * An MBean that registers the JACC factory and handlers.
037     *
038     * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
039     */
040    public class SecurityServiceImpl implements SecurityService {
041    
042        public static boolean POLICY_INSTALLED = false;
043    
044        private final Log log = LogFactory.getLog(SecurityServiceImpl.class);
045    
046        /**
047         * Permissions that protect access to sensitive security information
048         */
049        public static final GeronimoSecurityPermission CONFIGURE = new GeronimoSecurityPermission("configure");
050    
051        public SecurityServiceImpl(ClassLoader classLoader, ServerInfo serverInfo, String policyConfigurationFactory,
052                                   String policyProvider, String keyStore, String keyStorePassword,
053                                   String trustStore, String trustStorePassword)
054                throws PolicyContextException, ClassNotFoundException, IllegalAccessException, InstantiationException
055        {
056    
057            /**
058             *  @see "JSR 115 4.6.1" Container Subject Policy Context Handler
059             */
060            ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerContainerSubject(), true);
061            ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerSOAPMessage(), true);
062            ConfigurationUtil.registerPolicyContextHandler(new PolicyContextHandlerHttpServletRequest(), true);
063    
064            if (!POLICY_INSTALLED) {
065                policyProvider = sysOverRide(policyProvider, POLICY_PROVIDER);
066    
067                if (policyProvider != null) {
068                    Policy policy = (Policy) classLoader.loadClass(policyProvider).newInstance();
069                    policy.refresh();
070                    Policy.setPolicy(policy);
071                }
072    
073                POLICY_INSTALLED = true;
074            }
075    
076            policyConfigurationFactory = sysOverRide(policyConfigurationFactory, POLICY_CONFIG_FACTORY);
077            if (policyConfigurationFactory != null) {
078                Thread currentThread = Thread.currentThread();
079                ClassLoader oldClassLoader = currentThread.getContextClassLoader();
080                currentThread.setContextClassLoader(classLoader);
081                try {
082                    PolicyConfigurationFactory.getPolicyConfigurationFactory();
083                } finally {
084                    currentThread.setContextClassLoader(oldClassLoader);
085                }
086            }
087            if (keyStore != null) sysOverRide(serverInfo.resolveServerPath(keyStore), KEYSTORE);
088            if (keyStorePassword != null) sysOverRide(keyStorePassword, KEYSTORE_PASSWORD);
089    
090            if (trustStore != null) sysOverRide(serverInfo.resolveServerPath(trustStore), TRUSTSTORE);
091            if (trustStorePassword != null) sysOverRide(trustStorePassword, TRUSTSTORE_PASSWORD);
092    
093            log.debug(KEYSTORE + ": " + System.getProperty(KEYSTORE));
094            log.debug(TRUSTSTORE + ": " + System.getProperty(TRUSTSTORE));
095    
096            log.debug("JACC factory registered");
097        }
098    
099        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    }