package org.jgroups.protocols;
import static org.testng.AssertJUnit.assertTrue;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.auth.sasl.SimpleAuthorizingCallbackHandler;
import org.jgroups.protocols.pbcast.GMS;
import org.jgroups.protocols.pbcast.NAKACK2;
import org.jgroups.protocols.pbcast.STABLE;
import org.jgroups.stack.Protocol;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test(groups = Global.FUNCTIONAL, singleThreaded = true)
public class SASL_SimpleAuthorizingCallbackTest {
private static final String REALM = "MyRealm";
private JChannel a;
private JChannel b;
File credentialsFile;
File rolesFile;
@BeforeClass
public void initialize() throws Exception {
Properties credentials = new Properties();
credentials.put("jack", "brokehiscrown");
credentials.put("jill", "cametumblingafter");
credentials.put("jane", "whatsyourname");
credentialsFile = File.createTempFile("sasl_credentials", ".properties");
credentials.store(new FileOutputStream(credentialsFile), null);
Properties roles = new Properties();
roles.put("jack", "mycluster");
roles.put("jill", "mycluster");
roles.put("jane", "othercluster");
rolesFile = File.createTempFile("sasl_roles", ".properties");
roles.store(new FileOutputStream(rolesFile), null);
}
private JChannel createChannel(String channelName, String mech, String principal) throws Exception {
Properties properties = new Properties();
properties.put("sasl.local.principal", principal);
properties.put("sasl.credentials.properties", credentialsFile.getAbsolutePath());
properties.put("sasl.role", "mycluster");
properties.put("sasl.roles.properties", rolesFile.getAbsolutePath());
properties.put("sasl.realm", REALM);
SASL sasl = new SASL();
sasl.setMech(mech);
sasl.setClientCallbackHandler(new SimpleAuthorizingCallbackHandler(properties));
sasl.setServerCallbackHandler(new SimpleAuthorizingCallbackHandler(properties));
sasl.setTimeout(5000);
sasl.sasl_props.put("com.sun.security.sasl.digest.realm", REALM);
return new JChannel(new Protocol[] { new SHARED_LOOPBACK(), new PING(), new NAKACK2(), new UNICAST3(),
new STABLE(), sasl, new GMS() }).name(channelName);
}
public void testSASLDigestMD5() throws Exception {
a = createChannel("A", "DIGEST-MD5", "jack");
b = createChannel("B", "DIGEST-MD5", "jill");
a.connect("SaslTest");
b.connect("SaslTest");
assertTrue(b.isConnected());
}
@Test(expectedExceptions = SecurityException.class)
public void testSASLDigestMD5Failure() throws Throwable {
a = createChannel("A", "DIGEST-MD5", "jack");
b = createChannel("B", "DIGEST-MD5", "jane");
a.connect("SaslTest");
try {
b.connect("SaslTest");
} catch (Exception e) {
if (e.getCause() != null)
throw e.getCause();
}
}
@AfterMethod
public void cleanup() {
a.close();
b.close();
}
}