package eu.siacs.conversations.http; import org.apache.http.conn.ssl.StrictHostnameVerifier; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Proxy; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; import de.thedevstack.conversationsplus.ConversationsPlusApplication; import de.thedevstack.conversationsplus.utils.MessageUtil; import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.services.AbstractConnectionManager; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.SSLSocketHelper; public class HttpConnectionManager extends AbstractConnectionManager { private static HttpConnectionManager INSTANCE; public static void init() { INSTANCE = new HttpConnectionManager(); } private List downloadConnections = new CopyOnWriteArrayList<>(); public static HttpDownloadConnection createNewDownloadConnection(Message message) { return createNewDownloadConnection(message, false); } public static HttpDownloadConnection createNewDownloadConnection(Message message, boolean interactive) { if (MessageUtil.needsDownload(message)) { HttpDownloadConnection connection = new HttpDownloadConnection(INSTANCE); connection.init(message, interactive); INSTANCE.downloadConnections.add(connection); return connection; } return null; } public void finishConnection(HttpDownloadConnection connection) { this.downloadConnections.remove(connection); } public static void setupTrustManager(final HttpsURLConnection connection, final boolean interactive) { 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); } connection.setSSLSocketFactory(sf); connection.setHostnameVerifier(hostnameVerifier); } catch (final KeyManagementException | NoSuchAlgorithmException ignored) { } } public Proxy getProxy() throws IOException { return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getLocalHost(), 8118)); } }