package net.unicon.cas.mfa.authentication.principal;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.unicon.cas.mfa.web.support.MultiFactorAuthenticationSupportingWebApplicationService;
import org.jasig.cas.authentication.Authentication;
import org.jasig.cas.authentication.principal.DefaultPrincipalFactory;
import org.jasig.cas.authentication.principal.Principal;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(JUnit4.class)
public class MultiFactorCredentialsTests {
@Test(expected = UnknownPrincipalMatchException.class)
public void testMultifactorMismatchedPrincipals() {
final Principal firstPrincipal = new DefaultPrincipalFactory().createPrincipal("casuser");
final Authentication firstAuthentication = mock(Authentication.class);
when(firstAuthentication.getPrincipal()).thenReturn(firstPrincipal);
final Principal secondPrincipal = new DefaultPrincipalFactory().createPrincipal("antheruser");
final Authentication secondAuthentication = mock(Authentication.class);
when(secondAuthentication.getPrincipal()).thenReturn(secondPrincipal);
final MultiFactorCredentials c = new MultiFactorCredentials();
c.addAuthenticationToChain(firstAuthentication);
c.addAuthenticationToChain(secondAuthentication);
}
@Test
public void testMultifactorAddMatchingCredentials() {
final Principal firstPrincipal = new DefaultPrincipalFactory().createPrincipal("casuser");
final Authentication firstAuthentication = mock(Authentication.class);
when(firstAuthentication.getPrincipal()).thenReturn(firstPrincipal);
final Principal secondPrincipal = new DefaultPrincipalFactory().createPrincipal("casuser");
final Authentication secondAuthentication = mock(Authentication.class);
when(secondAuthentication.getPrincipal()).thenReturn(secondPrincipal);
final MultiFactorCredentials c = new MultiFactorCredentials();
c.addAuthenticationToChain(firstAuthentication);
c.addAuthenticationToChain(secondAuthentication);
assertEquals(2, c.countChainedAuthentications());
}
@Test
public void testCompositeAuthenticationAndPrincipalAttributes() {
final Map attributes1 = new HashMap();
attributes1.put("attr1", "attr2");
attributes1.put("uid", "username");
final Principal firstPrincipal = new DefaultPrincipalFactory().createPrincipal("casuser", attributes1);
final Authentication firstAuthentication = mock(Authentication.class);
when(firstAuthentication.getPrincipal()).thenReturn(firstPrincipal);
when(firstAuthentication.getAttributes())
.thenReturn(Collections.singletonMap(MultiFactorAuthenticationSupportingWebApplicationService.CONST_PARAM_AUTHN_METHOD,
(Object) "first_method"));
final Map attributes2 = new HashMap();
attributes2.put("attr1", "attr3");
attributes2.put("cn", "commonName");
final Principal secondPrincipal = new DefaultPrincipalFactory().createPrincipal("casuser", attributes2);
final Authentication secondAuthentication = mock(Authentication.class);
when(secondAuthentication.getPrincipal()).thenReturn(secondPrincipal);
when(secondAuthentication.getAttributes())
.thenReturn(Collections.singletonMap(MultiFactorAuthenticationSupportingWebApplicationService.CONST_PARAM_AUTHN_METHOD,
(Object) "second_method"));
final MultiFactorCredentials c = new MultiFactorCredentials();
c.addAuthenticationToChain(firstAuthentication);
c.addAuthenticationToChain(secondAuthentication);
assertEquals(2, c.countChainedAuthentications());
final Authentication authn = c.getAuthentication();
assertNotNull(authn);
assertTrue(authn.getPrincipal().equals(firstPrincipal));
assertTrue(authn.getPrincipal().equals(secondPrincipal));
final Principal thePrincipal = authn.getPrincipal();
assertEquals(thePrincipal.getAttributes().size(), 3);
assertTrue(thePrincipal.getAttributes().containsKey("attr1"));
assertTrue(thePrincipal.getAttributes().containsKey("uid"));
assertTrue(thePrincipal.getAttributes().containsKey("cn"));
assertEquals(thePrincipal.getAttributes().get("attr1"), "attr3");
assertEquals(authn.getAttributes().size(), 1);
final Set set = new HashSet(Arrays.asList("first_method", "second_method"));
assertEquals(authn.getAttributes().get(MultiFactorAuthenticationSupportingWebApplicationService.CONST_PARAM_AUTHN_METHOD),
set);
}
}