package org.apereo.cas.authentication.principal;
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 org.apereo.cas.validation.ValidationResponseType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Map;
/**
* Abstract implementation of a WebApplicationService.
*
* @author Scott Battaglia
* @since 3.1
*/
public abstract class AbstractWebApplicationService implements WebApplicationService {
private static final long serialVersionUID = 610105280927740076L;
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractWebApplicationService.class);
/**
* The id of the service.
*/
@JsonProperty
private String id;
/**
* The original url provided, used to reconstruct the redirect url.
*/
@JsonProperty
private String originalUrl;
private String artifactId;
@JsonProperty
private Principal principal;
private boolean loggedOutAlready;
private ValidationResponseType format = ValidationResponseType.XML;
/**
* Instantiates a new abstract web application service.
*
* @param id the id
* @param originalUrl the original url
* @param artifactId the artifact id
*/
protected AbstractWebApplicationService(final String id, final String originalUrl, final String artifactId) {
this.id = id;
this.originalUrl = originalUrl;
this.artifactId = artifactId;
}
@Override
public String getId() {
return this.id;
}
@Override
public String getArtifactId() {
return this.artifactId;
}
@JsonIgnore
@Override
public Map<String, Object> getAttributes() {
return Collections.emptyMap();
}
/**
* Return the original url provided (as {@code service} or {@code targetService} request parameter).
* Used to reconstruct the redirect url.
*
* @return the original url provided.
*/
@Override
public String getOriginalUrl() {
return this.originalUrl;
}
public Principal getPrincipal() {
return this.principal;
}
@Override
public void setPrincipal(final Principal principal) {
this.principal = principal;
}
@Override
public boolean matches(final Service service) {
try {
final String thisUrl = URLDecoder.decode(this.id, StandardCharsets.UTF_8.name());
final String serviceUrl = URLDecoder.decode(service.getId(), StandardCharsets.UTF_8.name());
LOGGER.trace("Decoded urls and comparing [{}] with [{}]", thisUrl, serviceUrl);
return thisUrl.equalsIgnoreCase(serviceUrl);
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
}
return false;
}
/**
* Return if the service is already logged out.
*
* @return if the service is already logged out.
*/
@Override
public boolean isLoggedOutAlready() {
return this.loggedOutAlready;
}
/**
* Set if the service is already logged out.
*
* @param loggedOutAlready if the service is already logged out.
*/
@Override
public void setLoggedOutAlready(final boolean loggedOutAlready) {
this.loggedOutAlready = loggedOutAlready;
}
@JsonIgnore
@Override
public ValidationResponseType getFormat() {
return this.format;
}
public void setFormat(final ValidationResponseType format) {
this.format = format;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
final AbstractWebApplicationService rhs = (AbstractWebApplicationService) obj;
final EqualsBuilder builder = new EqualsBuilder();
builder
.append(this.id, rhs.id)
.append(this.originalUrl, rhs.originalUrl)
.append(this.artifactId, rhs.artifactId)
.append(this.principal, rhs.principal)
.append(this.loggedOutAlready, rhs.loggedOutAlready)
.append(this.format, rhs.format);
return builder.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(id)
.append(originalUrl)
.append(artifactId)
.append(principal)
.append(loggedOutAlready)
.append(format)
.toHashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("originalUrl", originalUrl)
.append("artifactId", artifactId)
.append("principal", principal)
.append("loggedOutAlready", loggedOutAlready)
.append("format", format)
.toString();
}
}