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.jaas;
019
020 import java.util.Collection;
021 import java.util.Collections;
022 import java.util.Hashtable;
023 import java.util.Map;
024
025 import javax.security.auth.login.AppConfigurationEntry;
026 import javax.security.auth.login.Configuration;
027
028 import org.apache.commons.logging.Log;
029 import org.apache.commons.logging.LogFactory;
030 import org.apache.geronimo.gbean.GBeanInfo;
031 import org.apache.geronimo.gbean.GBeanInfoBuilder;
032 import org.apache.geronimo.gbean.GBeanLifecycle;
033 import org.apache.geronimo.gbean.ReferenceCollection;
034 import org.apache.geronimo.gbean.ReferenceCollectionEvent;
035 import org.apache.geronimo.gbean.ReferenceCollectionListener;
036 import org.apache.geronimo.security.SecurityServiceImpl;
037
038
039 /**
040 * A JAAS configuration mechanism (associating JAAS configuration names with
041 * specific LoginModule configurations). This is a drop-in replacement for the
042 * normal file-reading JAAS configuration mechanism. Instead of getting
043 * its configuration from its file, it gets its configuration from other
044 * GBeans running in Geronimo.
045 *
046 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
047 */
048 public class GeronimoLoginConfiguration extends Configuration implements GBeanLifecycle, ReferenceCollectionListener {
049
050 private final Log log = LogFactory.getLog(GeronimoLoginConfiguration.class);
051 private static Map<String, AppConfigurationEntry[]> entries = new Hashtable<String, AppConfigurationEntry[]>();
052 private Configuration oldConfiguration;
053 private Collection<ConfigurationEntryFactory> configurations = Collections.emptySet();
054
055
056 public Collection getConfigurations() {
057 SecurityManager sm = System.getSecurityManager();
058 if (sm != null) sm.checkPermission(SecurityServiceImpl.CONFIGURE);
059
060 return configurations;
061 }
062
063 public void setConfigurations(Collection<ConfigurationEntryFactory> configurations) {
064 SecurityManager sm = System.getSecurityManager();
065 if (sm != null) sm.checkPermission(SecurityServiceImpl.CONFIGURE);
066
067 if (configurations instanceof ReferenceCollection) {
068 ReferenceCollection ref = (ReferenceCollection) configurations;
069 ref.addReferenceCollectionListener(this);
070 }
071
072 this.configurations = configurations;
073
074 for (ConfigurationEntryFactory configuration : configurations) {
075 addConfiguration(configuration);
076 }
077 }
078
079 public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
080 return entries.get(name);
081 }
082
083 public void refresh() {
084 }
085
086 public void memberAdded(ReferenceCollectionEvent event) {
087 SecurityManager sm = System.getSecurityManager();
088 if (sm != null) sm.checkPermission(SecurityServiceImpl.CONFIGURE);
089
090 ConfigurationEntryFactory factory = (ConfigurationEntryFactory) event.getMember();
091 addConfiguration(factory);
092 }
093
094 public void memberRemoved(ReferenceCollectionEvent event) {
095 SecurityManager sm = System.getSecurityManager();
096 if (sm != null) sm.checkPermission(SecurityServiceImpl.CONFIGURE);
097
098 ConfigurationEntryFactory factory = (ConfigurationEntryFactory) event.getMember();
099
100 entries.remove(factory.getConfigurationName());
101 log.debug("Removed Application Configuration Entry " + factory.getConfigurationName());
102 }
103
104 private void addConfiguration(ConfigurationEntryFactory factory) {
105 if (entries.containsKey(factory.getConfigurationName())) {
106 throw new java.lang.IllegalArgumentException("ConfigurationEntry already registered");
107 }
108 AppConfigurationEntry[] ace = factory.getAppConfigurationEntries();
109 entries.put(factory.getConfigurationName(), ace);
110 log.debug("Added Application Configuration Entry " + factory.getConfigurationName());
111 }
112
113 public void doStart() throws Exception {
114 try {
115 oldConfiguration = Configuration.getConfiguration();
116 } catch (SecurityException e) {
117 oldConfiguration = null;
118 }
119 Configuration.setConfiguration(this);
120 log.debug("Installed Geronimo login configuration");
121 }
122
123 public void doStop() throws Exception {
124 Configuration.setConfiguration(oldConfiguration);
125
126 for (String s : entries.keySet()) {
127 log.debug("Removed Application Configuration Entry " + s);
128 }
129 entries.clear();
130
131 log.debug("Uninstalled Geronimo login configuration");
132 }
133
134 public void doFail() {
135 Configuration.setConfiguration(oldConfiguration);
136 log.debug("Uninstalled Geronimo login configuration");
137 }
138
139 public static GBeanInfo getGBeanInfo() {
140 return GBEAN_INFO;
141 }
142
143 private static final GBeanInfo GBEAN_INFO;
144
145 static {
146 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(GeronimoLoginConfiguration.class); //just a gbean
147 infoFactory.addReference("Configurations", ConfigurationEntryFactory.class, null);
148
149 GBEAN_INFO = infoFactory.getBeanInfo();
150 }
151
152 }