]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8522 Support custom SSLSocketFactory and TrustManager 1443/head
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 8 Dec 2016 13:52:15 +0000 (14:52 +0100)
committerDuarte Meneses <duarte.meneses@sonarsource.com>
Thu, 8 Dec 2016 14:08:40 +0000 (15:08 +0100)
sonar-ws/src/main/java/org/sonarqube/ws/client/HttpConnector.java
sonar-ws/src/main/java/org/sonarqube/ws/client/OkHttpClientBuilder.java
sonar-ws/src/test/java/org/sonarqube/ws/client/OkHttpClientBuilderTest.java

index 47e756defc3c1ad878338f15f3d065f6f928ffdd..3d93191f9c6ed599d870a0e317076f2629701ab6 100644 (file)
@@ -23,6 +23,9 @@ import java.io.IOException;
 import java.net.Proxy;
 import java.util.Map;
 import javax.annotation.Nullable;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.X509TrustManager;
+
 import okhttp3.Call;
 import okhttp3.Credentials;
 import okhttp3.Headers;
@@ -77,6 +80,8 @@ public class HttpConnector implements WsConnector {
     okHttpClientBuilder.setProxyPassword(builder.proxyPassword);
     okHttpClientBuilder.setConnectTimeoutMs(builder.connectTimeoutMs);
     okHttpClientBuilder.setReadTimeoutMs(builder.readTimeoutMs);
+    okHttpClientBuilder.setSSLSocketFactory(builder.sslSocketFactory);
+    okHttpClientBuilder.setTrustManager(builder.sslTrustManager);
     this.okHttpClient = okHttpClientBuilder.build();
   }
 
@@ -178,6 +183,8 @@ public class HttpConnector implements WsConnector {
     private String proxyPassword;
     private int connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLISECONDS;
     private int readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLISECONDS;
+    private SSLSocketFactory sslSocketFactory = null;
+    private X509TrustManager sslTrustManager = null;
 
     /**
      * Private since 5.5.
@@ -228,6 +235,24 @@ public class HttpConnector implements WsConnector {
       this.connectTimeoutMs = i;
       return this;
     }
+    
+    /**
+     * Optional SSL socket factory with which SSL sockets will be created to establish SSL connections.
+     * If not set, a default SSL socket factory will be used, base d on the JVM's default key store.
+     */
+    public Builder setSSLSocketFactory(@Nullable SSLSocketFactory sslSocketFactory) {
+      this.sslSocketFactory = sslSocketFactory;
+      return this;
+    }
+
+    /**
+     * Optional SSL trust manager used to validate certificates.
+     * If not set, a default system trust manager will be used, based on the JVM's default truststore.
+     */
+    public Builder setTrustManager(@Nullable X509TrustManager sslTrustManager) {
+      this.sslTrustManager = sslTrustManager;
+      return this;
+    }
 
     /**
      * Sets the read timeout to a specified timeout, in milliseconds.
index fafdd7069419007a246f80c401d71575360a19f1..313bba0eadcef64483d57837e0e1f8b38915c3a2 100644 (file)
@@ -65,6 +65,8 @@ public class OkHttpClientBuilder {
   private String proxyPassword;
   private long connectTimeoutMs = -1;
   private long readTimeoutMs = -1;
+  private SSLSocketFactory sslSocketFactory = null;
+  private X509TrustManager sslTrustManager = null;
 
   /**
    * Optional User-Agent. If set, then all the requests sent by the
@@ -75,6 +77,24 @@ public class OkHttpClientBuilder {
     return this;
   }
 
+  /**
+   * Optional SSL socket factory with which SSL sockets will be created to establish SSL connections.
+   * If not set, a default SSL socket factory will be used, base d on the JVM's default key store.
+   */
+  public OkHttpClientBuilder setSSLSocketFactory(@Nullable SSLSocketFactory sslSocketFactory) {
+    this.sslSocketFactory = sslSocketFactory;
+    return this;
+  }
+
+  /**
+   * Optional SSL trust manager used to validate certificates.
+   * If not set, a default system trust manager will be used, based on the JVM's default truststore.
+   */
+  public OkHttpClientBuilder setTrustManager(@Nullable X509TrustManager sslTrustManager) {
+    this.sslTrustManager = sslTrustManager;
+    return this;
+  }
+
   /**
    * Optional proxy. If set, then all the requests sent by the
    * {@link OkHttpClient} will reach the proxy. If not set,
@@ -144,8 +164,10 @@ public class OkHttpClientBuilder {
       .supportsTlsExtensions(true)
       .build();
     builder.connectionSpecs(asList(tls, ConnectionSpec.CLEARTEXT));
-    X509TrustManager systemDefaultTrustManager = systemDefaultTrustManager();
-    builder.sslSocketFactory(systemDefaultSslSocketFactory(systemDefaultTrustManager), systemDefaultTrustManager);
+
+    X509TrustManager trustManager = sslTrustManager != null ? sslTrustManager : systemDefaultTrustManager();
+    SSLSocketFactory sslFactory = sslSocketFactory != null ? sslSocketFactory : systemDefaultSslSocketFactory(trustManager);
+    builder.sslSocketFactory(sslFactory, trustManager);
 
     return builder.build();
   }
index a96e7a35888b0a901b95b8af61c53a514804c927..f4ed7eb9267091079e2282e8e03c3f60af41773f 100644 (file)
@@ -25,6 +25,9 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+
+import javax.net.ssl.SSLSocketFactory;
 
 public class OkHttpClientBuilderTest {
 
@@ -42,6 +45,16 @@ public class OkHttpClientBuilderTest {
     assertThat(okHttpClient.sslSocketFactory()).isNotNull();
   }
 
+  @Test
+  public void build_with_custom_sslSocketFactory() {
+    SSLSocketFactory sslSocketFactory = mock(SSLSocketFactory.class);
+    OkHttpClient okHttpClient = underTest
+      .setSSLSocketFactory(sslSocketFactory)
+      .build();
+
+    assertThat(okHttpClient.sslSocketFactory()).isEqualTo(sslSocketFactory);
+  }
+
   @Test
   public void build_throws_IAE_if_connect_timeout_is_negative() {
     expectedException.expect(IllegalArgumentException.class);