001/* 002 * (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * Nuxeo - initial API and implementation 018 * 019 * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $ 020 */ 021 022package org.nuxeo.ecm.platform.login; 023 024import java.util.HashMap; 025import java.util.Map; 026 027import javax.security.auth.callback.CallbackHandler; 028 029import org.apache.commons.logging.Log; 030import org.apache.commons.logging.LogFactory; 031import org.nuxeo.runtime.model.ComponentContext; 032import org.nuxeo.runtime.model.ComponentInstance; 033import org.nuxeo.runtime.model.ComponentName; 034import org.nuxeo.runtime.model.DefaultComponent; 035import org.nuxeo.runtime.model.Extension; 036 037public class LoginPluginRegistry extends DefaultComponent { 038 039 public static final ComponentName NAME = new ComponentName("org.nuxeo.ecm.platform.login.LoginPluginRegistry"); 040 041 public static final String EP_PLUGIN = "plugin"; 042 043 public static final String EP_CBFACTORY = "callbackFactory"; 044 045 private static final Log log = LogFactory.getLog(LoginPluginRegistry.class); 046 047 private LoginPlugin currentLoginPlugin; 048 049 private Map<String, LoginPlugin> loginPluginStack; 050 051 private CallbackFactory callbackFactory; 052 053 private Map<String, LoginPluginDescriptor> pluginDescriptorStack; 054 055 public LoginPluginRegistry() { 056 currentLoginPlugin = null; 057 } 058 059 @Override 060 public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) { 061 if (extensionPoint.equals(EP_PLUGIN)) { 062 log.info("registering Login Plugin ... "); 063 registerPlugin((LoginPluginDescriptor) contribution); 064 } else if (extensionPoint.equals(EP_CBFACTORY)) { 065 log.info("registering Callback factory ... "); 066 registerCBFactory((CallbackFactoryDescriptor) contribution); 067 } else { 068 log.error("Extension point " + extensionPoint + " is unknown!"); 069 } 070 } 071 072 private void registerCBFactory(CallbackFactoryDescriptor cbfExtension) { 073 try { 074 callbackFactory = (CallbackFactory) cbfExtension.getClassName().newInstance(); 075 } catch (ReflectiveOperationException e) { 076 log.error("Unable to create Factory", e); 077 } 078 } 079 080 private void registerPlugin(LoginPluginDescriptor pluginExtension) { 081 Boolean enabled = pluginExtension.getEnabled(); 082 Class<LoginPlugin> className = pluginExtension.getClassName(); 083 String pluginName = pluginExtension.getPluginName(); 084 085 if (loginPluginStack.containsKey(pluginName)) { 086 // merge 087 LoginPlugin oldLoginPlugin = loginPluginStack.get(pluginName); 088 LoginPluginDescriptor oldLoginPluginDescriptor = pluginDescriptorStack.get(pluginName); 089 090 Map<String, String> mergedParams = oldLoginPluginDescriptor.getParameters(); 091 mergedParams.putAll(pluginExtension.getParameters()); 092 093 oldLoginPlugin.setParameters(mergedParams); 094 if (!oldLoginPlugin.initLoginModule()) { 095 oldLoginPluginDescriptor.setInitialized(false); 096 log.warn("Unable to initialize LoginPlugin for class " + className.getName()); 097 } else { 098 oldLoginPluginDescriptor.setInitialized(true); 099 } 100 if (enabled != null) { 101 oldLoginPluginDescriptor.setEnabled(enabled); 102 } 103 } else { 104 LoginPlugin newLoginPlugin = null; 105 try { 106 newLoginPlugin = className.newInstance(); 107 } catch (InstantiationException e) { 108 log.error("Unable to create LoginPlugin for class " + className.getName() + ":" + e.getMessage(), e); 109 return; 110 } catch (IllegalAccessException e) { 111 log.error("Unable to create LoginPlugin for class " + className.getName() + ":" + e.getMessage(), e); 112 return; 113 } 114 newLoginPlugin.setParameters(pluginExtension.getParameters()); 115 if (newLoginPlugin.initLoginModule()) { 116 pluginExtension.setInitialized(true); 117 log.info("LoginPlugin initialized for class " + className.getName()); 118 } else { 119 pluginExtension.setInitialized(false); 120 log.warn("Unable to initialize LoginPlugin for class " + className.getName()); 121 } 122 pluginDescriptorStack.put(pluginName, pluginExtension); 123 loginPluginStack.put(pluginName, newLoginPlugin); 124 } 125 } 126 127 @Override 128 public void unregisterExtension(Extension extension) { 129 currentLoginPlugin = null; 130 } 131 132 @Override 133 public void activate(ComponentContext context) { 134 super.activate(context); 135 loginPluginStack = new HashMap<String, LoginPlugin>(); 136 pluginDescriptorStack = new HashMap<String, LoginPluginDescriptor>(); 137 } 138 139 @Deprecated 140 public LoginPlugin getPlugin() { 141 return currentLoginPlugin; 142 } 143 144 @Deprecated 145 public Boolean useCustomLoginPlugin() { 146 return currentLoginPlugin != null; 147 } 148 149 public CallbackResult handleSpecifcCallbacks(CallbackHandler callbackHandler) { 150 if (callbackFactory == null) { 151 return null; 152 } 153 return callbackFactory.handleSpecificCallbacks(callbackHandler); 154 } 155 156 public LoginPlugin getPlugin(String pluginName) { 157 if (!pluginDescriptorStack.containsKey(pluginName)) { 158 log.error("Unable to find needed Login Plugin : " + pluginName); 159 return null; 160 } 161 162 LoginPlugin loginPlugin = loginPluginStack.get(pluginName); 163 LoginPluginDescriptor loginPluginDescriptor = pluginDescriptorStack.get(pluginName); 164 165 if (loginPlugin == null) { 166 log.error("Login Plugin : " + pluginName + " is null "); 167 return null; 168 } 169 170 if (!loginPluginDescriptor.getEnabled()) { 171 log.error("Login Plugin : " + pluginName + " is not Enabled "); 172 return null; 173 } 174 return loginPlugin; 175 } 176 177 public LoginPluginDescriptor getPluginDescriptor(String pluginName) { 178 if (!pluginDescriptorStack.containsKey(pluginName)) { 179 log.error("Unable to find needed Login Plugin : " + pluginName); 180 return null; 181 } 182 183 LoginPlugin loginPlugin = loginPluginStack.get(pluginName); 184 LoginPluginDescriptor loginPluginDescriptor = pluginDescriptorStack.get(pluginName); 185 186 if (loginPlugin == null) { 187 log.error("Login Plugin : " + pluginName + " is null "); 188 return null; 189 } 190 191 if (!loginPluginDescriptor.getEnabled()) { 192 log.error("Login Plugin : " + pluginName + " is not Enabled "); 193 return null; 194 } 195 return loginPluginDescriptor; 196 } 197 198}