get file upload ready to work with https

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/http/HttpConnection.java        | 40 
src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java | 46 
src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java  |  5 
3 files changed, 53 insertions(+), 38 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/http/HttpConnection.java 🔗

@@ -131,42 +131,6 @@ public class HttpConnection implements Downloadable {
 		mXmppConnectionService.updateConversationUi();
 	}
 
-	private void setupTrustManager(final HttpsURLConnection connection,
-			final boolean interactive) {
-		final X509TrustManager trustManager;
-		final HostnameVerifier hostnameVerifier;
-		if (interactive) {
-			trustManager = mXmppConnectionService.getMemorizingTrustManager();
-			hostnameVerifier = mXmppConnectionService
-				.getMemorizingTrustManager().wrapHostnameVerifier(
-						new StrictHostnameVerifier());
-		} else {
-			trustManager = mXmppConnectionService.getMemorizingTrustManager()
-				.getNonInteractive();
-			hostnameVerifier = mXmppConnectionService
-				.getMemorizingTrustManager()
-				.wrapHostnameVerifierNonInteractive(
-						new StrictHostnameVerifier());
-		}
-		try {
-			final SSLContext sc = SSLContext.getInstance("TLS");
-			sc.init(null, new X509TrustManager[]{trustManager},
-					mXmppConnectionService.getRNG());
-
-			final SSLSocketFactory sf = sc.getSocketFactory();
-			final String[] cipherSuites = CryptoHelper.getOrderedCipherSuites(
-					sf.getSupportedCipherSuites());
-			if (cipherSuites.length > 0) {
-				sc.getDefaultSSLParameters().setCipherSuites(cipherSuites);
-
-			}
-
-			connection.setSSLSocketFactory(sf);
-			connection.setHostnameVerifier(hostnameVerifier);
-		} catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
-		}
-	}
-
 	private class FileSizeChecker implements Runnable {
 
 		private boolean interactive = false;
@@ -210,7 +174,7 @@ public class HttpConnection implements Downloadable {
 			HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection();
 			connection.setRequestMethod("HEAD");
 			if (connection instanceof HttpsURLConnection) {
-				setupTrustManager((HttpsURLConnection) connection, interactive);
+				mHttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, interactive);
 			}
 			connection.connect();
 			String contentLength = connection.getHeaderField("Content-Length");
@@ -252,7 +216,7 @@ public class HttpConnection implements Downloadable {
 		private void download() throws SSLHandshakeException, IOException {
 			HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection();
 			if (connection instanceof HttpsURLConnection) {
-				setupTrustManager((HttpsURLConnection) connection, interactive);
+				mHttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, interactive);
 			}
 			connection.connect();
 			BufferedInputStream is = new BufferedInputStream(connection.getInputStream());

src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java 🔗

@@ -1,11 +1,22 @@
 package eu.siacs.conversations.http;
 
+import org.apache.http.conn.ssl.StrictHostnameVerifier;
+
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.X509TrustManager;
+
 import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.services.AbstractConnectionManager;
 import eu.siacs.conversations.services.XmppConnectionService;
+import eu.siacs.conversations.utils.CryptoHelper;
 
 public class HttpConnectionManager extends AbstractConnectionManager {
 
@@ -41,4 +52,39 @@ public class HttpConnectionManager extends AbstractConnectionManager {
 	public void finishUploadConnection(HttpUploadConnection httpUploadConnection) {
 		this.uploadConnections.remove(httpUploadConnection);
 	}
+
+	public void setupTrustManager(final HttpsURLConnection connection, final boolean interactive) {
+		final X509TrustManager trustManager;
+		final HostnameVerifier hostnameVerifier;
+		if (interactive) {
+			trustManager = mXmppConnectionService.getMemorizingTrustManager();
+			hostnameVerifier = mXmppConnectionService
+					.getMemorizingTrustManager().wrapHostnameVerifier(
+							new StrictHostnameVerifier());
+		} else {
+			trustManager = mXmppConnectionService.getMemorizingTrustManager()
+					.getNonInteractive();
+			hostnameVerifier = mXmppConnectionService
+					.getMemorizingTrustManager()
+					.wrapHostnameVerifierNonInteractive(
+							new StrictHostnameVerifier());
+		}
+		try {
+			final SSLContext sc = SSLContext.getInstance("TLS");
+			sc.init(null, new X509TrustManager[]{trustManager},
+					mXmppConnectionService.getRNG());
+
+			final SSLSocketFactory sf = sc.getSocketFactory();
+			final String[] cipherSuites = CryptoHelper.getOrderedCipherSuites(
+					sf.getSupportedCipherSuites());
+			if (cipherSuites.length > 0) {
+				sc.getDefaultSSLParameters().setCipherSuites(cipherSuites);
+
+			}
+
+			connection.setSSLSocketFactory(sf);
+			connection.setHostnameVerifier(hostnameVerifier);
+		} catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
+		}
+	}
 }

src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java 🔗

@@ -10,6 +10,8 @@ import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 
+import javax.net.ssl.HttpsURLConnection;
+
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.entities.Downloadable;
@@ -133,6 +135,9 @@ public class HttpUploadConnection implements Downloadable {
 			try {
 				Log.d(Config.LOGTAG, "uploading to " + mPutUrl.toString());
 				connection = (HttpURLConnection) mPutUrl.openConnection();
+				if (connection instanceof HttpsURLConnection) {
+					mHttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, true);
+				}
 				connection.setRequestMethod("PUT");
 				connection.setFixedLengthStreamingMode((int) file.getExpectedSize());
 				connection.setDoOutput(true);