/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.security.test;
import java.security.Principal;
import java.util.HashMap;
import java.util.Arrays;
import java.lang.reflect.Method;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.LoginContext;
import javax.security.auth.Subject;
import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.jboss.security.SecurityAssociation;
import org.jboss.security.SimplePrincipal;
import org.jboss.security.auth.callback.UsernamePasswordHandler;
/**
ClientLoginModuleUnitTestCase/SecurityAssociation interaction tests
@author Scott.Stark@jboss.org
@version $Revision: 81036 $
*/
public class ClientLoginModuleUnitTestCase
extends TestCase
{
static TestConfig jaasConfig = new TestConfig();
static class TestConfig extends Configuration
{
public void refresh()
{
}
public AppConfigurationEntry[] getAppConfigurationEntry(String name)
{
AppConfigurationEntry[] entry = null;
try
{
Class[] parameterTypes = {};
Method m = getClass().getDeclaredMethod(name, parameterTypes);
Object[] args = {};
entry = (AppConfigurationEntry[]) m.invoke(this, args);
}
catch(Exception e)
{
}
return entry;
}
AppConfigurationEntry[] testSingleThreaded()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "false");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
AppConfigurationEntry[] testSingleThreadedRestoreIdentity()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "false");
options.put("restore-login-identity", "true");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
AppConfigurationEntry[] testSingleThreadedRestoreStack()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "false");
options.put("restore-login-identity", "true");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
AppConfigurationEntry[] testMultiThreaded()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "true");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
AppConfigurationEntry[] testMultiThreadedRestoreIdentity()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "true");
options.put("restore-login-identity", "true");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
AppConfigurationEntry[] testMultiThreadedRestoreStack()
{
String name = "org.jboss.security.ClientLoginModule";
HashMap options = new HashMap();
options.put("multi-threaded", "true");
options.put("restore-login-identity", "true");
AppConfigurationEntry ace = new AppConfigurationEntry(name,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
AppConfigurationEntry[] entry = {ace};
return entry;
}
}
public static Test suite() throws Exception
{
TestSuite suite = new TestSuite();
suite.addTest(new ClientLoginModuleUnitTestCase("testSingleThreaded"));
suite.addTest(new ClientLoginModuleUnitTestCase("testSingleThreadedRestoreIdentity"));
suite.addTest(new ClientLoginModuleUnitTestCase("testSingleThreadedRestoreStack"));
suite.addTest(new ClientLoginModuleUnitTestCase("testMultiThreaded"));
suite.addTest(new ClientLoginModuleUnitTestCase("testMultiThreadedRestoreIdentity"));
suite.addTest(new ClientLoginModuleUnitTestCase("testMultiThreadedRestoreStack"));
return suite;
}
public ClientLoginModuleUnitTestCase(String name)
{
super(name);
}
protected void setUp() throws Exception
{
Configuration.setConfiguration(jaasConfig);
//Clear SecurityAssociation
SecurityAssociation.clear();
}
protected void tearDown()
{
}
public void testSingleThreaded() throws Exception
{
System.out.println("+++ testSingleThreaded");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke",
"theduke");
LoginContext lc = new LoginContext("testSingleThreaded", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal theduke = new SimplePrincipal("jduke");
assertTrue("Principals contains theduke", subject.getPrincipals().contains(theduke));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == theduke", saPrincipal.equals(theduke));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke",
Arrays.equals(password, "theduke".toCharArray()));
}
public void testSingleThreadedRestoreIdentity() throws Exception
{
System.out.println("+++ testSingleThreadedRestoreIdentity");
Principal jduke1 = new SimplePrincipal("jduke1");
SecurityAssociation.setPrincipal(jduke1);
SecurityAssociation.setCredential("theduke1");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke2",
"theduke2");
LoginContext lc = new LoginContext("testSingleThreadedRestoreIdentity", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal jduke2 = new SimplePrincipal("jduke2");
assertTrue("Principals contains jduke2", subject.getPrincipals().contains(jduke2));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke2", saPrincipal.equals(jduke2));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke2",
Arrays.equals(password, "theduke2".toCharArray()));
lc.logout();
// Validate restored state
saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke1", saPrincipal.equals(jduke1));
String theduke1 = (String) SecurityAssociation.getCredential();
assertTrue("password == theduke1", theduke1.equals("theduke1"));
}
public void testSingleThreadedRestoreStack() throws Exception
{
System.out.println("+++ testSingleThreadedRestoreStack");
Principal jduke1 = new SimplePrincipal("jduke1");
Subject subject1 = new Subject();
SecurityAssociation.pushSubjectContext(subject1, jduke1, "theduke1");
Principal jduke2 = new SimplePrincipal("jduke2");
Subject subject2 = new Subject();
SecurityAssociation.pushSubjectContext(subject2, jduke2, "theduke2");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke3",
"theduke3");
LoginContext lc = new LoginContext("testSingleThreadedRestoreIdentity", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal jduke3 = new SimplePrincipal("jduke3");
assertTrue("Principals contains jduke3", subject.getPrincipals().contains(jduke3));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke3", saPrincipal.equals(jduke3));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke3",
Arrays.equals(password, "theduke3".toCharArray()));
SecurityAssociation.SubjectContext sc3 = SecurityAssociation.peekSubjectContext();
System.out.println(sc3);
assertTrue("SecurityAssociation.peekSubjectContext == jduke3", sc3.getPrincipal().equals(jduke3));
char[] theduke3 = (char[]) sc3.getCredential();
assertTrue("password == theduke3",
Arrays.equals(theduke3, "theduke3".toCharArray()));
lc.logout();
// Validate restored state
SecurityAssociation.SubjectContext sc2 = SecurityAssociation.peekSubjectContext();
System.out.println(sc2);
assertTrue("SecurityAssociation.peekSubjectContext == jduke2", sc2.getPrincipal().equals(jduke2));
String theduke2 = (String) sc2.getCredential();
assertTrue("password == theduke2", theduke2.equals("theduke2"));
SecurityAssociation.popSubjectContext();
SecurityAssociation.SubjectContext sc1 = SecurityAssociation.peekSubjectContext();
System.out.println(sc1);
assertTrue("SecurityAssociation.peekSubjectContext == jduke1", sc1.getPrincipal().equals(jduke1));
String theduke1 = (String) sc1.getCredential();
assertTrue("password == theduke1", theduke1.equals("theduke1"));
}
public void testMultiThreaded() throws Exception
{
TestMultiThreaded r0 = new TestMultiThreaded();
Thread t0 = new Thread(r0, "testMultiThreaded#0");
t0.start();
TestMultiThreaded r1 = new TestMultiThreaded();
Thread t1 = new Thread(r1, "testMultiThreaded#1");
t1.start();
t0.join();
assertTrue(r0.failure == null);
t1.join();
assertTrue(r1.failure == null);
}
static class TestMultiThreaded implements Runnable
{
Exception failure;
public void run()
{
try
{
System.out.println("+++ testMultiThreadedRunnable");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke",
"theduke");
LoginContext lc = new LoginContext("testSingleThreaded", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal theduke = new SimplePrincipal("jduke");
assertTrue("Principals contains theduke", subject.getPrincipals().contains(theduke));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == theduke", saPrincipal.equals(theduke));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke",
Arrays.equals(password, "theduke".toCharArray()));
}
catch(Exception e)
{
failure = e;
}
}
}
public void testMultiThreadedRestoreIdentity() throws Exception
{
TestMultiThreadedRestoreIdentity r0 = new TestMultiThreadedRestoreIdentity();
Thread t0 = new Thread(r0, "testMultiThreadedRestoreIdentity#0");
t0.start();
TestMultiThreadedRestoreIdentity r1 = new TestMultiThreadedRestoreIdentity();
Thread t1 = new Thread(r1, "testMultiThreadedRestoreIdentity#1");
t1.start();
t0.join();
assertTrue(r0.failure == null);
t1.join();
assertTrue(r1.failure == null);
}
static class TestMultiThreadedRestoreIdentity implements Runnable
{
Exception failure;
public void run()
{
try
{
System.out.println("+++ testMultiThreadedRestoreIdentity");
Principal jduke1 = new SimplePrincipal("jduke1");
SecurityAssociation.setPrincipal(jduke1);
SecurityAssociation.setCredential("theduke1");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke2",
"theduke2");
LoginContext lc = new LoginContext("testSingleThreadedRestoreIdentity", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal jduke2 = new SimplePrincipal("jduke2");
assertTrue("Principals contains jduke2", subject.getPrincipals().contains(jduke2));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke2", saPrincipal.equals(jduke2));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke2",
Arrays.equals(password, "theduke2".toCharArray()));
lc.logout();
// Validate restored state
saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke1", saPrincipal.equals(jduke1));
String theduke1 = (String) SecurityAssociation.getCredential();
assertTrue("password == theduke1", theduke1.equals("theduke1"));
}
catch(Exception e)
{
failure = e;
}
}
}
public void testMultiThreadedRestoreStack() throws Exception
{
TestMultiThreadedRestoreStack r0 = new TestMultiThreadedRestoreStack();
Thread t0 = new Thread(r0, "testMultiThreadedRestoreIdentity#0");
t0.start();
TestMultiThreadedRestoreStack r1 = new TestMultiThreadedRestoreStack();
Thread t1 = new Thread(r1, "testMultiThreadedRestoreIdentity#1");
t1.start();
t0.join();
assertTrue(r0.failure == null);
t1.join();
assertTrue(r1.failure == null);
}
static class TestMultiThreadedRestoreStack implements Runnable
{
Exception failure;
public void run()
{
try
{
System.out.println("+++ testMultThreadedRestoreStack");
Principal jduke1 = new SimplePrincipal("jduke1");
Subject subject1 = new Subject();
SecurityAssociation.pushSubjectContext(subject1, jduke1, "theduke1");
Principal jduke2 = new SimplePrincipal("jduke2");
Subject subject2 = new Subject();
SecurityAssociation.pushSubjectContext(subject2, jduke2, "theduke2");
UsernamePasswordHandler handler = new UsernamePasswordHandler("jduke3",
"theduke3");
LoginContext lc = new LoginContext("testSingleThreadedRestoreIdentity", handler);
lc.login();
Subject subject = lc.getSubject();
System.out.println("LC.Subject: "+subject);
Principal jduke3 = new SimplePrincipal("jduke3");
assertTrue("Principals contains jduke3", subject.getPrincipals().contains(jduke3));
Principal saPrincipal = SecurityAssociation.getPrincipal();
assertTrue("SecurityAssociation.getPrincipal == jduke3", saPrincipal.equals(jduke3));
char[] password = (char[]) SecurityAssociation.getCredential();
assertTrue("password == theduke3",
Arrays.equals(password, "theduke3".toCharArray()));
SecurityAssociation.SubjectContext sc3 = SecurityAssociation.peekSubjectContext();
System.out.println(sc3);
assertTrue("SecurityAssociation.peekSubjectContext == jduke3", sc3.getPrincipal().equals(jduke3));
char[] theduke3 = (char[]) sc3.getCredential();
assertTrue("password == theduke3",
Arrays.equals(theduke3, "theduke3".toCharArray()));
lc.logout();
// Validate restored state
SecurityAssociation.SubjectContext sc2 = SecurityAssociation.peekSubjectContext();
System.out.println(sc2);
assertTrue("SecurityAssociation.peekSubjectContext == jduke2", sc2.getPrincipal().equals(jduke2));
String theduke2 = (String) sc2.getCredential();
assertTrue("password == theduke2", theduke2.equals("theduke2"));
SecurityAssociation.popSubjectContext();
SecurityAssociation.SubjectContext sc1 = SecurityAssociation.peekSubjectContext();
System.out.println(sc1);
assertTrue("SecurityAssociation.peekSubjectContext == jduke1", sc1.getPrincipal().equals(jduke1));
String theduke1 = (String) sc1.getCredential();
assertTrue("password == theduke1", theduke1.equals("theduke1"));
}
catch(Exception e)
{
failure = e;
}
}
}
}