diff options
Diffstat (limited to 'qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java')
-rw-r--r-- | qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java | 108 |
1 files changed, 79 insertions, 29 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java index 36f1953053..61bbfce4a3 100644 --- a/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java +++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java @@ -20,6 +20,7 @@ */ package org.apache.qpid.server.registry; +import java.net.UnknownHostException; import org.apache.commons.configuration.ConfigurationException; import org.apache.log4j.Logger; import org.osgi.framework.BundleContext; @@ -61,13 +62,7 @@ import org.apache.qpid.server.virtualhost.VirtualHostRegistry; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicReference; @@ -85,11 +80,14 @@ public abstract class ApplicationRegistry implements IApplicationRegistry private final ServerConfiguration _configuration; - private final Map<InetSocketAddress, QpidAcceptor> _acceptors = new HashMap<InetSocketAddress, QpidAcceptor>(); + private final Map<InetSocketAddress, QpidAcceptor> _acceptors = + Collections.synchronizedMap(new HashMap<InetSocketAddress, QpidAcceptor>()); private ManagedObjectRegistry _managedObjectRegistry; - private AuthenticationManager _authenticationManager; + private AuthenticationManager _defaultAuthenticationManager; + + private Map<Integer,AuthenticationManager> _authenticationManagers; private VirtualHostRegistry _virtualHostRegistry; @@ -127,6 +125,11 @@ public abstract class ApplicationRegistry implements IApplicationRegistry return _acceptors; } + private QpidAcceptor getAcceptor(SocketAddress address) + { + return _acceptors.get(address); + } + protected void setManagedObjectRegistry(ManagedObjectRegistry managedObjectRegistry) { _managedObjectRegistry = managedObjectRegistry; @@ -316,7 +319,10 @@ public abstract class ApplicationRegistry implements IApplicationRegistry _securityManager = new SecurityManager(_configuration, _pluginManager); - _authenticationManager = createAuthenticationManager(); + _authenticationManagers = createAuthenticationManagers(); + + // The default authentication manager is provided in the map associated with the null key + _defaultAuthenticationManager = _authenticationManagers.get(null); _managedObjectRegistry.start(); } @@ -342,14 +348,16 @@ public abstract class ApplicationRegistry implements IApplicationRegistry /** * Iterates across all discovered authentication manager factories, offering the security configuration to each. - * Expects <b>exactly</b> one authentication manager to configure and initialise itself. - * - * It is an error to configure more than one authentication manager, or to configure none. * - * @return authentication manager + * If more than one authentication manager is configured, one MUST be specified as the default + * + * It not to configure any authentication managers. + * + * @return map from port to authentication manager, with the null key being used to indicate the default. * @throws ConfigurationException */ - protected AuthenticationManager createAuthenticationManager() throws ConfigurationException + protected Map<Integer, AuthenticationManager> createAuthenticationManagers() + throws ConfigurationException, UnknownHostException { final SecurityConfiguration securityConfiguration = _configuration.getConfiguration(SecurityConfiguration.class.getName()); final Collection<AuthenticationManagerPluginFactory<? extends Plugin>> factories = _pluginManager.getAuthenticationManagerPlugins().values(); @@ -360,31 +368,67 @@ public abstract class ApplicationRegistry implements IApplicationRegistry "manager plugin has been placed in the plugins directory."); } - AuthenticationManager authMgr = null; - + AuthenticationManager defaultAuthMgr; + + Map<String,AuthenticationManager> authManagersByClass = new HashMap<String,AuthenticationManager>(); for (final Iterator<AuthenticationManagerPluginFactory<? extends Plugin>> iterator = factories.iterator(); iterator.hasNext();) { final AuthenticationManagerPluginFactory<? extends Plugin> factory = (AuthenticationManagerPluginFactory<? extends Plugin>) iterator.next(); final AuthenticationManager tmp = factory.newInstance(securityConfiguration); if (tmp != null) { - if (authMgr != null) + if(authManagersByClass.containsKey(tmp.getClass().getSimpleName())) { - throw new ConfigurationException("Cannot configure more than one authentication manager." - + " Both " + tmp.getClass() + " and " + authMgr.getClass() + " are configured." - + " Remove configuration for one of the authentication manager, or remove the plugin JAR" - + " from the classpath."); + throw new ConfigurationException("Cannot configure more than one authentication manager of type" + + tmp.getClass().getSimpleName() + "." + + " Remove configuration for one of the authentication managers."); } - authMgr = tmp; + authManagersByClass.put(tmp.getClass().getSimpleName(),tmp); } + } - if (authMgr == null) + if(authManagersByClass.isEmpty()) { throw new ConfigurationException("No authentication managers configured within the configure file."); } + if(authManagersByClass.size() == 1) + { + defaultAuthMgr = authManagersByClass.values().iterator().next(); + } + else if(!authManagersByClass.isEmpty() && _configuration.getDefaultAuthenticationManager() != null) + { + defaultAuthMgr = authManagersByClass.get(_configuration.getDefaultAuthenticationManager()); + if(defaultAuthMgr == null) + { + throw new ConfigurationException("No authentication managers configured of type " + + _configuration.getDefaultAuthenticationManager() + + " which is specified as the default. Available managers are: " + + authManagersByClass.keySet()); + } + } + else + { + throw new ConfigurationException("If more than one authentication manager is configured a default MUST be specified."); + } + + Map<Integer,AuthenticationManager> authManagers = new HashMap<Integer, AuthenticationManager>(); + authManagers .put(null, defaultAuthMgr); + String host = _configuration.getBind(); + + for(Map.Entry<Integer,String> portMapping : _configuration.getPortAuthenticationMappings().entrySet()) + { + + AuthenticationManager authenticationManager = authManagersByClass.get(portMapping.getValue()); + if(authenticationManager == null) + { + throw new ConfigurationException("Unknown authentication manager class " + portMapping.getValue() + + " configured for port " + portMapping.getKey()); + } + authManagers.put(portMapping.getKey(), authenticationManager); + } - return authMgr; + return authManagers; } protected void initialiseVirtualHosts() throws Exception @@ -541,7 +585,7 @@ public abstract class ApplicationRegistry implements IApplicationRegistry //Shutdown virtualhosts close(_virtualHostRegistry); - close(_authenticationManager); + close(_defaultAuthenticationManager); close(_qmfService); @@ -613,19 +657,25 @@ public abstract class ApplicationRegistry implements IApplicationRegistry return _managedObjectRegistry; } - public AuthenticationManager getAuthenticationManager() + public AuthenticationManager getDefaultAuthenticationManager() { - return _authenticationManager; + return _defaultAuthenticationManager; } @Override public AuthenticationManager getAuthenticationManager(SocketAddress address) { - return _authenticationManager; + AuthenticationManager authManager = + address instanceof InetSocketAddress + ? _authenticationManagers.get(((InetSocketAddress)address).getPort()) + : null; + + return authManager == null ? _defaultAuthenticationManager : authManager; } + public PluginManager getPluginManager() { return _pluginManager; |