package org.apereo.cas.services.support;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.FileUtils;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.services.RegisteredServiceAttributeFilter;
import org.apereo.cas.services.RegisteredServiceTestUtils;
import org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy;
import org.apereo.cas.util.serialization.SerializationUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* @author Misagh Moayyed
* @since 4.0.0
*/
public class RegisteredServiceRegexAttributeFilterTests {
private static final File JSON_FILE = new File(FileUtils.getTempDirectoryPath(), "registeredServiceRegexAttributeFilter.json");
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String PHONE = "phone";
private static final String FAMILY_NAME = "familyName";
private static final String GIVEN_NAME = "givenName";
private static final String UID = "uid";
private final RegisteredServiceAttributeFilter filter;
private final Map<String, Object> givenAttributesMap;
@Mock
private RegisteredService registeredService;
public RegisteredServiceRegexAttributeFilterTests() {
this.filter = new RegisteredServiceRegexAttributeFilter("^.{5,}$");
this.givenAttributesMap = new HashMap<>();
this.givenAttributesMap.put(UID, "loggedInTestUid");
this.givenAttributesMap.put(PHONE, "1290");
this.givenAttributesMap.put(FAMILY_NAME, "Smith");
this.givenAttributesMap.put(GIVEN_NAME, "John");
this.givenAttributesMap.put("employeeId", "E1234");
this.givenAttributesMap.put("memberOf", Arrays.asList("math", "science", "chemistry"));
this.givenAttributesMap.put("arrayAttribute", new String[]{"math", "science", "chemistry"});
this.givenAttributesMap.put("setAttribute", Stream.of("math", "science", "chemistry").collect(Collectors.toSet()));
final Map<String, String> mapAttributes = new HashMap<>();
mapAttributes.put(UID, "loggedInTestUid");
mapAttributes.put(PHONE, "890");
mapAttributes.put(FAMILY_NAME, "Smith");
this.givenAttributesMap.put("mapAttribute", mapAttributes);
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(this.registeredService.getName()).thenReturn("sample test service");
when(this.registeredService.getServiceId()).thenReturn("https://www.jasig.org");
}
@Test
public void verifyPatternFilter() {
final Map<String, Object> attrs = this.filter.filter(this.givenAttributesMap);
assertEquals(attrs.size(), 7);
assertFalse(attrs.containsKey(PHONE));
assertFalse(attrs.containsKey(GIVEN_NAME));
assertTrue(attrs.containsKey(UID));
assertTrue(attrs.containsKey("memberOf"));
assertTrue(attrs.containsKey("mapAttribute"));
final Map<String, String> mapAttributes = (Map<String, String>) attrs.get("mapAttribute");
assertTrue(mapAttributes.containsKey(UID));
assertTrue(mapAttributes.containsKey(FAMILY_NAME));
assertFalse(mapAttributes.containsKey(PHONE));
final List<?> obj = (List<?>) attrs.get("memberOf");
assertEquals(2, obj.size());
}
@Test
public void verifyServiceAttributeFilterAllowedAttributesWithARegexFilter() {
final ReturnAllowedAttributeReleasePolicy policy = new ReturnAllowedAttributeReleasePolicy();
policy.setAllowedAttributes(Arrays.asList("attr1", "attr3", "another"));
policy.setAttributeFilter(new RegisteredServiceRegexAttributeFilter("v3"));
final Principal p = mock(Principal.class);
final Map<String, Object> map = new HashMap<>();
map.put("attr1", "value1");
map.put("attr2", "value2");
map.put("attr3", Arrays.asList("v3", "v4"));
when(p.getAttributes()).thenReturn(map);
when(p.getId()).thenReturn("principalId");
final Map<String, Object> attr = policy.getAttributes(p, RegisteredServiceTestUtils.getService(),
RegisteredServiceTestUtils.getRegisteredService("test"));
assertEquals(attr.size(), 1);
assertTrue(attr.containsKey("attr3"));
final byte[] data = SerializationUtils.serialize(policy);
final ReturnAllowedAttributeReleasePolicy p2 =
SerializationUtils.deserializeAndCheckObject(data, ReturnAllowedAttributeReleasePolicy.class);
assertNotNull(p2);
assertEquals(p2.getAllowedAttributes(), policy.getAllowedAttributes());
assertEquals(p2.getAttributeFilter(), policy.getAttributeFilter());
}
@Test
public void verifySerialization() {
final byte[] data = SerializationUtils.serialize(this.filter);
final RegisteredServiceAttributeFilter secondFilter =
SerializationUtils.deserializeAndCheckObject(data, RegisteredServiceAttributeFilter.class);
assertEquals(secondFilter, this.filter);
}
@Test
public void verifySerializeARegisteredServiceRegexAttributeFilterToJson() throws IOException {
MAPPER.writeValue(JSON_FILE, filter);
final RegisteredServiceAttributeFilter filterRead = MAPPER.readValue(JSON_FILE, RegisteredServiceRegexAttributeFilter.class);
assertEquals(filter, filterRead);
}
}