package at.gv.egovernment.moa.id.proxy; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.Iterator; import java.util.Map; import javax.net.ssl.SSLSocketFactory; import javax.servlet.http.HttpServletRequest; import at.gv.egovernment.moa.id.config.ConfigurationException; import at.gv.egovernment.moa.id.config.proxy.ProxyConfigurationProvider; import at.gv.egovernment.moa.id.util.MOAIDMessageProvider; import at.gv.egovernment.moa.logging.Logger; import at.gv.egovernment.moa.util.BoolUtils; import com.sun.net.ssl.HostnameVerifier; import com.sun.net.ssl.HttpsURLConnection; /** * Defaultimplementierung von ConnectionBuilder. * @author Paul Ivancsics * @version $Id$ */ public class DefaultConnectionBuilder implements ConnectionBuilder { /** a boolean to disable the HostnameVerification (default = false)*/ private static boolean disableHostnameVerification = false; /** * Constructor for DefaultConnectionBuilder. * @throws ConfigurationException on any config error */ public DefaultConnectionBuilder() throws ConfigurationException { disableHostnameVerification = BoolUtils.valueOf( ProxyConfigurationProvider.getInstance().getGenericConfigurationParameter( "ProxyComponent.DisableHostnameVerification")); //TODO MOA-ID BRZ undocumented feature if (disableHostnameVerification) Logger.warn("ProxyComponent.DisableHostnameVerification: " + disableHostnameVerification); } /** * @see at.gv.egovernment.moa.id.proxy.ConnectionBuilder#buildConnection */ public HttpURLConnection buildConnection( HttpServletRequest req, String publicURLPrefix, String realURLPrefix, SSLSocketFactory sslSocketFactory, Map parameters) throws IOException { String requestedURL = req.getRequestURL().toString(); // check whether requested URL starts with publicURLPrefix if (! requestedURL.startsWith(publicURLPrefix)) throw new IOException(MOAIDMessageProvider.getInstance().getMessage( "proxy.01", new Object[] {requestedURL, publicURLPrefix})); // in case of GET request, append query string to requested URL; // otherwise, HttpURLConnection would perform a POST request if ("get".equalsIgnoreCase(req.getMethod()) && ! parameters.isEmpty()) { requestedURL = appendQueryString(requestedURL, parameters); } // build real URL in online application String realURLString = realURLPrefix + requestedURL.substring(publicURLPrefix.length()); URL url = new URL(realURLString); Logger.debug("OA Request: " + req.getMethod() + " " + url.toString()); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(req.getMethod()); conn.setDoInput(true); conn.setDoOutput(true); //conn.setUseCaches(false); conn.setAllowUserInteraction(true); conn.setInstanceFollowRedirects(false); if (conn instanceof HttpsURLConnection && sslSocketFactory != null) { HttpsURLConnection httpsConn = (HttpsURLConnection) conn; httpsConn.setSSLSocketFactory(sslSocketFactory); if (disableHostnameVerification) httpsConn.setHostnameVerifier(new HostnameNonVerifier()); } return conn; } /** * @param requestedURL * @param parameters * @return */ private String appendQueryString(String requestedURL, Map parameters) { String newURL = requestedURL; for (Iterator iter = parameters.keySet().iterator(); iter.hasNext();) { String paramName = (String)iter.next(); String paramValue = (String)parameters.get(paramName); String paramString = paramName + "=" + paramValue; if (newURL.indexOf("?") < 0) newURL = newURL + "?" + paramString; else newURL = newURL + "&" + paramString; } return newURL; } /** * @author Stefan Knirsch * @version $Id$ * A private class to change the standard HostName verifier to disable the * Hostname Verification Check */ private class HostnameNonVerifier implements HostnameVerifier { /** * @see com.sun.net.ssl.HostnameVerifier#verify(String, String) */ public boolean verify(String arg0, String arg1) { return true; } } }