package org.apereo.cas.ticket.support;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apereo.cas.authentication.RememberMeCredential;
import org.apereo.cas.ticket.ExpirationPolicy;
import org.apereo.cas.ticket.TicketState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
/**
* Delegates to different expiration policies depending on whether remember me
* is true or not.
*
* @author Scott Battaglia
* @since 3.2.1
*/
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY)
public class RememberMeDelegatingExpirationPolicy extends AbstractCasExpirationPolicy {
/**
* Serialization support.
*/
private static final long serialVersionUID = -2735975347698196127L;
/**
* The Logger instance for this class. Using a transient instance field for the Logger doesn't work, on object
* deserialization the field is null.
*/
private static final Logger LOGGER = LoggerFactory.getLogger(RememberMeDelegatingExpirationPolicy.class);
@JsonProperty
private ExpirationPolicy rememberMeExpirationPolicy;
@JsonProperty
private ExpirationPolicy sessionExpirationPolicy;
/**
* Instantiates a new Remember me delegating expiration policy.
*/
public RememberMeDelegatingExpirationPolicy() {
}
/**
* Instantiates a new Remember me delegating expiration policy.
*
* @param rememberMeExpirationPolicy the remember me expiration policy
* @param sessionExpirationPolicy the session expiration policy
*/
public RememberMeDelegatingExpirationPolicy(final ExpirationPolicy rememberMeExpirationPolicy,
final ExpirationPolicy sessionExpirationPolicy) {
this.rememberMeExpirationPolicy = rememberMeExpirationPolicy;
this.sessionExpirationPolicy = sessionExpirationPolicy;
}
@PostConstruct
private void postConstruct() {
if (this.rememberMeExpirationPolicy != null) {
LOGGER.debug("Using remember-me expiration policy of [{}]", this.rememberMeExpirationPolicy);
}
if (this.sessionExpirationPolicy != null) {
LOGGER.debug("Using session expiration policy of [{}]", this.sessionExpirationPolicy);
}
}
@Override
public boolean isExpired(final TicketState ticketState) {
if (this.rememberMeExpirationPolicy != null && this.sessionExpirationPolicy != null) {
final Boolean b = (Boolean) ticketState.getAuthentication().getAttributes().
get(RememberMeCredential.AUTHENTICATION_ATTRIBUTE_REMEMBER_ME);
if (b == null || b.equals(Boolean.FALSE)) {
LOGGER.debug("Ticket is not associated with a remember-me authentication. Invoking [{}]", this.sessionExpirationPolicy);
return this.sessionExpirationPolicy.isExpired(ticketState);
}
LOGGER.debug("Ticket is associated with a remember-me authentication. Invoking [{}]", this.rememberMeExpirationPolicy);
return this.rememberMeExpirationPolicy.isExpired(ticketState);
}
LOGGER.warn("No expiration policy settings are defined");
return false;
}
@JsonIgnore
@Override
public Long getTimeToLive() {
if (this.rememberMeExpirationPolicy != null) {
return this.rememberMeExpirationPolicy.getTimeToLive();
}
return 0L;
}
@JsonIgnore
@Override
public Long getTimeToIdle() {
if (this.rememberMeExpirationPolicy != null) {
return this.rememberMeExpirationPolicy.getTimeToIdle();
}
return 0L;
}
public void setRememberMeExpirationPolicy(final ExpirationPolicy rememberMeExpirationPolicy) {
this.rememberMeExpirationPolicy = rememberMeExpirationPolicy;
}
public void setSessionExpirationPolicy(final ExpirationPolicy sessionExpirationPolicy) {
this.sessionExpirationPolicy = sessionExpirationPolicy;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
final RememberMeDelegatingExpirationPolicy rhs = (RememberMeDelegatingExpirationPolicy) obj;
return new EqualsBuilder()
.append(this.rememberMeExpirationPolicy, rhs.rememberMeExpirationPolicy)
.append(this.sessionExpirationPolicy, rhs.sessionExpirationPolicy)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(rememberMeExpirationPolicy)
.append(sessionExpirationPolicy)
.toHashCode();
}
}