package org.apereo.cas.persondir.support; import com.google.common.base.Throwables; import net.shibboleth.idp.attribute.IdPAttributeValue; import net.shibboleth.idp.attribute.resolver.AttributeResolver; import net.shibboleth.idp.attribute.resolver.ResolutionException; import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext; import org.apereo.services.persondir.IPersonAttributeDao; import org.apereo.services.persondir.IPersonAttributes; import org.apereo.services.persondir.support.BasePersonAttributeDao; import org.apereo.services.persondir.support.NamedPersonImpl; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * A {@link IPersonAttributeDao} implementation that can use a Shibboleth * {@link net.shibboleth.idp.attribute.resolver.AttributeResolver} to resolve attributes. * * @author Jonathan Johnson * @since 5.0.0 */ public class ShibbolethPersonAttributeDao extends BasePersonAttributeDao { private final AttributeResolver attributeResolver; public ShibbolethPersonAttributeDao(final AttributeResolver attributeResolver) { this.attributeResolver = attributeResolver; } @Override public IPersonAttributes getPerson(final String uid) { final AttributeResolutionContext attributeResolutionContext = new AttributeResolutionContext(); attributeResolutionContext.setPrincipal(uid); try { this.attributeResolver.resolveAttributes(attributeResolutionContext); final Map<String, List<Object>> attributes = attributeResolutionContext.getResolvedIdPAttributes() .entrySet() .stream() .collect(Collectors.toMap( Map.Entry::getKey, p -> p.getValue().getValues().stream().map(IdPAttributeValue::getValue).collect(Collectors.toList())) ); return new NamedPersonImpl(uid, attributes); } catch (final ResolutionException e) { throw Throwables.propagate(e); } } @Override public Set<IPersonAttributes> getPeople(final Map<String, Object> query) { return Collections.emptySet(); } @Override public Set<IPersonAttributes> getPeopleWithMultivaluedAttributes(final Map<String, List<Object>> query) { return Collections.emptySet(); } @Override public Set<String> getPossibleUserAttributeNames() { return Collections.emptySet(); } @Override public Set<String> getAvailableQueryAttributes() { return Collections.emptySet(); } }