[ https://issues.apache.org/jira/browse/CAMEL-8272?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Julian Cable updated CAMEL-8272: -------------------------------- Comment: was deleted (was: {quote} Index: src/main/java/org/apache/camel/component/box/internal/BoxClientHelper.java =================================================================== --- src/main/java/org/apache/camel/component/box/internal/BoxClientHelper.java (revision 1598081) +++ src/main/java/org/apache/camel/component/box/internal/BoxClientHelper.java (working copy) @@ -36,12 +36,19 @@ import org.apache.camel.component.box.BoxConfiguration; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.http.HttpHost; import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.params.HttpParams; +import org.apache.http.protocol.HttpContext; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.Proxy; +import javax.net.ssl.SSLContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,7 +73,7 @@ final String userPassword = configuration.getUserPassword(); if ((authSecureStorage == null && ObjectHelper.isEmpty(userPassword)) - || ObjectHelper.isEmpty(userName) || ObjectHelper.isEmpty(clientId) || ObjectHelper.isEmpty(clientSecret)) { + || ObjectHelper.isEmpty(userName) || ObjectHelper.isEmpty(clientId) || ObjectHelper.isEmpty(clientSecret)) { throw new IllegalArgumentException( "Missing one or more required properties " + "clientId, clientSecret, userName and either authSecureStorage or userPassword"); @@ -76,13 +83,13 @@ // if set, use configured connection manager builder final BoxConnectionManagerBuilder connectionManagerBuilder = configuration.getConnectionManagerBuilder(); final BoxConnectionManagerBuilder connectionManager = connectionManagerBuilder != null - ? connectionManagerBuilder : new BoxConnectionManagerBuilder(); + ? connectionManagerBuilder : new BoxConnectionManagerBuilder(); // create REST client for BoxClient final ClientConnectionManager[] clientConnectionManager = new ClientConnectionManager[1]; final IBoxRESTClient restClient = new BoxRESTClient(connectionManager.build()) { - @SuppressWarnings("deprecation") - @Override + @SuppressWarnings("deprecation") + @Override public HttpClient getRawHttpClient() { final HttpClient httpClient = super.getRawHttpClient(); clientConnectionManager[0] = httpClient.getConnectionManager(); @@ -91,33 +98,48 @@ if (sslContextParameters == null) { sslContextParameters = new SSLContextParameters(); } - try { - final SSLSocketFactory socketFactory = new SSLSocketFactory( - sslContextParameters.createSSLContext(), - SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - schemeRegistry.register(new Scheme("https", socketFactory, 443)); - } catch (GeneralSecurityException e) { - throw ObjectHelper.wrapRuntimeCamelException(e); - } catch (IOException e) { - throw ObjectHelper.wrapRuntimeCamelException(e); - } - - // set custom HTTP params final Map<String, Object> configParams = configuration.getHttpParams(); + boolean useSocksProxy = false; + HttpHost proxyHost = null; if (configParams != null && !configParams.isEmpty()) { + final Boolean socksProxy = (Boolean) configParams.get("http.route.socks-proxy"); + if(socksProxy!=null && socksProxy) { + useSocksProxy = true; + proxyHost = (HttpHost) configParams.get(ConnRoutePNames.DEFAULT_PROXY); + } + // set custom HTTP params LOG.debug("Setting {} HTTP Params", configParams.size()); final HttpParams httpParams = httpClient.getParams(); for (Map.Entry<String, Object> param : configParams.entrySet()) { - httpParams.setParameter(param.getKey(), param.getValue()); + // don't add proxy params if socks + if(!(useSocksProxy && (param.getKey().equals("http.route.socks-proxy") || param.getKey().equals(ConnRoutePNames.DEFAULT_PROXY)))) { + httpParams.setParameter(param.getKey(), param.getValue()); + } } + } + SSLContext sslContext = null; + try { + sslContext = sslContextParameters.createSSLContext(); + } catch (IOException e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } catch (GeneralSecurityException e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + final SSLSocketFactory socketFactory = useSocksProxy? + new SocksSSLSocketFactory(sslContext, proxyHost) + : + new SSLSocketFactory( + sslContext, + SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + schemeRegistry.register(new Scheme("https", socketFactory, 443)); return httpClient; } }; final BoxClient boxClient = new BoxClient(clientId, clientSecret, null, null, - restClient, configuration.getBoxConfig()); + restClient, configuration.getBoxConfig()); // enable OAuth auto-refresh boxClient.setAutoRefreshOAuth(true); @@ -135,7 +157,7 @@ } public static void getOAuthToken(BoxConfiguration configuration, CachedBoxClient cachedBoxClient) - throws AuthFatalFailureException, BoxRestException, BoxServerException, InterruptedException { + throws AuthFatalFailureException, BoxRestException, BoxServerException, InterruptedException { final BoxClient boxClient = cachedBoxClient.getBoxClient(); synchronized (boxClient) { @@ -169,7 +191,7 @@ final Exception ex = listener.getException(); if (ex != null) { throw new RuntimeCamelException(String.format("Login error for %s: %s", - cachedBoxClient, ex.getMessage()), ex); + cachedBoxClient, ex.getMessage()), ex); } } @@ -188,7 +210,7 @@ } public static void shutdownBoxClient(BoxConfiguration configuration, CachedBoxClient cachedBoxClient) - throws BoxServerException, BoxRestException, AuthFatalFailureException { + throws BoxServerException, BoxRestException, AuthFatalFailureException { final BoxClient boxClient = cachedBoxClient.getBoxClient(); synchronized (boxClient) { @@ -217,7 +239,7 @@ } private static void revokeOAuthToken(BoxConfiguration configuration, CachedBoxClient cachedBoxClient) - throws BoxServerException, BoxRestException, AuthFatalFailureException { + throws BoxServerException, BoxRestException, AuthFatalFailureException { final BoxClient boxClient = cachedBoxClient.getBoxClient(); synchronized (boxClient) { @@ -228,7 +250,7 @@ // revoke OAuth token boxClient.getOAuthManager().revokeOAuth(boxClient.getAuthData().getAccessToken(), - configuration.getClientId(), configuration.getClientSecret()); + configuration.getClientId(), configuration.getClientSecret()); // notify the OAuthListener of revoked token cachedBoxClient.getListener().onRefresh(null); @@ -237,4 +259,20 @@ } } } + static class SocksSSLSocketFactory extends SSLSocketFactory { + HttpHost proxyHost; + + public SocksSSLSocketFactory(SSLContext sslContext, HttpHost proxyHost) { + super(sslContext, SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + this.proxyHost = proxyHost; + } + + @Override + public Socket createSocket(final HttpContext context) throws IOException { + InetSocketAddress socksaddr = new InetSocketAddress(proxyHost.getHostName(), proxyHost.getPort()); + Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); + return new Socket(proxy); + } + + } } {quote} ) > Camel-box socks proxy implementation is incomplete > -------------------------------------------------- > > Key: CAMEL-8272 > URL: https://issues.apache.org/jira/browse/CAMEL-8272 > Project: Camel > Issue Type: Bug > Affects Versions: 2.14.1 > Environment: any > Reporter: Julian Cable > > org.apache.camel.component.box.internal.LoginAuthFlowUI looks for > http.route.socks-proxy and sets up a socks proxy for the webClient > org.apache.camel.component.box.internal.BoxClientHelper just passes the > httpParams on to the underlying HttpClient but the box api uses a vanilla > DefaultHttpClient which doesn't talk SOCKS. > The attached patch adds socks proxy support to the main restful box > transactions. -- This message was sent by Atlassian JIRA (v6.3.4#6332)