From 84c1623abe733ae00239c214ce57868c72a0937f Mon Sep 17 00:00:00 2001 From: David Estes Date: Fri, 14 Jun 2024 09:20:57 -0400 Subject: [PATCH] adding support for specifying a Proxy to use for the connection Signed-off-by: David Estes --- .../ovirt/engine/sdk4/ConnectionBuilder.java | 12 +++ .../java/org/ovirt/engine/sdk4/ProxyInfo.java | 85 +++++++++++++++++++ .../sdk4/internal/ConnectionBuilder45.java | 58 +++++++++++-- .../engine/sdk4/internal/HttpConnection.java | 1 + 4 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 sdk/src/main/java/org/ovirt/engine/sdk4/ProxyInfo.java diff --git a/sdk/src/main/java/org/ovirt/engine/sdk4/ConnectionBuilder.java b/sdk/src/main/java/org/ovirt/engine/sdk4/ConnectionBuilder.java index 01f5f1d1..2ce6a91b 100644 --- a/sdk/src/main/java/org/ovirt/engine/sdk4/ConnectionBuilder.java +++ b/sdk/src/main/java/org/ovirt/engine/sdk4/ConnectionBuilder.java @@ -43,6 +43,8 @@ public abstract class ConnectionBuilder { protected String user; protected String password; protected String token; + + protected ProxyInfo proxyInfo; protected boolean insecure = false; protected boolean kerberos = false; protected int timeout = 0; @@ -210,6 +212,16 @@ public ConnectionBuilder ssoUrl(String ssoUrl) { return this; } + /** + * Set proxy information if using a Proxy + * @param proxyInfo + * @return + */ + public ConnectionBuilder proxy(ProxyInfo proxyInfo) { + this.proxyInfo = proxyInfo; + return this; + } + /** * Set SSO revoke url * diff --git a/sdk/src/main/java/org/ovirt/engine/sdk4/ProxyInfo.java b/sdk/src/main/java/org/ovirt/engine/sdk4/ProxyInfo.java new file mode 100644 index 00000000..d44d2227 --- /dev/null +++ b/sdk/src/main/java/org/ovirt/engine/sdk4/ProxyInfo.java @@ -0,0 +1,85 @@ +package org.ovirt.engine.sdk4; + +public class ProxyInfo { + protected String host; + private Integer proxyPort; + protected String user; + protected String password; + private String proxyDomain; + private String proxyWorkstation; + + private ProxyType proxyType; + + + public ProxyInfo(String host, Integer proxyPort, String user, String password, String proxyDomain, ProxyType proxyType) { + this.host = host; + this.proxyPort = proxyPort; + this.user = user; + this.password = password; + this.proxyDomain = proxyDomain; + this.proxyType = proxyType; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getProxyPort() { + return proxyPort; + } + + public void setProxyPort(Integer proxyPort) { + this.proxyPort = proxyPort; + } + + public String getProxyDomain() { + return proxyDomain; + } + + public void setProxyDomain(String proxyDomain) { + this.proxyDomain = proxyDomain; + } + + public ProxyType getProxyType() { + return proxyType; + } + + public void setProxyType(ProxyType proxyType) { + this.proxyType = proxyType; + } + + public String getProxyWorkstation() { + return proxyWorkstation; + } + + public void setProxyWorkstation(String proxyWorkstation) { + this.proxyWorkstation = proxyWorkstation; + } + + + //create an enum for proxy type + public enum ProxyType { + HTTP, SOCKS + } +} diff --git a/sdk/src/main/java/org/ovirt/engine/sdk4/internal/ConnectionBuilder45.java b/sdk/src/main/java/org/ovirt/engine/sdk4/internal/ConnectionBuilder45.java index 928747fa..c589ffb9 100644 --- a/sdk/src/main/java/org/ovirt/engine/sdk4/internal/ConnectionBuilder45.java +++ b/sdk/src/main/java/org/ovirt/engine/sdk4/internal/ConnectionBuilder45.java @@ -3,6 +3,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -10,11 +12,9 @@ import java.security.cert.CertificateException; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; - -import org.apache.http.auth.AuthSchemeProvider; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.Credentials; -import org.apache.http.auth.UsernamePasswordCredentials; +import java.net.Proxy; +import org.apache.http.HttpHost; +import org.apache.http.auth.*; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.AuthSchemes; import org.apache.http.client.config.CookieSpecs; @@ -31,12 +31,15 @@ import org.apache.http.impl.auth.SPNegoSchemeFactory; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.ProxyAuthenticationStrategy; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.protocol.HttpContext; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.ovirt.engine.sdk4.ConnectionBuilder; import org.ovirt.engine.sdk4.Error; import org.ovirt.engine.sdk4.HttpClient; +import org.ovirt.engine.sdk4.ProxyInfo; public class ConnectionBuilder45 extends ConnectionBuilder { @@ -93,6 +96,22 @@ public String getPassword() { clientBuilder.disableContentCompression(); } + if(proxyInfo != null) { + if(proxyInfo.getProxyType() == ProxyInfo.ProxyType.HTTP) { + if(proxyInfo.getHost() != null && proxyInfo.getProxyPort() != null) { + clientBuilder.setProxy(new HttpHost(proxyInfo.getHost(), proxyInfo.getProxyPort())); + if(proxyInfo.getUser() != null) { //authenticated proxy + NTCredentials ntCreds = new NTCredentials(proxyInfo.getUser(), proxyInfo.getPassword(), proxyInfo.getProxyWorkstation(), proxyInfo.getProxyDomain()); + credsProvider.setCredentials(new AuthScope(proxyInfo.getHost(), proxyInfo.getProxyPort()), ntCreds); + clientBuilder.setDefaultCredentialsProvider(credsProvider); + clientBuilder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy()); + } + } + } else if(proxyInfo.getProxyType() == ProxyInfo.ProxyType.SOCKS) { + //this has to be handled in the Connection Factory createSocket + } + } + return new HttpClient45(clientBuilder.build()); } @@ -102,7 +121,20 @@ private Registry createConnectionSocketFactoryRegistry() { // Create SSL/TLS or plain connection: if (HTTP_PROTOCOL.equals(protocol)) { - ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory(); + ConnectionSocketFactory plainsf = new PlainConnectionSocketFactory() { + @Override + public Socket createSocket(final HttpContext context) throws IOException { + if (proxyInfo != null && proxyInfo.getProxyType() == ProxyInfo.ProxyType.SOCKS) { + if (proxyInfo.getHost() != null && proxyInfo.getProxyPort() != null) { + InetSocketAddress socksaddr = new InetSocketAddress(proxyInfo.getHost(), proxyInfo.getProxyPort()); + Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); + return new Socket(proxy); + } + } + return super.createSocket(context); + } + }; + registry = RegistryBuilder.create() .register(HTTP_PROTOCOL, plainsf) .build(); @@ -113,7 +145,19 @@ else if (HTTPS_PROTOCOL.equals(protocol)) { if (this.insecure) { SSLContext sslcontext = SSLContext.getInstance("TLS"); sslcontext.init(null, new TrustManager[]{noCaTrustManager}, null); - sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE); + sslsf = new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE) { + @Override + public Socket createSocket(final HttpContext context) throws IOException { + if(proxyInfo != null && proxyInfo.getProxyType() == ProxyInfo.ProxyType.SOCKS) { + if(proxyInfo.getHost() != null && proxyInfo.getProxyPort() != null) { + InetSocketAddress socksaddr = new InetSocketAddress(proxyInfo.getHost(), proxyInfo.getProxyPort()); + Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr); + return new Socket(proxy); + } + } + return super.createSocket(context); + } + }; } else { SSLContextBuilder sslContextBuilder = SSLContexts.custom(); diff --git a/sdk/src/main/java/org/ovirt/engine/sdk4/internal/HttpConnection.java b/sdk/src/main/java/org/ovirt/engine/sdk4/internal/HttpConnection.java index e2ed46ff..ad8cc0db 100644 --- a/sdk/src/main/java/org/ovirt/engine/sdk4/internal/HttpConnection.java +++ b/sdk/src/main/java/org/ovirt/engine/sdk4/internal/HttpConnection.java @@ -73,6 +73,7 @@ public class HttpConnection implements Connection { private String ssoTokenName = null; private String ssoUrl = null; private String ssoRevokeUrl = null; + private Map headers = null;