/* * 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.ProtocolParam; import net.shibboleth.idp.cas.protocol.SamlParam; import net.shibboleth.idp.cas.protocol.ServiceTicketRequest; import net.shibboleth.idp.profile.AbstractProfileAction; import net.shibboleth.idp.profile.ActionSupport; import org.opensaml.messaging.context.MessageContext; import org.opensaml.profile.context.ProfileRequestContext; import org.springframework.webflow.core.collection.ParameterMap; import org.springframework.webflow.execution.Event; import org.springframework.webflow.execution.RequestContext; /** * Initializes the CAS protocol interaction at the <code>/login</code> URI. Possible outcomes: * <ul> * <li>{@link net.shibboleth.idp.cas.flow.Events#Proceed proceed}</li> * <li>{@link net.shibboleth.idp.cas.protocol.ProtocolError#ServiceNotSpecified serviceNotSpecified}</li> * </ul> * On success places a {@link ServiceTicketRequest} object in request scope under the key * {@value FlowStateSupport#SERVICE_TICKET_REQUEST_KEY}. * * @author Marvin S. Addison */ public class InitializeLoginAction extends AbstractProfileAction<ServiceTicketRequest, Object> { @Nonnull @Override protected Event doExecute( final @Nonnull RequestContext springRequestContext, final @Nonnull ProfileRequestContext<ServiceTicketRequest, Object> profileRequestContext) { final ParameterMap params = springRequestContext.getRequestParameters(); String service = params.get(ProtocolParam.Service.id()); boolean isSaml = false; if (service == null) { service = params.get(SamlParam.TARGET.name()); if (service == null) { return ProtocolError.ServiceNotSpecified.event(this); } isSaml = true; } final ServiceTicketRequest serviceTicketRequest = new ServiceTicketRequest(service); serviceTicketRequest.setSaml(isSaml); final String renew = params.get(ProtocolParam.Renew.id()); if (renew != null) { serviceTicketRequest.setRenew(true); } // http://www.jasig.org/cas/protocol, section 2.1.1 // It is RECOMMENDED that CAS implementations ignore the "gateway" parameter if "renew" is set. final String gateway = params.get(ProtocolParam.Gateway.id()); if (gateway != null && renew == null) { serviceTicketRequest.setGateway(true); } final MessageContext<ServiceTicketRequest> messageContext = new MessageContext<>(); messageContext.setMessage(serviceTicketRequest); profileRequestContext.setInboundMessageContext(messageContext); FlowStateSupport.setServiceTicketRequest(springRequestContext, serviceTicketRequest); return ActionSupport.buildProceedEvent(this); } }