/*
* (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Nuxeo - initial API and implementation
*/
package org.nuxeo.ecm.platform.login;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.callback.CallbackHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.runtime.model.ComponentContext;
import org.nuxeo.runtime.model.ComponentInstance;
import org.nuxeo.runtime.model.ComponentName;
import org.nuxeo.runtime.model.DefaultComponent;
import org.nuxeo.runtime.model.Extension;
public class LoginPluginRegistry extends DefaultComponent {
public static final ComponentName NAME = new ComponentName("org.nuxeo.ecm.platform.login.LoginPluginRegistry");
public static final String EP_PLUGIN = "plugin";
public static final String EP_CBFACTORY = "callbackFactory";
private static final Log log = LogFactory.getLog(LoginPluginRegistry.class);
private LoginPlugin currentLoginPlugin;
private Map<String, LoginPlugin> loginPluginStack;
private CallbackFactory callbackFactory;
private Map<String, LoginPluginDescriptor> pluginDescriptorStack;
public LoginPluginRegistry() {
currentLoginPlugin = null;
}
@Override
public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
if (extensionPoint.equals(EP_PLUGIN)) {
log.info("registering Login Plugin ... ");
registerPlugin((LoginPluginDescriptor) contribution);
} else if (extensionPoint.equals(EP_CBFACTORY)) {
log.info("registering Callback factory ... ");
registerCBFactory((CallbackFactoryDescriptor) contribution);
} else {
log.error("Extension point " + extensionPoint + " is unknown!");
}
}
private void registerCBFactory(CallbackFactoryDescriptor cbfExtension) {
try {
callbackFactory = (CallbackFactory) cbfExtension.getClassName().newInstance();
} catch (ReflectiveOperationException e) {
log.error("Unable to create Factory", e);
}
}
private void registerPlugin(LoginPluginDescriptor pluginExtension) {
Boolean enabled = pluginExtension.getEnabled();
Class<LoginPlugin> className = pluginExtension.getClassName();
String pluginName = pluginExtension.getPluginName();
if (loginPluginStack.containsKey(pluginName)) {
// merge
LoginPlugin oldLoginPlugin = loginPluginStack.get(pluginName);
LoginPluginDescriptor oldLoginPluginDescriptor = pluginDescriptorStack.get(pluginName);
Map<String, String> mergedParams = oldLoginPluginDescriptor.getParameters();
mergedParams.putAll(pluginExtension.getParameters());
oldLoginPlugin.setParameters(mergedParams);
if (!oldLoginPlugin.initLoginModule()) {
oldLoginPluginDescriptor.setInitialized(false);
log.warn("Unable to initialize LoginPlugin for class " + className.getName());
} else {
oldLoginPluginDescriptor.setInitialized(true);
}
if (enabled != null) {
oldLoginPluginDescriptor.setEnabled(enabled);
}
} else {
LoginPlugin newLoginPlugin;
try {
newLoginPlugin = className.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
log.error("Unable to create LoginPlugin for class " + className.getName() + ":" + e.getMessage(), e);
return;
}
newLoginPlugin.setParameters(pluginExtension.getParameters());
if (newLoginPlugin.initLoginModule()) {
pluginExtension.setInitialized(true);
log.info("LoginPlugin initialized for class " + className.getName());
} else {
pluginExtension.setInitialized(false);
log.warn("Unable to initialize LoginPlugin for class " + className.getName());
}
pluginDescriptorStack.put(pluginName, pluginExtension);
loginPluginStack.put(pluginName, newLoginPlugin);
}
}
@Override
public void unregisterExtension(Extension extension) {
currentLoginPlugin = null;
}
@Override
public void activate(ComponentContext context) {
super.activate(context);
loginPluginStack = new HashMap<>();
pluginDescriptorStack = new HashMap<>();
}
public CallbackResult handleSpecifcCallbacks(CallbackHandler callbackHandler) {
if (callbackFactory == null) {
return null;
}
return callbackFactory.handleSpecificCallbacks(callbackHandler);
}
public LoginPlugin getPlugin(String pluginName) {
if (!pluginDescriptorStack.containsKey(pluginName)) {
log.error("Unable to find needed Login Plugin : " + pluginName);
return null;
}
LoginPlugin loginPlugin = loginPluginStack.get(pluginName);
LoginPluginDescriptor loginPluginDescriptor = pluginDescriptorStack.get(pluginName);
if (loginPlugin == null) {
log.error("Login Plugin : " + pluginName + " is null ");
return null;
}
if (!loginPluginDescriptor.getEnabled()) {
log.error("Login Plugin : " + pluginName + " is not Enabled ");
return null;
}
return loginPlugin;
}
public LoginPluginDescriptor getPluginDescriptor(String pluginName) {
if (!pluginDescriptorStack.containsKey(pluginName)) {
log.error("Unable to find needed Login Plugin : " + pluginName);
return null;
}
LoginPlugin loginPlugin = loginPluginStack.get(pluginName);
LoginPluginDescriptor loginPluginDescriptor = pluginDescriptorStack.get(pluginName);
if (loginPlugin == null) {
log.error("Login Plugin : " + pluginName + " is null ");
return null;
}
if (!loginPluginDescriptor.getEnabled()) {
log.error("Login Plugin : " + pluginName + " is not Enabled ");
return null;
}
return loginPluginDescriptor;
}
}