diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSSocketFactory.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSSocketFactory.java index ebe7497ca..2930adabd 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSSocketFactory.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSSocketFactory.java @@ -6,6 +6,7 @@ import java.net.InetAddress; import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; + import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLSocket; @@ -19,21 +20,21 @@ import javax.net.ssl.SSLSocketFactory; public class TLSSocketFactory extends SSLSocketFactory { private SSLSocketFactory sSLSocketFactory; - private SSLContext context; + private SSLContext sslContext; public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { - context = SSLContext.getInstance("TLS"); - context.init(null, null, null); - sSLSocketFactory = context.getSocketFactory(); + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, null, null); + sSLSocketFactory = sslContext.getSocketFactory(); } public SSLContext getSSLContext(){ - return this.context; + return this.sslContext; } public SSLEngine getSSLEngine(){ - return this.context.createSSLEngine(); + return this.sslContext.createSSLEngine(); } @Override diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java index a8b18e059..373e25128 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java @@ -25,6 +25,7 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -52,6 +53,8 @@ import com.koushikdutta.async.http.WebSocket; import org.json.JSONException; import org.json.JSONObject; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -63,6 +66,7 @@ import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Status; +import fr.gouv.etalab.mastodon.client.TLSSocketFactory; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; @@ -193,6 +197,16 @@ public class LiveNotificationService extends Service implements NetworkStateRece e.printStackTrace(); } } + if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ) { + try { + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setSSLContext(new TLSSocketFactory().getSSLContext()); + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setConnectAllAddresses(true); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } Future webSocketFuture = AsyncHttpClient.getDefaultInstance().websocket("wss://" + account.getInstance() + "/api/v1/streaming/?stream=user&access_token=" + account.getToken(), "wss", new AsyncHttpClient.WebSocketConnectCallback() { @Override public void onCompleted(Exception ex, WebSocket webSocket) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java index 496fd4452..a2f71372c 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingFederatedTimelineService.java @@ -20,19 +20,28 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; + import com.koushikdutta.async.http.AsyncHttpClient; import com.koushikdutta.async.http.AsyncHttpRequest; import com.koushikdutta.async.http.Headers; import com.koushikdutta.async.http.WebSocket; + import org.json.JSONException; import org.json.JSONObject; + +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + import javax.net.ssl.HttpsURLConnection; + import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Status; +import fr.gouv.etalab.mastodon.client.TLSSocketFactory; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; @@ -98,6 +107,16 @@ public class StreamingFederatedTimelineService extends IntentService { Uri url = Uri.parse("wss://" + accountStream.getInstance() + "/api/v1/streaming/?stream=public&access_token="+ accountStream.getToken()); AsyncHttpRequest.setDefaultHeaders(headers, url); Account finalAccountStream = accountStream; + if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ) { + try { + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setSSLContext(new TLSSocketFactory().getSSLContext()); + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setConnectAllAddresses(true); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } AsyncHttpClient.getDefaultInstance().websocket("wss://" + accountStream.getInstance() + "/api/v1/streaming/?stream=public&access_token="+ accountStream.getToken(),"wss", new AsyncHttpClient.WebSocketConnectCallback() { @Override public void onCompleted(Exception ex, WebSocket webSocket) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java index e9c511a82..c6ab0afde 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/StreamingLocalTimelineService.java @@ -20,19 +20,28 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; + import com.koushikdutta.async.http.AsyncHttpClient; import com.koushikdutta.async.http.AsyncHttpRequest; import com.koushikdutta.async.http.Headers; import com.koushikdutta.async.http.WebSocket; + import org.json.JSONException; import org.json.JSONObject; + +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + import javax.net.ssl.HttpsURLConnection; + import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Status; +import fr.gouv.etalab.mastodon.client.TLSSocketFactory; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; @@ -99,6 +108,16 @@ public class StreamingLocalTimelineService extends IntentService { Uri url = Uri.parse("wss://" + accountStream.getInstance() + "/api/v1/streaming/?stream=public:local&access_token="+ accountStream.getToken()); AsyncHttpRequest.setDefaultHeaders(headers, url); Account finalAccountStream = accountStream; + if( Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ) { + try { + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setSSLContext(new TLSSocketFactory().getSSLContext()); + AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setConnectAllAddresses(true); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } AsyncHttpClient.getDefaultInstance().websocket("wss://" + accountStream.getInstance() + "/api/v1/streaming/?stream=public:local&access_token="+ accountStream.getToken(),"wss", new AsyncHttpClient.WebSocketConnectCallback() { @Override public void onCompleted(Exception ex, WebSocket webSocket) {