/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.picketlink.test.identity.federation.bindings.authenticators; import java.net.URL; import java.security.Principal; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.apache.catalina.LifecycleException; import org.apache.catalina.realm.GenericPrincipal; import org.picketlink.identity.federation.bindings.tomcat.idp.IDPWebBrowserSSOValve; import org.picketlink.identity.federation.web.constants.GeneralConstants; import org.picketlink.identity.federation.web.util.RedirectBindingUtil; import org.picketlink.test.identity.federation.bindings.mock.MockCatalinaContext; import org.picketlink.test.identity.federation.bindings.mock.MockCatalinaContextClassLoader; import org.picketlink.test.identity.federation.bindings.mock.MockCatalinaRealm; import org.picketlink.test.identity.federation.bindings.mock.MockCatalinaRequest; import org.picketlink.test.identity.federation.bindings.mock.MockCatalinaSession; /** * @author <a href="mailto:psilva@redhat.com">Pedro Silva</a> * */ public class AuthenticatorTestUtils { public static IDPWebBrowserSSOValve createIdentityProvider(String baseClassLoaderPath) { Thread.currentThread().setContextClassLoader(createContextClassLoader(baseClassLoaderPath)); IDPWebBrowserSSOValve idpWebBrowserSSOValve = new IDPWebBrowserSSOValve(); MockCatalinaContext catalinaContext = new MockCatalinaContext(); idpWebBrowserSSOValve.setContainer(catalinaContext); try { idpWebBrowserSSOValve.start(); } catch (LifecycleException e) { e.printStackTrace(); } return idpWebBrowserSSOValve; } public static MockCatalinaContextClassLoader createContextClassLoader(String resource) { URL[] urls = new URL[] { Thread.currentThread().getContextClassLoader().getResource(resource) }; MockCatalinaContextClassLoader mcl = new MockCatalinaContextClassLoader(urls); mcl.setDelegate(Thread.currentThread().getContextClassLoader()); mcl.setProfile(resource); return mcl; } public static MockCatalinaRequest createRequest(String userAddress, boolean withUserPrincipal) { MockCatalinaRequest request = new MockCatalinaRequest(); request = new MockCatalinaRequest(); request.setMethod("GET"); request.setRemoteAddr(userAddress); request.setSession(new MockCatalinaSession()); request.setContext(new MockCatalinaContext()); if (withUserPrincipal) { request.setUserPrincipal(createPrincipal()); } return request; } public static GenericPrincipal createPrincipal() { MockCatalinaRealm realm = new MockCatalinaRealm("user", "user", new Principal() { public String getName() { return "user"; } }); List<String> roles = new ArrayList<String>(); roles.add("manager"); roles.add("employee"); List<String> rolesList = new ArrayList<String>(); rolesList.add("manager"); return new GenericPrincipal(realm, "user", "user", roles); } public static void populateParametersWithQueryString(String queryString, MockCatalinaRequest request) { String samlParameter = null; String samlParameterValue = null; if (queryString.contains(GeneralConstants.SAML_REQUEST_KEY + "=")) { samlParameter = GeneralConstants.SAML_REQUEST_KEY; samlParameterValue = getSAMLRequest(queryString); } else { samlParameter = GeneralConstants.SAML_RESPONSE_KEY; samlParameterValue = getSAMLResponse(queryString); } try { request.setParameter(samlParameter, RedirectBindingUtil.urlDecode(samlParameterValue)); boolean hasRelayState = queryString.indexOf("&RelayState") != -1; if (hasRelayState) { request.setParameter(GeneralConstants.RELAY_STATE, RedirectBindingUtil.urlDecode(getSAMLRelayState(queryString))); } request.setParameter(GeneralConstants.SAML_SIG_ALG_REQUEST_KEY, RedirectBindingUtil.urlDecode(getSAMLSigAlg(queryString))); request.setParameter(GeneralConstants.SAML_SIGNATURE_REQUEST_KEY, RedirectBindingUtil.urlDecode(getSAMLSignature(queryString))); request.setQueryString(queryString.toString()); } catch (Exception e) { Assert.fail("Erro while populating request with SAML parameters."); } } private static final String getSAMLResponse(String queryString) { int endIndex = queryString.indexOf("&SigAlg="); if (queryString.contains("&RelayState=")) { endIndex = queryString.indexOf("&RelayState="); } // no signature info if (endIndex == -1) { endIndex = queryString.length(); } return queryString.substring(queryString.indexOf(GeneralConstants.SAML_RESPONSE_KEY + "=") + (GeneralConstants.SAML_RESPONSE_KEY + "=").length(), endIndex); } private static final String getSAMLSignature(String queryString) { return queryString.substring(queryString.indexOf("&Signature=") + "&Signature=".length()); } private static final String getSAMLRelayState(String queryString) { return queryString.substring(queryString.indexOf("&RelayState=") + "&RelayState=".length(), queryString.lastIndexOf("&SigAlg=")); } private static final String getSAMLSigAlg(String queryString) { int indexOfSigAlg = queryString.indexOf("&SigAlg="); // no signature info if (indexOfSigAlg == -1) { return ""; } return queryString.substring(indexOfSigAlg + "&SigAlg=".length(), queryString.lastIndexOf("&Signature=")); } private static final String getSAMLRequest(String queryString) { int endIndex = queryString.indexOf("&SigAlg="); if (queryString.contains("&RelayState=")) { endIndex = queryString.indexOf("&RelayState="); } return queryString.substring(queryString.indexOf(GeneralConstants.SAML_REQUEST_KEY + "=") + (GeneralConstants.SAML_REQUEST_KEY + "=").length(), endIndex); } }