package org.apereo.cas.adaptors.generic;
import org.apereo.cas.authentication.CoreAuthenticationTestUtils;
import org.apereo.cas.authentication.HttpBasedServiceCredential;
import org.apereo.cas.authentication.PreventedException;
import org.apereo.cas.authentication.UsernamePasswordCredential;
import org.apereo.cas.configuration.model.core.authentication.PasswordEncoderProperties;
import org.apereo.cas.configuration.support.Beans;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.core.io.ClassPathResource;
import javax.security.auth.login.AccountNotFoundException;
import javax.security.auth.login.FailedLoginException;
import java.net.MalformedURLException;
import java.net.URL;
import static org.junit.Assert.*;
/**
* @author Scott Battaglia
* @since 3.0.0
*/
public class FileAuthenticationHandlerTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
private FileAuthenticationHandler authenticationHandler;
@Before
public void setUp() throws Exception {
this.authenticationHandler = new FileAuthenticationHandler("", null, null, new ClassPathResource("authentication.txt"),
FileAuthenticationHandler.DEFAULT_SEPARATOR);
final PasswordEncoderProperties p = new PasswordEncoderProperties();
p.setType(PasswordEncoderProperties.PasswordEncoderTypes.DEFAULT.name());
p.setEncodingAlgorithm("MD5");
p.setCharacterEncoding("UTF-8");
this.authenticationHandler.setPasswordEncoder(Beans.newPasswordEncoder(p));
}
@Test
public void verifySupportsProperUserCredentials() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername("scott");
c.setPassword("rutgers");
assertNotNull(this.authenticationHandler.authenticate(c));
}
@Test
public void verifyDoesNotSupportBadUserCredentials() {
try {
final HttpBasedServiceCredential c = new HttpBasedServiceCredential(
new URL("http://www.rutgers.edu"), CoreAuthenticationTestUtils.getRegisteredService());
assertFalse(this.authenticationHandler.supports(c));
} catch (final MalformedURLException e) {
fail("MalformedURLException caught.");
}
}
@Test
public void verifyAuthenticatesUserInFileWithDefaultSeparator() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername("scott");
c.setPassword("rutgers");
assertNotNull(this.authenticationHandler.authenticate(c));
}
@Test
public void verifyFailsUserNotInFileWithDefaultSeparator() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername("fds");
c.setPassword("rutgers");
this.thrown.expect(AccountNotFoundException.class);
this.thrown.expectMessage("fds not found in backing file.");
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyFailsNullUserName() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername(null);
c.setPassword("user");
this.thrown.expect(AccountNotFoundException.class);
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyFailsNullUserNameAndPassword() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername(null);
c.setPassword(null);
this.thrown.expect(AccountNotFoundException.class);
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyFailsNullPassword() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
c.setUsername("scott");
c.setPassword(null);
this.thrown.expect(FailedLoginException.class);
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyAuthenticatesUserInFileWithCommaSeparator() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
this.authenticationHandler = new FileAuthenticationHandler("", null, null, new ClassPathResource("authentication2.txt"), ",");
c.setUsername("scott");
c.setPassword("rutgers");
assertNotNull(this.authenticationHandler.authenticate(c));
}
@Test
public void verifyFailsUserNotInFileWithCommaSeparator() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
this.authenticationHandler = new FileAuthenticationHandler("", null, null, new ClassPathResource("authentication2.txt"), ",");
c.setUsername("fds");
c.setPassword("rutgers");
this.thrown.expect(AccountNotFoundException.class);
this.thrown.expectMessage("fds not found in backing file.");
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyFailsGoodUsernameBadPassword() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
this.authenticationHandler = new FileAuthenticationHandler("", null, null, new ClassPathResource("authentication2.txt"), ",");
c.setUsername("scott");
c.setPassword("rutgers1");
this.thrown.expect(FailedLoginException.class);
this.authenticationHandler.authenticate(c);
}
@Test
public void verifyAuthenticateNoFileName() throws Exception {
final UsernamePasswordCredential c = new UsernamePasswordCredential();
this.authenticationHandler = new FileAuthenticationHandler("", null, null, new ClassPathResource("fff"), FileAuthenticationHandler.DEFAULT_SEPARATOR);
c.setUsername("scott");
c.setPassword("rutgers");
this.thrown.expect(PreventedException.class);
this.thrown.expectMessage("IO error reading backing file");
this.authenticationHandler.authenticate(c);
}
}