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}