package org.apereo.cas.services; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import java.net.URL; import java.util.regex.Pattern; /** * A proxy policy that only allows proxying to pgt urls * that match the specified regex pattern. * @author Misagh Moayyed * @since 4.1.0 */ public class RegexMatchingRegisteredServiceProxyPolicy implements RegisteredServiceProxyPolicy { private static final long serialVersionUID = -211069319543047324L; private Pattern pattern; /** * Instantiates a new Regex matching registered service proxy policy. * Required for serialization. */ protected RegexMatchingRegisteredServiceProxyPolicy() { this.pattern = null; } /** * Init the policy with the pgt url regex pattern that * will determine the urls allowed to receive the pgt. * The matching by default is done in a case insensitive manner. * @param pgtUrlPattern the pgt url pattern */ @JsonCreator public RegexMatchingRegisteredServiceProxyPolicy(@JsonProperty("pattern") final String pgtUrlPattern) { this.pattern = Pattern.compile(pgtUrlPattern, Pattern.CASE_INSENSITIVE); } public String getPattern() { return this.pattern.toString(); } @JsonIgnore @Override public boolean isAllowedToProxy() { return true; } @Override public int hashCode() { return new HashCodeBuilder(13, 117).append(this.pattern.pattern()).toHashCode(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final RegexMatchingRegisteredServiceProxyPolicy rhs = (RegexMatchingRegisteredServiceProxyPolicy) obj; return new EqualsBuilder().append(this.pattern.pattern(), rhs.pattern.pattern()).isEquals(); } @Override public String toString() { return new ToStringBuilder(this).append(this.pattern.pattern()).toString(); } @Override public boolean isAllowedProxyCallbackUrl(final URL pgtUrl) { return this.pattern.matcher(pgtUrl.toExternalForm()).find(); } }