SLING-11912 - Empty configuration in ServiceUserMapperImpl's Required Principal/User validators results in 503
diff --git a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
index c8f3a8b..a7bbe8b 100644
--- a/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
+++ b/src/main/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImpl.java
@@ -37,6 +37,7 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
import org.apache.sling.serviceusermapping.Mapping;
import org.apache.sling.serviceusermapping.ServicePrincipalsValidator;
@@ -178,11 +179,11 @@
this.requireValidation = config.require_validation();
if (config.required_user_validators() != null) {
- requiredUserValidators.addAll(Arrays.asList(config.required_user_validators()));
+ requiredUserValidators.addAll(filterEmptyStringValues(config.required_user_validators()));
}
if (config.required_principal_validators() != null) {
- requiredPrincipalValidators.addAll(Arrays.asList(config.required_principal_validators()));
+ requiredPrincipalValidators.addAll(filterEmptyStringValues(config.required_principal_validators()));
}
RegistrationSet registrationSet = this.updateMappings();
@@ -559,6 +560,10 @@
return getValidatorsIfPresent(principalsValidators);
}
+ private List<String> filterEmptyStringValues(String[] arr) {
+ return Arrays.stream(arr).filter(p -> !p.trim().isEmpty()).collect(Collectors.toList());
+ }
+
private <T> List<T> getValidatorsIfPresent(List<T> validators) {
if (presentUserValidators.containsAll(requiredUserValidators) && presentPrincipalValidators.containsAll(requiredPrincipalValidators)) {
return validators;
diff --git a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
index 674058e..e029cb0 100644
--- a/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
+++ b/src/test/java/org/apache/sling/serviceusermapping/impl/ServiceUserMapperImplTest.java
@@ -50,6 +50,8 @@
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.times;
public class ServiceUserMapperImplTest {
private static final String BUNDLE_SYMBOLIC1 = "bundle1";
@@ -159,6 +161,36 @@
}
@Test
+ public void test_emptyRequiredUserAndPrincipalValidators() {
+ ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
+ when(config.require_validation()).thenReturn(true);
+ when(config.required_user_validators()).thenReturn(new String[] {"mockRUV", ""});
+ when(config.required_principal_validators()).thenReturn(new String[] {"mockRPV", ""});
+
+ final ServiceUserMapperImpl mapper = new ServiceUserMapperImpl(null, config);
+
+ List<String> principalNames = Collections.singletonList("bla");
+
+ ServiceUserValidator userValidator = mock(ServiceUserValidator.class);
+ when(userValidator.isValid("alice", "org", "foo")).thenReturn(true);
+ Map<String, Object> properties = new HashMap<>();
+ properties.put(VALIDATOR_ID, "mockRUV");
+ mapper.bindServiceUserValidator(userValidator, properties);
+
+ ServicePrincipalsValidator principalsValidator = mock(ServicePrincipalsValidator.class);
+ when(principalsValidator.isValid(principalNames, "org", "foo")).thenReturn(true);
+ properties.put(VALIDATOR_ID, "mockRPV");
+ mapper.bindServicePrincipalsValidator(principalsValidator, properties);
+
+ // empty validators should be skipped
+ assertTrue(mapper.isValidUser("alice", "org", "foo", true));
+ verify(userValidator, times(1)).isValid("alice", "org", "foo");
+
+ assertTrue(mapper.areValidPrincipals(principalNames, "org", "foo", true));
+ verify(principalsValidator, times(1)).isValid(principalNames,"org", "foo");
+ }
+
+ @Test
public void test_getServiceUserID() {
ServiceUserMapperImpl.Config config = mock(ServiceUserMapperImpl.Config.class);
when(config.user_mapping()).thenReturn(new String[] {