20
20
import javax .security .sasl .Sasl ;
21
21
import javax .security .sasl .SaslClient ;
22
22
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 ;
24
27
25
28
/**
26
29
* Default implementation of SaslConfig that uses the standard Java
27
30
* algorithm for selecting a sasl client.
28
31
* @see com.rabbitmq.client.ConnectionFactory
29
32
*/
30
33
public class DefaultSaslConfig implements SaslConfig {
34
+ public static final String [] DEFAULT_PREFERRED_MECHANISMS = new String []{"PLAIN" };
35
+
31
36
private ConnectionFactory factory ;
32
37
private String authorizationId ;
33
- private Map < String ,?> mechanismProperties ;
38
+ private String [] preferredMechanisms = DEFAULT_PREFERRED_MECHANISMS ;
34
39
private CallbackHandler callbackHandler ;
35
40
36
41
public DefaultSaslConfig (ConnectionFactory factory ) {
@@ -42,16 +47,28 @@ public void setAuthorizationId(String authorizationId) {
42
47
this .authorizationId = authorizationId ;
43
48
}
44
49
45
- public void setMechanismProperties (Map <String , ?> mechanismProperties ) {
46
- this .mechanismProperties = mechanismProperties ;
50
+ /**
51
+ * Set a list of SASL mechanisms to use (in descending order of preference)
52
+ * @param preferredMechanisms
53
+ */
54
+ public void setPreferredMechanisms (String [] preferredMechanisms ) {
55
+ this .preferredMechanisms = preferredMechanisms ;
47
56
}
48
57
49
58
public void setCallbackHandler (CallbackHandler callbackHandler ) {
50
59
this .callbackHandler = callbackHandler ;
51
60
}
52
61
53
- public SaslClient getSaslClient (String [] mechanisms ) throws SaslException {
54
- return Sasl .createSaslClient (mechanisms , authorizationId , "AMQP" ,
55
- factory .getHost (), mechanismProperties , callbackHandler );
62
+ public SaslClient getSaslClient (String [] serverMechanisms ) throws SaslException {
63
+ List <String > server = Arrays .asList (serverMechanisms );
64
+ List <String > client = Arrays .asList (preferredMechanisms );
65
+ client .retainAll (server );
66
+
67
+ for (String mechanism : client ) {
68
+ SaslClient saslClient = Sasl .createSaslClient (new String []{mechanism },
69
+ authorizationId , "AMQP" , factory .getHost (), null , callbackHandler );
70
+ if (saslClient != null ) return saslClient ;
71
+ }
72
+ return null ;
56
73
}
57
74
}
0 commit comments