// Copyright (C) 2002 IAIK // http://jce.iaik.tugraz.at // // Copyright (C) 2007 Stiftung Secure Information and // Communication Technologies SIC // http://www.sic.st // // All rights reserved. // // This source is provided for inspection purposes and recompilation only, // unless specified differently in a contract with IAIK. This source has to // be kept in strict confidence and must not be disclosed to any third party // under any circumstances. Redistribution in source and binary forms, with // or without modification, are permitted in any case! // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. package at.gv.egovernment.moa.id.config.proxy; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.w3c.dom.traversal.NodeIterator; import at.gv.egovernment.moa.id.config.ConfigurationBuilder; import at.gv.egovernment.moa.id.config.ConfigurationException; import at.gv.egovernment.moa.id.config.ConnectionParameter; import at.gv.egovernment.moa.logging.Logger; import at.gv.egovernment.moa.util.DOMUtils; import at.gv.egovernment.moa.util.FileUtils; import at.gv.egovernment.moa.util.XPathUtils; /** * Builds the configuration for MOA-ID Proxy. * */ public class ProxyConfigurationBuilder extends ConfigurationBuilder { /** * Default online application configuration file name * (used when /OnlineApplication/ProxyComponent@configFileURL is null). */ public static final String DEFAULT_OA_CONFIG_FILENAME = "MOAConfig.xml"; /** an XPATH-Expression */ private static final String PROXY_AUTH_XPATH = ROOT + CONF + "ProxyComponent/" + CONF + "AuthComponent"; /** an XPATH-Expression */ protected static final String ROOTOA = "/" + CONF + "Configuration/"; /** an XPATH-Expression */ private static final String OA_PROXY_COMPONENT_XPATH = CONF + "ProxyComponent"; /** an XPATH-Expression */ private static final String OA_PROXY_COMPONENT_ABSOLUTE_XPATH = ROOT + CONF + "OnlineApplication/" + CONF + "ProxyComponent"; /** an XPATH-Expression */ private static final String OA_PROXY_URL_XPATH = CONF + "ProxyComponent/@configFileURL"; /** an XPATH-Expression */ private static final String OA_PROXY_SESSION_TIMEOUT_XPATH = CONF + "ProxyComponent/@sessionTimeOut"; /** an XPATH-Expression */ private static final String OA_PROXY_LOGIN_PARA_XPATH = CONF + "ProxyComponent/@loginParameterResolverImpl"; /** an XPATH-Expression */ private static final String OA_PROXY_LOGIN_PARA_CONF_XPATH = CONF + "ProxyComponent/@loginParameterResolverConfiguration"; /** an XPATH-Expression */ private static final String OA_PROXY_CONNECTION_BUILDER_XPATH = CONF + "ProxyComponent/@connectionBuilderImpl"; /** an XPATH-Expression */ protected static final String OACONF_LOGIN_TYPE_XPATH = ROOTOA + CONF + "LoginType"; /** an XPATH-Expression */ protected static final String OACONF_BINDING_TYPE_XPATH = ROOTOA + CONF + "Binding"; /** an XPATH-Expression */ protected static final String OACONF_PARAM_AUTH_PARAMETER_XPATH = ROOTOA + CONF + "ParamAuth/" + CONF + "Parameter"; /** an XPATH-Expression */ protected static final String OACONF_USER_ID_XPATH = ROOTOA + CONF + "BasicAuth/" + CONF + "UserID"; /** an XPATH-Expression */ protected static final String OACONF_PASSWORD_XPATH = ROOTOA + CONF + "BasicAuth/" + CONF + "Password"; /** an XPATH-Expression */ protected static final String OACONF_HEADER_AUTH_HEADER_XPATH = ROOTOA + CONF + "HeaderAuth/" + CONF + "Header"; /** * Creates a new MOAConfigurationProvider. * * @param configElem The root element of the MOA-ID configuration. */ public ProxyConfigurationBuilder(Element configElem, String rootConfigDir) { super(configElem, rootConfigDir); } /** * Method buildOAConfiguration. * * Build an {@link OAConfiguration} Object from the given configuration DOM element * * @param root * @return OAConfiguration * @throws ConfigurationException */ public OAConfiguration buildOAConfiguration(Element root) throws ConfigurationException{ OAConfiguration oaConfiguration = new OAConfiguration(); //The LoginType hast to be "stateless" or "stateful" to be valid oaConfiguration.setLoginType( XPathUtils.getElementValue(root, OACONF_LOGIN_TYPE_XPATH, null)); oaConfiguration.setBinding( XPathUtils.getElementValue(root, OACONF_BINDING_TYPE_XPATH, OAConfiguration.BINDUNG_FULL)); //Try to build the Parameter Auth Parameters NodeIterator paramAuthIter = XPathUtils.selectNodeIterator( root, OACONF_PARAM_AUTH_PARAMETER_XPATH); Element paramAuthElem; HashMap paramAuthMap = new HashMap(); while ((paramAuthElem = (Element) paramAuthIter.nextNode()) != null) { String name = XPathUtils.getAttributeValue(paramAuthElem, "@Name", null); String value = XPathUtils.getAttributeValue(paramAuthElem, "@Value", null); if (paramAuthMap.containsKey(name)) throw new ConfigurationException("config.06", new Object[]{"Doppelter Wert für Parameter per HeaderAuthentication"}); paramAuthMap.put(name, value); } oaConfiguration.setParamAuthMapping(paramAuthMap); // Try to build the BasicAuthParameters oaConfiguration.setBasicAuthUserIDMapping( XPathUtils.getElementValue(root, OACONF_USER_ID_XPATH, null)); oaConfiguration.setBasicAuthPasswordMapping( XPathUtils.getElementValue(root, OACONF_PASSWORD_XPATH, null)); //Try to build the Parameter Auth Parameters NodeIterator headerAuthIter = XPathUtils.selectNodeIterator(root,OACONF_HEADER_AUTH_HEADER_XPATH); Element headerAuthElem; HashMap headerAuthMap = new HashMap(); while ((headerAuthElem = (Element) headerAuthIter.nextNode()) != null) { String name = XPathUtils.getAttributeValue(headerAuthElem, "@Name", null); String value = XPathUtils.getAttributeValue(headerAuthElem, "@Value", null); // Contains Key (Neue Config-Exception: doppelte werte) if (headerAuthMap.containsKey(name)) throw new ConfigurationException("config.06", new Object[]{"Doppelter Wert für Parameter per HeaderAuthentication"}); headerAuthMap.put(name, value); } oaConfiguration.setHeaderAuthMapping(headerAuthMap); if (paramAuthMap.size() == 0) { if (oaConfiguration.getBasicAuthUserIDMapping() == null) { oaConfiguration.setAuthType(OAConfiguration.HEADER_AUTH); } else oaConfiguration.setAuthType(OAConfiguration.BASIC_AUTH); } else oaConfiguration.setAuthType(OAConfiguration.PARAM_AUTH); return oaConfiguration; } /** * Build an array of OnlineApplication Parameter Beans containing information * about the proxy component * @return An OAProxyParameter array containing beans * with all relevant information for the proxy component of the online * application */ public OAProxyParameter[] buildOnlineApplicationProxyParameters() throws ConfigurationException{ List oA_list = new ArrayList(); NodeList OAIter = XPathUtils.selectNodeList(configElem_, OA_XPATH); for (int i = 0; i < OAIter.getLength(); i++) { Element oAElem = (Element) OAIter.item(i); Element proxyComponentElem = (Element) XPathUtils.selectSingleNode(oAElem,OA_PROXY_COMPONENT_XPATH); if (proxyComponentElem != null) { OAProxyParameter oap = new OAProxyParameter(); oap.setPublicURLPrefix(oAElem.getAttribute("publicURLPrefix")); oap.setOaType(oAElem.getAttribute("type")); oap.setConfigFileURL(XPathUtils.getAttributeValue(oAElem, OA_PROXY_URL_XPATH, null)); oap.setConfigFileURL(FileUtils.makeAbsoluteURL(oap.getConfigFileURL(), rootConfigFileDir_)); // default session time out: 3600 sec = 1 h oap.setSessionTimeOut(new Integer(XPathUtils.getAttributeValue(oAElem,OA_PROXY_SESSION_TIMEOUT_XPATH,"3600")).intValue()); oap.setLoginParameterResolverImpl(XPathUtils.getAttributeValue(oAElem, OA_PROXY_LOGIN_PARA_XPATH, null)); oap.setLoginParameterResolverConfiguration(XPathUtils.getAttributeValue(oAElem, OA_PROXY_LOGIN_PARA_CONF_XPATH, null)); oap.setLoginParameterResolverConfiguration(FileUtils.makeAbsoluteURL(oap.getLoginParameterResolverConfiguration(), rootConfigFileDir_)); oap.setConnectionBuilderImpl(XPathUtils.getAttributeValue(oAElem,OA_PROXY_CONNECTION_BUILDER_XPATH, null)); ConnectionParameter conPara = buildConnectionParameter(proxyComponentElem); oap.setConnectionParameter(conPara); OAConfiguration oaConf = buildOAConfiguration(getOAConfigElement(oap)); oap.setOaConfiguration(oaConf); oA_list.add(oap); } } OAProxyParameter[] result = new OAProxyParameter[oA_list.size()]; oA_list.toArray(result); return result; } /** * Reads the configuration file of the online application, and creates a DOM tree from it. * If /OnlineApplication/ProxyComponent@configFileURL is not given, * uses default configuration file location. * * @param oap configuration data of online application, meant for use by MOA-ID-PROXY * @return Element DOM tree root element * @throws ConfigurationException on any exception thrown */ private Element getOAConfigElement(OAProxyParameter oap) throws ConfigurationException { try { String configFileURL = oap.getConfigFileURL(); if (configFileURL == null) { // use default config file URL, when config file URL is not given configFileURL = oap.getConnectionParameter().getUrl(); if (configFileURL.charAt(configFileURL.length() - 1) != '/') configFileURL += "/"; configFileURL += DEFAULT_OA_CONFIG_FILENAME; } Logger.info("Loading MOA-OA configuration " + configFileURL); Element configElem = DOMUtils.parseXmlValidating( new ByteArrayInputStream(FileUtils.readURL(configFileURL))); return configElem; } catch (Throwable t) { throw new ConfigurationException("config.03", new Object[] {"OAConfiguration"} , t); } } /** * Build a bean containing all information about the ProxyComponent * @return The ConnectionParameter for the Proxy Component */ public ConnectionParameter buildAuthComponentConnectionParameter() { Element connectionParameter = (Element) XPathUtils.selectSingleNode(configElem_, PROXY_AUTH_XPATH); if (connectionParameter==null) return null; return buildConnectionParameter(connectionParameter); } }