package de.thedevstack.conversationsplus.http; import org.apache.http.conn.ssl.StrictHostnameVerifier; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; import de.thedevstack.conversationsplus.ConversationsPlusApplication; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.SSLSocketHelper; import okhttp3.OkHttpClient; /** * Created by steckbrief on 22.08.2016. */ public final class HttpClient { private static HttpClient INSTANCE; private boolean interactive = false; private OkHttpClient client; public static void init() { INSTANCE = new HttpClient(); } public static synchronized OkHttpClient getClient(boolean interactive) { if (INSTANCE.interactive != interactive) { INSTANCE.interactive = interactive; INSTANCE.buildClient(); } return INSTANCE.client; } private HttpClient() { this.buildClient(); } private void buildClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); this.initTrustManager(builder); this.client = builder.build(); } public void initTrustManager(final OkHttpClient.Builder builder) { final X509TrustManager trustManager; final HostnameVerifier hostnameVerifier; if (interactive) { trustManager = ConversationsPlusApplication.getMemorizingTrustManager(); hostnameVerifier = ConversationsPlusApplication.getMemorizingTrustManager().wrapHostnameVerifier( new StrictHostnameVerifier()); } else { trustManager = ConversationsPlusApplication.getMemorizingTrustManager() .getNonInteractive(); hostnameVerifier = ConversationsPlusApplication.getMemorizingTrustManager() .wrapHostnameVerifierNonInteractive( new StrictHostnameVerifier()); } try { final SSLContext sc = SSLSocketHelper.getSSLContext(); sc.init(null, new X509TrustManager[]{trustManager}, ConversationsPlusApplication.getSecureRandom()); final SSLSocketFactory sf = sc.getSocketFactory(); final String[] cipherSuites = CryptoHelper.getOrderedCipherSuites( sf.getSupportedCipherSuites()); if (cipherSuites.length > 0) { sc.getDefaultSSLParameters().setCipherSuites(cipherSuites); } builder.sslSocketFactory(sf, trustManager); builder.hostnameVerifier(hostnameVerifier); } catch (final KeyManagementException | NoSuchAlgorithmException ignored) { } } }