package org.apereo.cas.support.openid.web.mvc; import org.apache.commons.lang3.StringUtils; import org.apereo.cas.support.openid.OpenIdProtocolConstants; import org.apereo.cas.web.AbstractDelegateController; import org.openid4java.message.Message; import org.openid4java.message.ParameterList; import org.openid4java.server.ServerManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.View; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * Generates an association to an openid association request. * * @author Frederic Esnault * @since 3.5 */ public class SmartOpenIdController extends AbstractDelegateController implements Serializable { private static final long serialVersionUID = -594058549445950430L; private static final Logger LOGGER = LoggerFactory.getLogger(SmartOpenIdController.class); private final ServerManager serverManager; private final View successView; public SmartOpenIdController(final ServerManager serverManager, final View successView) { this.serverManager = serverManager; this.successView = successView; } /** * Gets the association response. Determines the mode first. * If mode is set to associate, will set the response. Then * builds the response parameters next and returns. * * @param request the request * @return the association response */ public Map<String, String> getAssociationResponse(final HttpServletRequest request) { final ParameterList parameters = new ParameterList(request.getParameterMap()); final String mode = parameters.hasParameter(OpenIdProtocolConstants.OPENID_MODE) ? parameters.getParameterValue(OpenIdProtocolConstants.OPENID_MODE) : null; Message response = null; if (StringUtils.equals(mode, OpenIdProtocolConstants.ASSOCIATE)) { response = this.serverManager.associationResponse(parameters); } final Map<String, String> responseParams = new HashMap<>(); if (response != null) { responseParams.putAll(response.getParameterMap()); } return responseParams; } @Override protected ModelAndView handleRequestInternal(final HttpServletRequest request, final HttpServletResponse response) throws Exception { final Map<String, String> parameters = new HashMap<>(); parameters.putAll(getAssociationResponse(request)); return new ModelAndView(this.successView, parameters); } @Override public boolean canHandle(final HttpServletRequest request, final HttpServletResponse response) { final String openIdMode = request.getParameter(OpenIdProtocolConstants.OPENID_MODE); if (StringUtils.equals(openIdMode, OpenIdProtocolConstants.ASSOCIATE)) { LOGGER.info("Handling request. openid.mode : [{}]", openIdMode); return true; } LOGGER.info("Cannot handle request. openid.mode : [{}]", openIdMode); return false; } }