Skip to content

Commit 8dd0cf0

Browse files
author
Rob Harrop
committed
Merged bug23913 into default
2 parents 4f3f0ca + 3790ad9 commit 8dd0cf0

File tree

1 file changed

+35
-19
lines changed

1 file changed

+35
-19
lines changed

src/com/rabbitmq/client/DefaultSaslConfig.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,38 +20,54 @@
2020
import javax.security.sasl.Sasl;
2121
import javax.security.sasl.SaslClient;
2222
import javax.security.sasl.SaslException;
23-
import java.util.Map;
23+
import java.util.Arrays;
24+
import java.util.HashSet;
25+
import java.util.List;
26+
import java.util.Set;
2427

2528
/**
2629
* Default implementation of SaslConfig that uses the standard Java
2730
* algorithm for selecting a sasl client.
2831
* @see com.rabbitmq.client.ConnectionFactory
2932
*/
3033
public class DefaultSaslConfig implements SaslConfig {
31-
private ConnectionFactory factory;
32-
private String authorizationId;
33-
private Map<String,?> mechanismProperties;
34-
private CallbackHandler callbackHandler;
34+
public static final String[] DEFAULT_PREFERRED_MECHANISMS = new String[]{"PLAIN"};
3535

36-
public DefaultSaslConfig(ConnectionFactory factory) {
37-
this.factory = factory;
38-
callbackHandler = new UsernamePasswordCallbackHandler(factory);
39-
}
36+
private final ConnectionFactory factory;
37+
private final List<String> mechanisms;
38+
private final CallbackHandler callbackHandler;
4039

41-
public void setAuthorizationId(String authorizationId) {
42-
this.authorizationId = authorizationId;
40+
/**
41+
* Create a DefaultSaslConfig which only wants to use PLAIN.
42+
*
43+
* @param factory - the ConnectionFactory to use to obtain username, password and host
44+
*/
45+
public DefaultSaslConfig(ConnectionFactory factory) {
46+
this(factory, DEFAULT_PREFERRED_MECHANISMS);
4347
}
4448

45-
public void setMechanismProperties(Map<String, ?> mechanismProperties) {
46-
this.mechanismProperties = mechanismProperties;
49+
/**
50+
* Create a DefaultSaslConfig with a list of mechanisms to use.
51+
*
52+
* @param factory - the ConnectionFactory to use to obtain username, password and host
53+
* @param mechanisms - a list of SASL mechanisms to use (in descending order of preference)
54+
*/
55+
public DefaultSaslConfig(ConnectionFactory factory, String[] mechanisms) {
56+
this.factory = factory;
57+
callbackHandler = new UsernamePasswordCallbackHandler(factory);
58+
this.mechanisms = Arrays.asList(mechanisms);
4759
}
4860

49-
public void setCallbackHandler(CallbackHandler callbackHandler) {
50-
this.callbackHandler = callbackHandler;
51-
}
61+
public SaslClient getSaslClient(String[] serverMechanisms) throws SaslException {
62+
Set<String> server = new HashSet<String>(Arrays.asList(serverMechanisms));
5263

53-
public SaslClient getSaslClient(String[] mechanisms) throws SaslException {
54-
return Sasl.createSaslClient(mechanisms, authorizationId, "AMQP",
55-
factory.getHost(), mechanismProperties, callbackHandler);
64+
for (String mechanism: mechanisms) {
65+
if (server.contains(mechanism)) {
66+
SaslClient saslClient = Sasl.createSaslClient(new String[]{mechanism},
67+
null, "AMQP", factory.getHost(), null, callbackHandler);
68+
if (saslClient != null) return saslClient;
69+
}
70+
}
71+
return null;
5672
}
5773
}

0 commit comments

Comments
 (0)