diff --git a/.gitignore b/.gitignore index 612c5bc..31f94c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target .idea *.iml +.java-version diff --git a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConfiguration.java b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConfiguration.java index b3402f9..ab1ef7b 100644 --- a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConfiguration.java +++ b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConfiguration.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.apache.v2.ApacheHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; @@ -33,11 +34,17 @@ import com.google.api.services.directory.DirectoryScopes; import com.google.api.services.licensing.Licensing; import com.google.auth.http.HttpCredentialsAdapter; +import com.google.auth.http.HttpTransportFactory; import com.google.auth.oauth2.GoogleCredentials; import com.google.auth.oauth2.UserCredentials; import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.util.Arrays; import java.util.List; +import java.util.Optional; +import org.apache.http.HttpHost; +import org.apache.http.impl.client.HttpClientBuilder; import org.identityconnectors.common.StringUtil; import org.identityconnectors.common.logging.Log; import org.identityconnectors.common.security.GuardedString; @@ -55,11 +62,6 @@ public class GoogleAppsConfiguration extends AbstractConfiguration implements St private static final Log LOG = Log.getLog(GoogleAppsConfiguration.class); - /** - * Global instance of the HTTP transport. - */ - private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); - /** * Global instance of the JSON factory. */ @@ -226,9 +228,38 @@ public void validate() { private void initGoogleCredentials() { synchronized (this) { if (null == googleCredentials) { - UserCredentials.Builder credentialsBuilder = UserCredentials.newBuilder() - .setClientId(getClientId()) - .setClientSecret(SecurityUtil.decrypt(getClientSecret())); + UserCredentials.Builder credentialsBuilder = UserCredentials.newBuilder(); + + Optional httpProxyHost = Optional.ofNullable(System.getProperty("http.proxyHost")); + Optional httpProxyPort = Optional.ofNullable(System.getProperty("http.proxyPort")); + Optional httpsProxyHost = Optional.ofNullable(System.getProperty("https.proxyHost")); + Optional httpsProxyPort = Optional.ofNullable(System.getProperty("https.proxyPort")); + Optional socksProxyHost = Optional.ofNullable(System.getProperty("socksProxyHost")); + Optional socksProxyPort = Optional.ofNullable(System.getProperty("socksProxyPort")); + Proxy.Type proxyType = + (httpProxyHost.isPresent() && httpProxyPort.isPresent()) + || (httpsProxyHost.isPresent() && httpsProxyPort.isPresent()) + ? Proxy.Type.HTTP + : socksProxyHost.isPresent() && socksProxyPort.isPresent() + ? Proxy.Type.SOCKS + : Proxy.Type.DIRECT; + + if (Proxy.Type.HTTP == proxyType) { + HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + clientBuilder.useSystemProperties(); + clientBuilder.setProxy(httpsProxyHost.isPresent() && httpsProxyPort.isPresent() + ? new HttpHost(httpsProxyHost.get(), + Integer.parseInt(httpsProxyPort.get())) + : new HttpHost(httpProxyHost.get(), + Integer.parseInt(httpProxyPort.get()))); + credentialsBuilder.setHttpTransportFactory(new HttpTransportFactory() { + @Override + public HttpTransport create() { + return new ApacheHttpTransport(clientBuilder.build()); + } + }); + } + credentialsBuilder.setClientId(getClientId()).setClientSecret(SecurityUtil.decrypt(getClientSecret())); getRefreshToken().access(chars -> credentialsBuilder.setRefreshToken(new String(chars))); @@ -243,11 +274,24 @@ private void initGoogleCredentials() { DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER)); + HttpTransport httpTransport = Proxy.Type.DIRECT == proxyType + ? new NetHttpTransport() + : new NetHttpTransport.Builder().setProxy(new Proxy(proxyType, + Proxy.Type.SOCKS == proxyType + ? new InetSocketAddress(socksProxyHost.get(), + Integer.parseInt(socksProxyHost.get())) + : httpsProxyHost.isPresent() && httpsProxyPort.isPresent() + ? new InetSocketAddress(httpsProxyHost.get(), + Integer.parseInt(httpsProxyPort.get())) + : new InetSocketAddress(httpProxyHost.get(), + Integer.parseInt(httpProxyPort.get())))) + .build(); + HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(googleCredentials); - directory = new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer). + directory = new Directory.Builder(httpTransport, JSON_FACTORY, requestInitializer). setApplicationName(APPLICATION_NAME). build(); - licensing = new Licensing.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer). + licensing = new Licensing.Builder(httpTransport, JSON_FACTORY, requestInitializer). setApplicationName(APPLICATION_NAME). build(); } diff --git a/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java b/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java index bb3d4d2..8bbc049 100644 --- a/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java +++ b/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java @@ -60,6 +60,10 @@ private static ConnectorFacade newFacade() { @BeforeAll public static void setUp() throws IOException { + + System.setProperty("http.proxyHost", "localhost"); + System.setProperty("http.proxyPort", "3128"); + CONN_CONF = new GoogleAppsConfiguration(); CONN_CONF.setClientId("aclientid");