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;
62 if (interactive) {
63 trustManager = mXmppConnectionService.getMemorizingTrustManager().getInteractive();
64 hostnameVerifier = mXmppConnectionService
65 .getMemorizingTrustManager().wrapHostnameVerifier(
66 new StrictHostnameVerifier());
67 } else {
68 trustManager = mXmppConnectionService.getMemorizingTrustManager()
69 .getNonInteractive();
70 hostnameVerifier = mXmppConnectionService
71 .getMemorizingTrustManager()
72 .wrapHostnameVerifierNonInteractive(
73 new StrictHostnameVerifier());
74 }
75 try {
76 final SSLSocketFactory sf = new TLSSocketFactory(new X509TrustManager[]{trustManager}, mXmppConnectionService.getRNG());
77 connection.setSSLSocketFactory(sf);
78 connection.setHostnameVerifier(hostnameVerifier);
79 } catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
80 }
81 }
82
83 public Proxy getProxy() throws IOException {
84 return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByAddress(new byte[]{127,0,0,1}), 8118));
85 }
86}