package org.apereo.cas.authentication.support;
import org.apereo.cas.CasViewConstants;
import org.apereo.cas.authentication.ProtocolAttributeEncoder;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.config.CasCoreAuthenticationConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationHandlersConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationMetadataConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationPolicyConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationPrincipalConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationSupportConfiguration;
import org.apereo.cas.config.CasCoreHttpConfiguration;
import org.apereo.cas.config.CasCoreServicesConfiguration;
import org.apereo.cas.config.CasCoreUtilConfiguration;
import org.apereo.cas.config.CasPersonDirectoryConfiguration;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.services.RegisteredServiceTestUtils;
import org.apereo.cas.util.cipher.NoOpCipherExecutor;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
import static org.junit.Assert.*;
/**
* This is test cases for {@link DefaultCasProtocolAttributeEncoder}.
*
* @author Misagh Moayyed
* @since 4.1
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {CasCoreServicesConfiguration.class,
CasPersonDirectoryConfiguration.class,
CasCoreAuthenticationConfiguration.class,
CasCoreAuthenticationPrincipalConfiguration.class,
CasCoreAuthenticationPolicyConfiguration.class,
CasCoreAuthenticationMetadataConfiguration.class,
CasCoreAuthenticationSupportConfiguration.class,
CasCoreAuthenticationHandlersConfiguration.class,
RefreshAutoConfiguration.class,
CasCoreHttpConfiguration.class,
CasCoreUtilConfiguration.class})
@ContextConfiguration(locations= {"/services-context.xml"})
@EnableScheduling
public class DefaultCasAttributeEncoderTests {
private Map<String, Object> attributes;
@Autowired
private ServicesManager servicesManager;
@Before
public void before() {
this.attributes = new HashMap<>();
IntStream.range(0, 3).forEach(i -> this.attributes.put("attr" + i, newSingleAttribute("value" + i)));
this.attributes.put(CasViewConstants.MODEL_ATTRIBUTE_NAME_PROXY_GRANTING_TICKET, newSingleAttribute("PGT-1234567"));
this.attributes.put(CasViewConstants.MODEL_ATTRIBUTE_NAME_PRINCIPAL_CREDENTIAL, newSingleAttribute("PrincipalPassword"));
}
private static Collection<String> newSingleAttribute(final String attr) {
return Collections.singleton(attr);
}
@Test
public void checkNoPublicKeyDefined() {
final Service service = RegisteredServiceTestUtils.getService("testDefault");
final ProtocolAttributeEncoder encoder = new DefaultCasProtocolAttributeEncoder(this.servicesManager, NoOpCipherExecutor.getInstance());
final Map<String, Object> encoded = encoder.encodeAttributes(this.attributes, this.servicesManager.findServiceBy(service));
assertEquals(encoded.size(), this.attributes.size() - 2);
}
@Test
public void checkAttributesEncodedCorrectly() {
final Service service = RegisteredServiceTestUtils.getService("testencryption");
final ProtocolAttributeEncoder encoder = new DefaultCasProtocolAttributeEncoder(this.servicesManager, NoOpCipherExecutor.getInstance());
final Map<String, Object> encoded = encoder.encodeAttributes(this.attributes, this.servicesManager.findServiceBy(service));
assertEquals(encoded.size(), this.attributes.size());
checkEncryptedValues(CasViewConstants.MODEL_ATTRIBUTE_NAME_PRINCIPAL_CREDENTIAL, encoded);
checkEncryptedValues(CasViewConstants.MODEL_ATTRIBUTE_NAME_PROXY_GRANTING_TICKET, encoded);
}
private void checkEncryptedValues(final String name, final Map<String, Object> encoded) {
final String v1 = ((Collection<?>) this.attributes.get(
name)).iterator().next().toString();
final String v2 = (String) encoded.get(name);
assertNotEquals(v1, v2);
}
}