package org.apereo.cas.mgmt.services.web.factory;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.principal.PersistentIdGenerator;
import org.apereo.cas.authentication.principal.ShibbolethCompatiblePersistentIdGenerator;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceEditBean.ServiceData;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceUsernameAttributeProviderEditBean;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceViewBean;
import org.apereo.cas.services.AnonymousRegisteredServiceUsernameAttributeProvider;
import org.apereo.cas.services.DefaultRegisteredServiceUsernameProvider;
import org.apereo.cas.services.PrincipalAttributeRegisteredServiceUsernameProvider;
import org.apereo.cas.services.RegisteredServiceUsernameAttributeProvider;
import java.nio.charset.Charset;
/**
* Default mapper for converting {@link RegisteredServiceUsernameAttributeProvider} to/from {@link ServiceData}.
*
* @author Daniel Frett
* @since 4.2
*/
public class DefaultUsernameAttributeProviderMapper implements UsernameAttributeProviderMapper {
@Override
public void mapUsernameAttributeProvider(final RegisteredServiceUsernameAttributeProvider provider,
final ServiceData bean) {
final RegisteredServiceUsernameAttributeProviderEditBean uBean = bean.getUserAttrProvider();
if (provider instanceof DefaultRegisteredServiceUsernameProvider) {
uBean.setType(RegisteredServiceUsernameAttributeProviderEditBean.Types.DEFAULT.toString());
} else if (provider instanceof AnonymousRegisteredServiceUsernameAttributeProvider) {
final AnonymousRegisteredServiceUsernameAttributeProvider anonymous = (AnonymousRegisteredServiceUsernameAttributeProvider) provider;
uBean.setType(RegisteredServiceUsernameAttributeProviderEditBean.Types.ANONYMOUS.toString());
final PersistentIdGenerator generator = anonymous.getPersistentIdGenerator();
if (generator instanceof ShibbolethCompatiblePersistentIdGenerator) {
final ShibbolethCompatiblePersistentIdGenerator sh = (ShibbolethCompatiblePersistentIdGenerator) generator;
if (sh.getSalt() != null) {
final String salt = new String(sh.getSalt(), Charset.defaultCharset());
uBean.setValue(salt);
} else {
throw new IllegalArgumentException("Salt cannot be null");
}
}
} else if (provider instanceof PrincipalAttributeRegisteredServiceUsernameProvider) {
final PrincipalAttributeRegisteredServiceUsernameProvider p = (PrincipalAttributeRegisteredServiceUsernameProvider) provider;
uBean.setType(RegisteredServiceUsernameAttributeProviderEditBean.Types.ATTRIBUTE.toString());
uBean.setValue(p.getUsernameAttribute());
}
}
@Override
public void mapUsernameAttributeProvider(final RegisteredServiceUsernameAttributeProvider provider,
final RegisteredServiceViewBean bean) {
}
@Override
public RegisteredServiceUsernameAttributeProvider toUsernameAttributeProvider(final ServiceData data) {
final RegisteredServiceUsernameAttributeProviderEditBean userAttrProvider = data.getUserAttrProvider();
final String uidType = userAttrProvider.getType();
if (StringUtils.equalsIgnoreCase(uidType, RegisteredServiceUsernameAttributeProviderEditBean.Types.DEFAULT
.toString())) {
return new DefaultRegisteredServiceUsernameProvider();
}
if (StringUtils.equalsIgnoreCase(uidType, RegisteredServiceUsernameAttributeProviderEditBean.Types
.ANONYMOUS.toString())) {
final String salt = userAttrProvider.getValue();
if (StringUtils.isNotBlank(salt)) {
final ShibbolethCompatiblePersistentIdGenerator generator = new
ShibbolethCompatiblePersistentIdGenerator(salt);
return new AnonymousRegisteredServiceUsernameAttributeProvider(generator);
}
throw new IllegalArgumentException("Invalid sale value for anonymous ids " + salt);
}
if (StringUtils.equalsIgnoreCase(uidType, RegisteredServiceUsernameAttributeProviderEditBean.Types
.ATTRIBUTE.toString())) {
final String attr = userAttrProvider.getValue();
if (StringUtils.isNotBlank(attr)) {
return new PrincipalAttributeRegisteredServiceUsernameProvider(attr);
}
throw new IllegalArgumentException("Invalid attribute specified for username");
}
return null;
}
}