/******************************************************************************* * Copyright (c) 2005, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.internal.security.auth.ext.loader; import java.util.Map; import javax.security.auth.spi.LoginModule; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.security.auth.AuthPlugin; import org.eclipse.equinox.internal.security.auth.nls.SecAuthMessages; import org.eclipse.equinox.security.auth.module.ExtensionLoginModule; import org.eclipse.osgi.util.NLS; /** * Expected usage pattern: this method is called infrequently (a few times per life cycle; * most likely once). As such, no internal caches are maintained and it simply goes * to the registry and retrieves information when asked. */ public class ExtLoginModuleLoader { final private static String POINT_MODULE = AuthPlugin.PI_AUTH + "." + "loginModule"; //$NON-NLS-1$ //$NON-NLS-2$ final private static String ELEM_MODULE = "loginModule"; //$NON-NLS-1$ final private static String ATTR_MODULE_CLASS = "class"; //$NON-NLS-1$ public static LoginModule load(Map options) { IExtensionRegistry registry = RegistryFactory.getRegistry(); IExtensionPoint point = registry.getExtensionPoint(POINT_MODULE); IExtension[] extensions = point.getExtensions(); String targetPoint = (String) options.get(ExtensionLoginModule.OPTION_MODULE_POINT); LoginModule loginModule = null; for (int i = 0; i < extensions.length; i++) { String sourcePoint = extensions[i].getUniqueIdentifier(); if (sourcePoint == null) // technically, IDs on extensions are optional continue; if (sourcePoint.equals(targetPoint)) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); int elementCount = elements.length; if (elementCount == 1) loginModule = readEntry(elements[0]); else { String message = NLS.bind(SecAuthMessages.invalidLoginmoduleCount, Integer.toString(elementCount)); AuthPlugin.getDefault().logError(message, null); } } } return loginModule; } private static LoginModule readEntry(IConfigurationElement element) { // XXX make this check an utility if (!ELEM_MODULE.equals(element.getName())) { String supplier = element.getContributor().getName(); String message = NLS.bind(SecAuthMessages.unexpectedConfigElement, element.getName(), supplier); AuthPlugin.getDefault().logError(message, null); return null; } // XXX make creation of executable extension and its error handling an utility try { LoginModule module = (LoginModule) element.createExecutableExtension(ATTR_MODULE_CLASS); return module; // future expandability: description is stored in the attribute "description" } catch (CoreException e) { String supplier = element.getContributor().getName(); String message = NLS.bind(SecAuthMessages.instantiationFailed, element.getAttribute(ATTR_MODULE_CLASS), supplier); AuthPlugin.getDefault().logError(message, e); return null; } } }