/*
* See LICENSE for licensing and NOTICE for copyright.
*/
package net.shibboleth.idp.cas.flow;
import javax.annotation.Nonnull;
import net.shibboleth.idp.cas.protocol.ProtocolError;
import net.shibboleth.idp.cas.protocol.TicketValidationRequest;
import net.shibboleth.idp.cas.protocol.TicketValidationResponse;
import net.shibboleth.idp.cas.ticket.ServiceTicket;
import net.shibboleth.idp.cas.ticket.Ticket;
import net.shibboleth.idp.cas.ticket.TicketContext;
import net.shibboleth.idp.profile.AbstractProfileAction;
import net.shibboleth.idp.profile.ActionSupport;
import org.opensaml.profile.action.EventIds;
import org.opensaml.profile.context.ProfileRequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
/**
* Ensures that a service ticket validation request that specifies renew=true matches the renew flag on the ticket
* that is presented for validation. Possible outcomes:
* <ul>
* <li>{@link Events#Success success}</li>
* <li>{@link ProtocolError#TicketNotFromRenew ticketNotFromRenew}</li>
* <li>{@link ProtocolError#RenewIncompatibleWithProxy renewIncompatibleWithProxy}</li>
* </ul>
*
* @author Marvin S. Addison
*/
public class ValidateRenewAction extends AbstractProfileAction<TicketValidationRequest, TicketValidationResponse> {
/** Class logger. */
private final Logger log = LoggerFactory.getLogger(ValidateRenewAction.class);
@Nonnull
@Override
protected Event doExecute(
final @Nonnull RequestContext springRequestContext,
final @Nonnull ProfileRequestContext profileRequestContext) {
final TicketValidationRequest request = FlowStateSupport.getTicketValidationRequest(springRequestContext);
if (request == null) {
log.info("TicketValidationRequest not found in flow state.");
return ProtocolError.IllegalState.event(this);
}
final TicketContext ticketContext = profileRequestContext.getSubcontext(TicketContext.class);
if (ticketContext == null) {
log.info("TicketContext not found in profile request context.");
return ProtocolError.IllegalState.event(this);
}
final Ticket ticket = ticketContext.getTicket();
if (ticket instanceof ServiceTicket) {
if (request.isRenew() != ((ServiceTicket) ticket).isRenew()) {
log.debug("Renew=true requested at validation time but ticket not issued with renew=true.");
return ProtocolError.TicketNotFromRenew.event(this);
}
} else {
// Proxy ticket validation
if (request.isRenew()) {
return ProtocolError.RenewIncompatibleWithProxy.event(this);
}
}
return Events.Success.event(this);
}
}