Author: anil.saldhana(a)jboss.com
Date: 2009-11-23 15:32:38 -0500 (Mon, 23 Nov 2009)
New Revision: 1075
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectValve.java
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectWithSignatureValve.java
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPWebBrowserSSOValve.java
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectFormAuthenticator.java
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectSignatureFormAuthenticator.java
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/process/ServiceProviderSAMLRequestProcessor.java
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/util/RedirectBindingUtil.java
Log:
JBID-225: handle the ? in redirect scenarios
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectValve.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectValve.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectValve.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -229,19 +229,25 @@
try
{
SAML2Response saml2Response = new SAML2Response();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- saml2Response.marshall(responseType, baos);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ saml2Response.marshall(responseType, baos);
- String urlEncodedResponse =
RedirectBindingUtil.deflateBase64URLEncode(baos.toByteArray());
+ String urlEncodedResponse =
RedirectBindingUtil.deflateBase64URLEncode(baos.toByteArray());
- String destination = responseType.getDestination();
- if(trace) log.trace("IDP:Destination=" + destination);
-
- if(isNotNull(relayState))
- relayState = RedirectBindingUtil.urlEncode(relayState);
-
- String finalDest = destination + this.getDestination(urlEncodedResponse,
relayState);
- HTTPRedirectUtil.sendRedirectForResponder(finalDest, response);
+ String destinationURL = responseType.getDestination();
+ if(trace) log.trace("IDP:Destination=" + destinationURL);
+
+ if(isNotNull(relayState))
+ relayState = RedirectBindingUtil.urlEncode(relayState);
+
+ StringBuilder finalDest = new StringBuilder(destinationURL);
+ if(destinationURL.contains("?"))
+ finalDest.append("&");
+ else
+ finalDest.append("?");
+
+ finalDest.append( getDestinationQueryString(urlEncodedResponse, relayState) );
+ HTTPRedirectUtil.sendRedirectForResponder(finalDest.toString(), response);
}
catch (JAXBException e)
{
@@ -264,10 +270,10 @@
* @param urlEncodedRelayState
* @return
*/
- protected String getDestination(String urlEncodedResponse, String
urlEncodedRelayState)
+ protected String getDestinationQueryString(String urlEncodedResponse, String
urlEncodedRelayState)
{
StringBuilder sb = new StringBuilder();
- sb.append("?SAMLResponse=").append(urlEncodedResponse);
+ sb.append("SAMLResponse=").append(urlEncodedResponse);
if(isNotNull(urlEncodedRelayState))
sb.append("&RelayState=").append(urlEncodedRelayState);
return sb.toString();
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectWithSignatureValve.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectWithSignatureValve.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPRedirectWithSignatureValve.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -149,16 +149,14 @@
}
@Override
- protected String getDestination(String urlEncodedResponse, String
urlEncodedRelayState)
+ protected String getDestinationQueryString(String urlEncodedResponse, String
urlEncodedRelayState)
{
try
{
//Get the signing key
PrivateKey signingKey = keyManager.getSigningKey();
- StringBuffer sb = new StringBuffer();
String url =
RedirectBindingSignatureUtil.getSAMLResponseURLWithSignature(urlEncodedResponse,
urlEncodedRelayState, signingKey);
- sb.append("?").append(url);
- return sb.toString();
+ return url;
}
catch(Exception e)
{
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPWebBrowserSSOValve.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPWebBrowserSSOValve.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/idp/IDPWebBrowserSSOValve.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -804,7 +804,7 @@
// Validate and update our current component state
if (started)
throw new LifecycleException
- ("IDPRedirectValve already Started");
+ ("IDPWebBrowserSSOValve already Started");
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
@@ -927,7 +927,7 @@
// Validate and update our current component state
if (!started)
throw new LifecycleException
- ("IDPRedirectValve NotStarted");
+ ("IDPWebBrowserSSOValve NotStarted");
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
}
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectFormAuthenticator.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectFormAuthenticator.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectFormAuthenticator.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -64,6 +64,7 @@
import org.picketlink.identity.federation.web.util.HTTPRedirectUtil;
import org.picketlink.identity.federation.web.util.RedirectBindingUtil;
import org.picketlink.identity.federation.web.util.ServerDetector;
+import
org.picketlink.identity.federation.web.util.RedirectBindingUtil.RedirectBindingUtilDestHolder;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
@@ -157,10 +158,17 @@
if(trace)
log.trace("SAML Document=" + samlMsg);
+ boolean areWeSendingRequest = saml2HandlerResponse.getSendRequest();
+
String base64Request =
RedirectBindingUtil.deflateBase64URLEncode(samlMsg.getBytes("UTF-8"));
- String destinationURL = destination +
- getDestination(base64Request, relayState,
saml2HandlerResponse.getSendRequest());
+ String destinationQuery = getDestinationQueryString(base64Request,
relayState, areWeSendingRequest);
+
+ RedirectBindingUtilDestHolder holder = new
RedirectBindingUtilDestHolder();
+
holder.setDestination(destination).setDestinationQueryString(destinationQuery);
+
+ String destinationURL = RedirectBindingUtil.getDestinationURL(holder);
+
if(trace)
{
log.trace("URL used for sending:" + destinationURL);
@@ -211,11 +219,17 @@
if(destination != null &&
samlResponseDocument != null)
{
+ boolean areWeSendingRequest = saml2HandlerResponse.getSendRequest();
String samlMsg = DocumentUtil.getDocumentAsString(samlResponseDocument);
- String base64Request =
RedirectBindingUtil.deflateBase64URLEncode(samlMsg.getBytes("UTF-8"));
- String destinationURL = destination +
- getDestination(base64Request, relayState,
saml2HandlerResponse.getSendRequest());
+ String base64Request =
RedirectBindingUtil.deflateBase64URLEncode(samlMsg.getBytes("UTF-8"));
+
+ String destinationQuery = getDestinationQueryString(base64Request,
relayState, areWeSendingRequest);
+
+ RedirectBindingUtilDestHolder holder = new
RedirectBindingUtilDestHolder();
+
holder.setDestination(destination).setDestinationQueryString(destinationQuery);
+
+ String destinationURL = RedirectBindingUtil.getDestinationURL(holder);
HTTPRedirectUtil.sendRedirectForRequestor(destinationURL, response);
}
@@ -316,24 +330,20 @@
saml2Request.marshall(authnRequest, baos);
String base64Request =
RedirectBindingUtil.deflateBase64URLEncode(baos.toByteArray());
- String destination = authnRequest.getDestination() + getDestination(base64Request,
relayState, true);
- if(trace)
- log.trace("Sending to destination="+destination);
-
- return destination;
+ String destination = authnRequest.getDestination();
+
+ String destinationQueryString = getDestinationQueryString(base64Request,
relayState, true);
+
+ RedirectBindingUtilDestHolder holder = new RedirectBindingUtilDestHolder();
+
holder.setDestinationQueryString(destinationQueryString).setDestination(destination);
+ return RedirectBindingUtil.getDestinationURL(holder);
}
- protected String getDestination(String urlEncodedRequest, String
urlEncodedRelayState,
+ protected String getDestinationQueryString(String urlEncodedRequest, String
urlEncodedRelayState,
boolean sendRequest)
{
- StringBuilder sb = new StringBuilder();
- if(sendRequest)
- sb.append("?SAMLRequest=").append(urlEncodedRequest);
- else
- sb.append("?SAMLResponse=").append(urlEncodedRequest);
- if(isNotNull(urlEncodedRelayState))
- sb.append("&RelayState=").append(urlEncodedRelayState);
- return sb.toString();
+ return RedirectBindingUtil.getDestinationQueryString(urlEncodedRequest,
+ urlEncodedRelayState, sendRequest);
}
protected void isTrusted(String issuer) throws IssuerNotTrustedException
@@ -390,4 +400,6 @@
{
throw new RuntimeException("This authenticator does not handle
encryption");
}
+
+
}
\ No newline at end of file
Modified:
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectSignatureFormAuthenticator.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectSignatureFormAuthenticator.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-bindings/src/main/java/org/picketlink/identity/federation/bindings/tomcat/sp/SPRedirectSignatureFormAuthenticator.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -156,16 +156,14 @@
}
@Override
- protected String getDestination(String urlEncodedRequest, String urlEncodedRelayState,
boolean sendRequest)
+ protected String getDestinationQueryString(String urlEncodedRequest, String
urlEncodedRelayState, boolean sendRequest)
{
try
{
//Get the signing key
- PrivateKey signingKey = keyManager.getSigningKey();
- StringBuffer sb = new StringBuffer();
+ PrivateKey signingKey = keyManager.getSigningKey();
String url =
RedirectBindingSignatureUtil.getSAMLRequestURLWithSignature(urlEncodedRequest,
urlEncodedRelayState, signingKey);
- sb.append("?").append(url);
- return sb.toString();
+ return url;
}
catch(Exception e)
{
Modified:
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/process/ServiceProviderSAMLRequestProcessor.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/process/ServiceProviderSAMLRequestProcessor.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/process/ServiceProviderSAMLRequestProcessor.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -21,8 +21,6 @@
*/
package org.picketlink.identity.federation.web.process;
-import static org.picketlink.identity.federation.core.util.StringUtil.isNotNull;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
@@ -47,6 +45,7 @@
import org.picketlink.identity.federation.web.util.HTTPRedirectUtil;
import org.picketlink.identity.federation.web.util.PostBindingUtil;
import org.picketlink.identity.federation.web.util.RedirectBindingUtil;
+import
org.picketlink.identity.federation.web.util.RedirectBindingUtil.RedirectBindingUtilDestHolder;
import org.w3c.dom.Document;
/**
@@ -128,11 +127,17 @@
}
else
{
+ boolean areWeSendingRequest = saml2HandlerResponse.getSendRequest();
String samlMsg = DocumentUtil.getDocumentAsString(samlResponseDocument);
String base64Request =
RedirectBindingUtil.deflateBase64URLEncode(samlMsg.getBytes("UTF-8"));
- String destinationURL = destination +
- getDestination(base64Request, relayState,
saml2HandlerResponse.getSendRequest());
+
+ String destinationQuery =
RedirectBindingUtil.getDestinationQueryString(base64Request, relayState,
areWeSendingRequest);
+
+ RedirectBindingUtilDestHolder holder = new RedirectBindingUtilDestHolder();
+
holder.setDestination(destination).setDestinationQueryString(destinationQuery);
+
+ String destinationURL = RedirectBindingUtil.getDestinationURL(holder);
HTTPRedirectUtil.sendRedirectForRequestor(destinationURL,
httpContext.getResponse());
}
@@ -170,17 +175,4 @@
PostBindingUtil.sendPost(new DestinationInfoHolder(destination, samlMessage,
relayState),
response, willSendRequest);
}
-
- private String getDestination(String urlEncodedRequest, String urlEncodedRelayState,
- boolean sendRequest)
- {
- StringBuilder sb = new StringBuilder();
- if(sendRequest)
- sb.append("?SAMLRequest=").append(urlEncodedRequest);
- else
- sb.append("?SAMLResponse=").append(urlEncodedRequest);
- if(isNotNull(urlEncodedRelayState))
- sb.append("&RelayState=").append(urlEncodedRelayState);
- return sb.toString();
- }
}
\ No newline at end of file
Modified:
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/util/RedirectBindingUtil.java
===================================================================
---
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/util/RedirectBindingUtil.java 2009-11-23
19:28:18 UTC (rev 1074)
+++
migration/picketlink/federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/util/RedirectBindingUtil.java 2009-11-23
20:32:38 UTC (rev 1075)
@@ -21,8 +21,11 @@
*/
package org.picketlink.identity.federation.web.util;
+import static org.picketlink.identity.federation.core.util.StringUtil.isNotNull;
+
import java.io.IOException;
import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
@@ -139,4 +142,69 @@
byte[] base64decodedMsg = Base64.decode(encodedString);
return DeflateUtil.decode(base64decodedMsg);
}
+
+ /**
+ * Get the Query String for the destination url
+ * @param urlEncodedRequest
+ * @param urlEncodedRelayState
+ * @param sendRequest either going to be saml request or response
+ * @return
+ */
+ public static String getDestinationQueryString(String urlEncodedRequest, String
urlEncodedRelayState,
+ boolean sendRequest)
+ {
+ StringBuilder sb = new StringBuilder();
+ if(sendRequest)
+ sb.append("SAMLRequest=").append(urlEncodedRequest);
+ else
+ sb.append("SAMLResponse=").append(urlEncodedRequest);
+ if(isNotNull(urlEncodedRelayState))
+ sb.append("&RelayState=").append(urlEncodedRelayState);
+ return sb.toString();
+ }
+
+ /**
+ * Get the destination url
+ * @param holder
+ * @return
+ * @throws UnsupportedEncodingException
+ * @throws IOException
+ */
+ public static String getDestinationURL(RedirectBindingUtilDestHolder holder) throws
UnsupportedEncodingException, IOException
+ {
+ String destination = holder.destination;
+ StringBuilder destinationURL = new StringBuilder(destination);
+
+ if(destination.contains("?"))
+ destinationURL.append("&");
+ else
+ destinationURL.append("?");
+
+ destinationURL.append( holder.destinationQueryString);
+
+ return destinationURL.toString();
+ }
+
+ /**
+ * A Destination holder that holds
+ * the destination host url and the destination query
+ * string
+ */
+ public static class RedirectBindingUtilDestHolder
+ {
+ private String destination;
+ private String destinationQueryString;
+
+ public RedirectBindingUtilDestHolder setDestinationQueryString(String dest)
+ {
+ destinationQueryString = dest;
+ return this;
+ }
+
+ public RedirectBindingUtilDestHolder setDestination(String dest)
+ {
+ destination = dest;
+ return this;
+ }
+ }
}
\ No newline at end of file