11package com .marklogic .client .impl .okhttp ;
22
33import com .marklogic .client .DatabaseClientFactory ;
4+ import com .marklogic .client .impl .HTTPKerberosAuthInterceptor ;
5+ import com .marklogic .client .impl .HTTPSamlAuthInterceptor ;
46import okhttp3 .ConnectionPool ;
57import okhttp3 .CookieJar ;
68import okhttp3 .Dns ;
9+ import okhttp3 .Interceptor ;
710import okhttp3 .OkHttpClient ;
811
912import javax .net .SocketFactory ;
10- import javax .net .ssl .*;
13+ import javax .net .ssl .HostnameVerifier ;
14+ import javax .net .ssl .SSLContext ;
15+ import javax .net .ssl .TrustManager ;
16+ import javax .net .ssl .TrustManagerFactory ;
17+ import javax .net .ssl .X509TrustManager ;
1118import java .net .Inet4Address ;
1219import java .net .InetAddress ;
1320import java .net .UnknownHostException ;
1724import java .security .NoSuchAlgorithmException ;
1825import java .util .ArrayList ;
1926import java .util .List ;
27+ import java .util .Map ;
2028import java .util .concurrent .TimeUnit ;
2129
2230/**
@@ -28,11 +36,53 @@ public abstract class OkHttpUtil {
2836
2937 final private static ConnectionPool connectionPool = new ConnectionPool ();
3038
39+ public static OkHttpClient .Builder newOkHttpClientBuilder (String host , int port , DatabaseClientFactory .SecurityContext securityContext ) {
40+ OkHttpClient .Builder clientBuilder = OkHttpUtil .newClientBuilder ();
41+ AuthenticationConfigurer authenticationConfigurer = null ;
42+
43+ // As of 6.1.0, kerberos/saml/certificate are still coded within this class to avoid potential breaks from
44+ // refactoring. Once the tests for these auth methods are running properly, the code for each can be
45+ // safely refactored.
46+ if (securityContext instanceof DatabaseClientFactory .BasicAuthContext ) {
47+ authenticationConfigurer = new BasicAuthenticationConfigurer ();
48+ } else if (securityContext instanceof DatabaseClientFactory .DigestAuthContext ) {
49+ authenticationConfigurer = new DigestAuthenticationConfigurer ();
50+ } else if (securityContext instanceof DatabaseClientFactory .KerberosAuthContext ) {
51+ configureKerberosAuth ((DatabaseClientFactory .KerberosAuthContext ) securityContext , host , clientBuilder );
52+ } else if (securityContext instanceof DatabaseClientFactory .CertificateAuthContext ) {
53+ } else if (securityContext instanceof DatabaseClientFactory .SAMLAuthContext ) {
54+ configureSAMLAuth ((DatabaseClientFactory .SAMLAuthContext ) securityContext , clientBuilder );
55+ } else if (securityContext instanceof DatabaseClientFactory .MarkLogicCloudAuthContext ) {
56+ authenticationConfigurer = new MarkLogicCloudAuthenticationConfigurer (host , port );
57+ } else {
58+ throw new IllegalArgumentException ("Unsupported security context: " + securityContext .getClass ());
59+ }
60+
61+ if (authenticationConfigurer != null ) {
62+ authenticationConfigurer .configureAuthentication (clientBuilder , securityContext );
63+ }
64+
65+ SSLContext sslContext = securityContext .getSSLContext ();
66+ X509TrustManager trustManager = securityContext .getTrustManager ();
67+
68+ DatabaseClientFactory .SSLHostnameVerifier sslVerifier = null ;
69+ if (sslContext != null || securityContext instanceof DatabaseClientFactory .CertificateAuthContext ) {
70+ sslVerifier = securityContext .getSSLHostnameVerifier () != null ?
71+ securityContext .getSSLHostnameVerifier () :
72+ DatabaseClientFactory .SSLHostnameVerifier .COMMON ;
73+ }
74+
75+ OkHttpUtil .configureSocketFactory (clientBuilder , sslContext , trustManager );
76+ OkHttpUtil .configureHostnameVerifier (clientBuilder , sslVerifier );
77+
78+ return clientBuilder ;
79+ }
80+
3181 /**
3282 * @return an OkHttpClient.Builder initialized with a sensible set of defaults that can then have authentication
3383 * configured
3484 */
35- public static OkHttpClient .Builder newClientBuilder () {
85+ static OkHttpClient .Builder newClientBuilder () {
3686 return new OkHttpClient .Builder ()
3787 .followRedirects (false )
3888 .followSslRedirects (false )
@@ -47,13 +97,33 @@ public static OkHttpClient.Builder newClientBuilder() {
4797 .dns (new DnsImpl ());
4898 }
4999
100+ private static void configureKerberosAuth (DatabaseClientFactory .KerberosAuthContext keberosAuthContext , String host , OkHttpClient .Builder clientBuilder ) {
101+ Map <String , String > kerberosOptions = keberosAuthContext .getKrbOptions ();
102+ Interceptor interceptor = new HTTPKerberosAuthInterceptor (host , kerberosOptions );
103+ clientBuilder .addInterceptor (interceptor );
104+ }
105+
106+ private static void configureSAMLAuth (DatabaseClientFactory .SAMLAuthContext samlAuthContext , OkHttpClient .Builder clientBuilder ) {
107+ Interceptor interceptor ;
108+ String authorizationTokenValue = samlAuthContext .getToken ();
109+ if (authorizationTokenValue != null && authorizationTokenValue .length () > 0 ) {
110+ interceptor = new HTTPSamlAuthInterceptor (authorizationTokenValue );
111+ } else if (samlAuthContext .getAuthorizer () != null ) {
112+ interceptor = new HTTPSamlAuthInterceptor (samlAuthContext .getAuthorizer ());
113+ } else if (samlAuthContext .getRenewer () != null ) {
114+ interceptor = new HTTPSamlAuthInterceptor (samlAuthContext .getAuthorization (), samlAuthContext .getRenewer ());
115+ } else
116+ throw new IllegalArgumentException ("Either a call back or renewer expected." );
117+ clientBuilder .addInterceptor (interceptor );
118+ }
119+
50120 /**
51121 * Configure the hostname verifier for the given OkHttpClient.Builder based on the given SSLHostnameVerifier.
52122 *
53123 * @param clientBuilder
54124 * @param sslVerifier
55125 */
56- public static void configureHostnameVerifier (OkHttpClient .Builder clientBuilder , DatabaseClientFactory .SSLHostnameVerifier sslVerifier ) {
126+ private static void configureHostnameVerifier (OkHttpClient .Builder clientBuilder , DatabaseClientFactory .SSLHostnameVerifier sslVerifier ) {
57127 HostnameVerifier hostnameVerifier = null ;
58128 if (DatabaseClientFactory .SSLHostnameVerifier .ANY .equals (sslVerifier )) {
59129 hostnameVerifier = (hostname , session ) -> true ;
@@ -75,7 +145,7 @@ public static void configureHostnameVerifier(OkHttpClient.Builder clientBuilder,
75145 * @param sslContext
76146 * @param trustManager
77147 */
78- public static void configureSocketFactory (OkHttpClient .Builder clientBuilder , SSLContext sslContext , X509TrustManager trustManager ) {
148+ private static void configureSocketFactory (OkHttpClient .Builder clientBuilder , SSLContext sslContext , X509TrustManager trustManager ) {
79149 /**
80150 * Per https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#sslSocketFactory-javax.net.ssl.SSLSocketFactory- ,
81151 * OkHttp requires a TrustManager to be specified so that it can build a clean certificate chain. If trustManager
0 commit comments