package org.apereo.cas.authentication; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apereo.cas.services.RegisteredService; import java.net.MalformedURLException; import java.net.URL; /** * A credential representing an HTTP endpoint given by a URL. Authenticating the credential usually involves * contacting the endpoint via the URL and observing the resulting connection (e.g. SSL certificate) and response * (e.g. status, headers). * * @author Scott Battaglia * @author Marvin S. Addison * @since 3.0.0 */ public class HttpBasedServiceCredential extends AbstractCredential { /** Unique Serializable ID. */ private static final long serialVersionUID = 1492607216336354503L; /** The callbackURL to check that identifies the application. */ private URL callbackUrl; /** String form of callbackUrl. */ private String callbackUrlAsString; /** The registered service associated with this callback. **/ private RegisteredService service; /** * Empty constructor used by Kryo for de-serialization. */ protected HttpBasedServiceCredential() { this.callbackUrl = null; this.callbackUrlAsString = null; this.service = null; } /** * Creates a new instance for an HTTP endpoint located at the given URL. * * @param callbackUrl Non-null URL that will be contacted to validate the credential. * @param service The registered service associated with this callback. */ public HttpBasedServiceCredential(final URL callbackUrl, final RegisteredService service) { this.callbackUrl = callbackUrl; this.callbackUrlAsString = callbackUrl.toExternalForm(); this.service = service; } @JsonCreator public HttpBasedServiceCredential(@JsonProperty("callbackUrl") final String callbackUrl, @JsonProperty("service") final RegisteredService service) throws MalformedURLException { final URL url = new URL(callbackUrl); this.callbackUrl = url; this.callbackUrlAsString = url.toExternalForm(); this.service = service; } @JsonIgnore @Override public String getId() { return this.callbackUrlAsString; } /** * @return Returns the callbackUrl. */ public URL getCallbackUrl() { return this.callbackUrl; } /** * Gets service associated with credentials. * * @return the service */ public RegisteredService getService() { return this.service; } @Override public int hashCode() { final HashCodeBuilder bldr = new HashCodeBuilder(13, 133); return bldr.append(this.callbackUrlAsString) .append(this.service) .toHashCode(); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final HttpBasedServiceCredential other = (HttpBasedServiceCredential) obj; if (this.callbackUrlAsString == null) { if (other.callbackUrlAsString != null) { return false; } } else if (!this.callbackUrlAsString.equals(other.callbackUrlAsString)) { return false; } return this.service.equals(other.getService()); } }