HttpConnectionManager.java

 1package eu.siacs.conversations.http;
 2
 3import org.apache.http.conn.ssl.StrictHostnameVerifier;
 4
 5import java.io.IOException;
 6import java.net.InetAddress;
 7import java.net.InetSocketAddress;
 8import java.net.Proxy;
 9import java.security.KeyManagementException;
10import java.security.NoSuchAlgorithmException;
11import java.util.List;
12import java.util.concurrent.CopyOnWriteArrayList;
13
14import javax.net.ssl.HostnameVerifier;
15import javax.net.ssl.HttpsURLConnection;
16import javax.net.ssl.SSLSocketFactory;
17import javax.net.ssl.X509TrustManager;
18
19import eu.siacs.conversations.entities.Message;
20import eu.siacs.conversations.services.AbstractConnectionManager;
21import eu.siacs.conversations.services.XmppConnectionService;
22import eu.siacs.conversations.utils.TLSSocketFactory;
23
24public class HttpConnectionManager extends AbstractConnectionManager {
25
26	public HttpConnectionManager(XmppConnectionService service) {
27		super(service);
28	}
29
30	private List<HttpDownloadConnection> downloadConnections = new CopyOnWriteArrayList<>();
31	private List<HttpUploadConnection> uploadConnections = new CopyOnWriteArrayList<>();
32
33	public HttpDownloadConnection createNewDownloadConnection(Message message) {
34		return this.createNewDownloadConnection(message, false);
35	}
36
37	public HttpDownloadConnection createNewDownloadConnection(Message message, boolean interactive) {
38		HttpDownloadConnection connection = new HttpDownloadConnection(this);
39		connection.init(message,interactive);
40		this.downloadConnections.add(connection);
41		return connection;
42	}
43
44	public HttpUploadConnection createNewUploadConnection(Message message, boolean delay) {
45		HttpUploadConnection connection = new HttpUploadConnection(this);
46		connection.init(message,delay);
47		this.uploadConnections.add(connection);
48		return connection;
49	}
50
51	public void finishConnection(HttpDownloadConnection connection) {
52		this.downloadConnections.remove(connection);
53	}
54
55	public void finishUploadConnection(HttpUploadConnection httpUploadConnection) {
56		this.uploadConnections.remove(httpUploadConnection);
57	}
58
59	public void setupTrustManager(final HttpsURLConnection connection, final boolean interactive) {
60		final X509TrustManager trustManager;
61		final HostnameVerifier hostnameVerifier = mXmppConnectionService.getMemorizingTrustManager().wrapHostnameVerifier(new StrictHostnameVerifier(), interactive);
62		if (interactive) {
63			trustManager = mXmppConnectionService.getMemorizingTrustManager().getInteractive();
64		} else {
65			trustManager = mXmppConnectionService.getMemorizingTrustManager().getNonInteractive();
66		}
67		try {
68			final SSLSocketFactory sf = new TLSSocketFactory(new X509TrustManager[]{trustManager}, mXmppConnectionService.getRNG());
69			connection.setSSLSocketFactory(sf);
70			connection.setHostnameVerifier(hostnameVerifier);
71		} catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
72		}
73	}
74
75	public Proxy getProxy() throws IOException {
76		return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByAddress(new byte[]{127,0,0,1}), 8118));
77	}
78}