package org.apereo.cas.services; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apereo.cas.authentication.principal.Principal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * Return only the collection of allowed attributes out of what's resolved * for the principal. * * @author Misagh Moayyed * @since 4.1.0 */ public class ReturnAllowedAttributeReleasePolicy extends AbstractRegisteredServiceAttributeReleasePolicy { private static final long serialVersionUID = -5771481877391140569L; private static final Logger LOGGER = LoggerFactory.getLogger(ReturnAllowedAttributeReleasePolicy.class); private List<String> allowedAttributes; /** * Instantiates a new Return allowed attribute release policy. */ public ReturnAllowedAttributeReleasePolicy() { this(new ArrayList<>()); } /** * Instantiates a new Return allowed attribute release policy. * * @param allowedAttributes the allowed attributes */ public ReturnAllowedAttributeReleasePolicy(final List<String> allowedAttributes) { setAllowedAttributes(allowedAttributes); } public void setAllowedAttributes(final List<String> allowed) { this.allowedAttributes = allowed; } public List<String> getAllowedAttributes() { return this.allowedAttributes; } @Override protected Map<String, Object> getAttributesInternal(final Principal principal, final Map<String, Object> attrs, final RegisteredService service) { return authorizeReleaseOfAllowedAttributes(attrs); } /** * Authorize release of allowed attributes map. * * @param attrs the attrs * @return the map */ protected Map<String, Object> authorizeReleaseOfAllowedAttributes(final Map<String, Object> attrs) { final Map<String, Object> resolvedAttributes = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); resolvedAttributes.putAll(attrs); final Map<String, Object> attributesToRelease = new HashMap<>(resolvedAttributes.size()); getAllowedAttributes().stream() .map(attr -> new Object[]{attr, resolvedAttributes.get(attr)}).filter(pair -> pair[1] != null) .forEach(attribute -> { LOGGER.debug("Found attribute [{}] in the list of allowed attributes", attribute[0]); attributesToRelease.put((String) attribute[0], attribute[1]); }); return attributesToRelease; } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final ReturnAllowedAttributeReleasePolicy rhs = (ReturnAllowedAttributeReleasePolicy) obj; return new EqualsBuilder() .appendSuper(super.equals(obj)) .append(getAllowedAttributes(), rhs.getAllowedAttributes()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(13, 133) .appendSuper(super.hashCode()) .append(getAllowedAttributes()) .toHashCode(); } @Override public String toString() { return new ToStringBuilder(this) .appendSuper(super.toString()) .append("allowedAttributes", getAllowedAttributes()) .toString(); } }