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}