HttpConnectionManager.java

 1package eu.siacs.conversations.http;
 2
 3import org.apache.http.conn.ssl.StrictHostnameVerifier;
 4
 5import java.security.KeyManagementException;
 6import java.security.NoSuchAlgorithmException;
 7import java.util.List;
 8import java.util.concurrent.CopyOnWriteArrayList;
 9
10import javax.net.ssl.HostnameVerifier;
11import javax.net.ssl.HttpsURLConnection;
12import javax.net.ssl.SSLContext;
13import javax.net.ssl.SSLSocketFactory;
14import javax.net.ssl.X509TrustManager;
15
16import eu.siacs.conversations.entities.Message;
17import eu.siacs.conversations.services.AbstractConnectionManager;
18import eu.siacs.conversations.services.XmppConnectionService;
19import eu.siacs.conversations.utils.CryptoHelper;
20
21public class HttpConnectionManager extends AbstractConnectionManager {
22
23	public HttpConnectionManager(XmppConnectionService service) {
24		super(service);
25	}
26
27	private List<HttpDownloadConnection> downloadConnections = new CopyOnWriteArrayList<>();
28	private List<HttpUploadConnection> uploadConnections = new CopyOnWriteArrayList<>();
29
30	public HttpDownloadConnection createNewDownloadConnection(Message message) {
31		return this.createNewDownloadConnection(message, false);
32	}
33
34	public HttpDownloadConnection createNewDownloadConnection(Message message, boolean interactive) {
35		HttpDownloadConnection connection = new HttpDownloadConnection(this);
36		connection.init(message,interactive);
37		this.downloadConnections.add(connection);
38		return connection;
39	}
40
41	public HttpUploadConnection createNewUploadConnection(Message message, boolean delay) {
42		HttpUploadConnection connection = new HttpUploadConnection(this);
43		connection.init(message,delay);
44		this.uploadConnections.add(connection);
45		return connection;
46	}
47
48	public void finishConnection(HttpDownloadConnection connection) {
49		this.downloadConnections.remove(connection);
50	}
51
52	public void finishUploadConnection(HttpUploadConnection httpUploadConnection) {
53		this.uploadConnections.remove(httpUploadConnection);
54	}
55
56	public void setupTrustManager(final HttpsURLConnection connection, final boolean interactive) {
57		final X509TrustManager trustManager;
58		final HostnameVerifier hostnameVerifier;
59		if (interactive) {
60			trustManager = mXmppConnectionService.getMemorizingTrustManager();
61			hostnameVerifier = mXmppConnectionService
62					.getMemorizingTrustManager().wrapHostnameVerifier(
63							new StrictHostnameVerifier());
64		} else {
65			trustManager = mXmppConnectionService.getMemorizingTrustManager()
66					.getNonInteractive();
67			hostnameVerifier = mXmppConnectionService
68					.getMemorizingTrustManager()
69					.wrapHostnameVerifierNonInteractive(
70							new StrictHostnameVerifier());
71		}
72		try {
73			final SSLContext sc = SSLContext.getInstance("TLS");
74			sc.init(null, new X509TrustManager[]{trustManager},
75					mXmppConnectionService.getRNG());
76
77			final SSLSocketFactory sf = sc.getSocketFactory();
78			final String[] cipherSuites = CryptoHelper.getOrderedCipherSuites(
79					sf.getSupportedCipherSuites());
80			if (cipherSuites.length > 0) {
81				sc.getDefaultSSLParameters().setCipherSuites(cipherSuites);
82
83			}
84
85			connection.setSSLSocketFactory(sf);
86			connection.setHostnameVerifier(hostnameVerifier);
87		} catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
88		}
89	}
90}