|
@@ -26,10 +26,6 @@ import java.io.IOException;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
import java.security.PrivilegedExceptionAction;
|
|
|
import java.security.Security;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Enumeration;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
import javax.security.auth.callback.Callback;
|
|
@@ -39,7 +35,6 @@ import javax.security.auth.callback.PasswordCallback;
|
|
|
import javax.security.auth.callback.UnsupportedCallbackException;
|
|
|
import javax.security.sasl.AuthorizeCallback;
|
|
|
import javax.security.sasl.RealmCallback;
|
|
|
-import javax.security.sasl.Sasl;
|
|
|
import javax.security.sasl.SaslException;
|
|
|
import javax.security.sasl.SaslServer;
|
|
|
import javax.security.sasl.SaslServerFactory;
|
|
@@ -178,10 +173,12 @@ public class SaslRpcServer {
|
|
|
}
|
|
|
|
|
|
public static void init(Configuration conf) {
|
|
|
- Security.addProvider(new SaslPlainServer.SecurityProvider());
|
|
|
- // passing null so factory is populated with all possibilities. the
|
|
|
- // properties passed when instantiating a server are what really matter
|
|
|
- saslFactory = new FastSaslServerFactory(null);
|
|
|
+ if (saslFactory == null) {
|
|
|
+ Security.addProvider(new SaslPlainServer.SecurityProvider());
|
|
|
+ // passing null so factory is populated with all possibilities. the
|
|
|
+ // properties passed when instantiating a server are what really matter
|
|
|
+ saslFactory = new FastSaslServerFactory(null);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static String encodeIdentifier(byte[] identifier) {
|
|
@@ -367,47 +364,4 @@ public class SaslRpcServer {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // Sasl.createSaslServer is 100-200X slower than caching the factories!
|
|
|
- private static class FastSaslServerFactory implements SaslServerFactory {
|
|
|
- private final Map<String,List<SaslServerFactory>> factoryCache =
|
|
|
- new HashMap<String,List<SaslServerFactory>>();
|
|
|
-
|
|
|
- FastSaslServerFactory(Map<String,?> props) {
|
|
|
- final Enumeration<SaslServerFactory> factories =
|
|
|
- Sasl.getSaslServerFactories();
|
|
|
- while (factories.hasMoreElements()) {
|
|
|
- SaslServerFactory factory = factories.nextElement();
|
|
|
- for (String mech : factory.getMechanismNames(props)) {
|
|
|
- if (!factoryCache.containsKey(mech)) {
|
|
|
- factoryCache.put(mech, new ArrayList<SaslServerFactory>());
|
|
|
- }
|
|
|
- factoryCache.get(mech).add(factory);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public SaslServer createSaslServer(String mechanism, String protocol,
|
|
|
- String serverName, Map<String,?> props, CallbackHandler cbh)
|
|
|
- throws SaslException {
|
|
|
- SaslServer saslServer = null;
|
|
|
- List<SaslServerFactory> factories = factoryCache.get(mechanism);
|
|
|
- if (factories != null) {
|
|
|
- for (SaslServerFactory factory : factories) {
|
|
|
- saslServer = factory.createSaslServer(
|
|
|
- mechanism, protocol, serverName, props, cbh);
|
|
|
- if (saslServer != null) {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return saslServer;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String[] getMechanismNames(Map<String, ?> props) {
|
|
|
- return factoryCache.keySet().toArray(new String[0]);
|
|
|
- }
|
|
|
- }
|
|
|
}
|