package org.cloudfoundry.identity.uaa.authentication; import org.cloudfoundry.identity.uaa.util.JsonUtils; import org.flywaydb.core.internal.util.StringUtils; import org.opensaml.saml2.metadata.provider.MetadataProviderException; import org.springframework.security.saml.context.SAMLContextProvider; import org.springframework.security.saml.context.SAMLMessageContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; public class RedirectSavingSamlContextProvider implements SAMLContextProvider { private final SAMLContextProvider contextProviderDelegate; public RedirectSavingSamlContextProvider(SAMLContextProvider contextProviderDelegate) { this.contextProviderDelegate = contextProviderDelegate; } @Override public SAMLMessageContext getLocalEntity(HttpServletRequest request, HttpServletResponse response) throws MetadataProviderException { SAMLMessageContext context = contextProviderDelegate.getLocalEntity(request, response); return setRelayState(request, context); } @Override public SAMLMessageContext getLocalAndPeerEntity(HttpServletRequest request, HttpServletResponse response) throws MetadataProviderException { SAMLMessageContext context = contextProviderDelegate.getLocalAndPeerEntity(request, response); return setRelayState(request, context); } private static SAMLMessageContext setRelayState(HttpServletRequest request, SAMLMessageContext context) { Map<String, String> params = new HashMap<>(); String redirectUri = request.getParameter("redirect"); if(StringUtils.hasText(redirectUri)) { params.put("redirect", redirectUri); } String clientId = request.getParameter("client_id"); if(StringUtils.hasText(clientId)) { params.put("client_id", clientId); } context.setRelayState(JsonUtils.writeValueAsString(params)); return context; } }