From e3e88d168f97b60c9cdc8a93f08738aa48dcd8c9 Mon Sep 17 00:00:00 2001 From: Adam Domagalski Date: Mon, 3 Dec 2018 16:00:35 +0100 Subject: [PATCH] eliptic curve cipher TLS change for android 7 nougat --- .../wmi/findmytutor/network/ApiClient.java | 105 ++++++++++-------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java index 74ba47f..1076954 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java @@ -7,67 +7,80 @@ import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.uam.wmi.findmytutor.utils.PrefUtils; import java.io.IOException; +import java.util.Collections; import java.util.concurrent.TimeUnit; +import okhttp3.CipherSuite; +import okhttp3.ConnectionSpec; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import okhttp3.TlsVersion; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class ApiClient { - private static Retrofit retrofit = null; - private static int REQUEST_TIMEOUT = 60; - private static OkHttpClient okHttpClient; - private static final String BASE_URL = "https://s416084.projektstudencki.pl/master/"; + private static Retrofit retrofit = null; + private static int REQUEST_TIMEOUT = 60; + private static OkHttpClient okHttpClient; + private static final String BASE_URL = "https://s416084.projektstudencki.pl/master/"; - public static Retrofit getClient(Context context) { + public static Retrofit getClient(Context context) { - if (okHttpClient == null) - initOkHttp(context); + if (okHttpClient == null) + initOkHttp(context); - if (retrofit == null) { - retrofit = new Retrofit.Builder() - .baseUrl(BASE_URL) - .client(okHttpClient) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .build(); + if (retrofit == null) { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build(); + } + return retrofit; + } + + private static void initOkHttp(final Context context) { + + OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder() + .connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS); + + // Android 7.0.0 fix: https://stackoverflow.com/questions/39133437/sslhandshakeexception-handshake-failed-on-android-n-7-0?fbclid=IwAR1FpUjQlE_iP_2hiZ3okHoFs-Ik4AilVcJaKDKs4FHNFIxn7wb-Uxb_WWY + ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) + .tlsVersions(TlsVersion.TLS_1_2) + .cipherSuites(CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA) + .build(); + + httpClient.connectionSpecs(Collections.singletonList(spec)); + + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + + httpClient.addInterceptor(interceptor); + + httpClient.addInterceptor(chain -> { + Request original = chain.request(); + Request.Builder requestBuilder = original.newBuilder() + .addHeader("Accept", "application/json") + .addHeader("Content-Type", "application/json"); + + + // Adding Authorization token (API Key) + // Requests will be denied without API key + if (!TextUtils.isEmpty(PrefUtils.getApiKey(context))) { + requestBuilder.addHeader("Authorization", "Bearer " + PrefUtils.getApiKey(context)); } - return retrofit; - } - private static void initOkHttp(final Context context) { - OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder() - .connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) - .readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) - .writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS); + Request request = requestBuilder.build(); + return chain.proceed(request); + }); - HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); - interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); - - httpClient.addInterceptor(interceptor); - - httpClient.addInterceptor(chain -> { - Request original = chain.request(); - Request.Builder requestBuilder = original.newBuilder() - .addHeader("Accept", "application/json") - .addHeader("Content-Type", "application/json"); - - - // Adding Authorization token (API Key) - // Requests will be denied without API key - if (!TextUtils.isEmpty(PrefUtils.getApiKey(context))) { - requestBuilder.addHeader("Authorization", "Bearer " + PrefUtils.getApiKey(context)); - } - - Request request = requestBuilder.build(); - return chain.proceed(request); - }); - - okHttpClient = httpClient.build(); - } - }; + okHttpClient = httpClient.build(); + } +}; -- 2.20.1