Преглед изворни кода

Add support for TLS 1.2 when running Android 4 (#430)

Jeff Hellman пре 7 година
родитељ
комит
6bb7c65161
1 измењених фајлова са 33 додато и 1 уклоњено
  1. 33
    1
      android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java

+ 33
- 1
android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java Прегледај датотеку

7
 import android.content.IntentFilter;
7
 import android.content.IntentFilter;
8
 import android.database.Cursor;
8
 import android.database.Cursor;
9
 import android.net.Uri;
9
 import android.net.Uri;
10
+import android.os.Build;
10
 import android.util.Base64;
11
 import android.util.Base64;
11
 
12
 
12
 import com.RNFetchBlob.Response.RNFetchBlobDefaultResp;
13
 import com.RNFetchBlob.Response.RNFetchBlobDefaultResp;
13
 import com.RNFetchBlob.Response.RNFetchBlobFileResp;
14
 import com.RNFetchBlob.Response.RNFetchBlobFileResp;
15
+import com.facebook.common.logging.FLog;
14
 import com.facebook.react.bridge.Arguments;
16
 import com.facebook.react.bridge.Arguments;
15
 import com.facebook.react.bridge.Callback;
17
 import com.facebook.react.bridge.Callback;
16
 import com.facebook.react.bridge.ReactApplicationContext;
18
 import com.facebook.react.bridge.ReactApplicationContext;
21
 import com.facebook.react.bridge.WritableMap;
23
 import com.facebook.react.bridge.WritableMap;
22
 import com.facebook.react.modules.core.DeviceEventManagerModule;
24
 import com.facebook.react.modules.core.DeviceEventManagerModule;
23
 import com.facebook.react.modules.network.OkHttpClientProvider;
25
 import com.facebook.react.modules.network.OkHttpClientProvider;
26
+import com.facebook.react.modules.network.TLSSocketFactory;
24
 
27
 
25
 import java.io.File;
28
 import java.io.File;
26
 import java.io.FileOutputStream;
29
 import java.io.FileOutputStream;
35
 import java.nio.charset.Charset;
38
 import java.nio.charset.Charset;
36
 import java.nio.charset.CharsetEncoder;
39
 import java.nio.charset.CharsetEncoder;
37
 import java.util.ArrayList;
40
 import java.util.ArrayList;
41
+import java.util.List;
38
 import java.util.HashMap;
42
 import java.util.HashMap;
43
+
39
 import java.util.concurrent.TimeUnit;
44
 import java.util.concurrent.TimeUnit;
40
 
45
 
41
 import okhttp3.Call;
46
 import okhttp3.Call;
42
 import okhttp3.ConnectionPool;
47
 import okhttp3.ConnectionPool;
48
+import okhttp3.ConnectionSpec;
43
 import okhttp3.Headers;
49
 import okhttp3.Headers;
44
 import okhttp3.Interceptor;
50
 import okhttp3.Interceptor;
45
 import okhttp3.MediaType;
51
 import okhttp3.MediaType;
48
 import okhttp3.RequestBody;
54
 import okhttp3.RequestBody;
49
 import okhttp3.Response;
55
 import okhttp3.Response;
50
 import okhttp3.ResponseBody;
56
 import okhttp3.ResponseBody;
57
+import okhttp3.TlsVersion;
58
+
51
 
59
 
52
 public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
60
 public class RNFetchBlobReq extends BroadcastReceiver implements Runnable {
53
 
61
 
366
             clientBuilder.retryOnConnectionFailure(false);
374
             clientBuilder.retryOnConnectionFailure(false);
367
             clientBuilder.followRedirects(options.followRedirect);
375
             clientBuilder.followRedirects(options.followRedirect);
368
             clientBuilder.followSslRedirects(options.followRedirect);
376
             clientBuilder.followSslRedirects(options.followRedirect);
377
+            clientBuilder.retryOnConnectionFailure(true);
369
 
378
 
379
+            OkHttpClient client = enableTls12OnPreLollipop(clientBuilder).build();
370
 
380
 
371
-            OkHttpClient client = clientBuilder.retryOnConnectionFailure(true).build();
372
             Call call =  client.newCall(req);
381
             Call call =  client.newCall(req);
373
             taskTable.put(taskId, call);
382
             taskTable.put(taskId, call);
374
             call.enqueue(new okhttp3.Callback() {
383
             call.enqueue(new okhttp3.Callback() {
683
         }
692
         }
684
     }
693
     }
685
 
694
 
695
+    public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
696
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
697
+            try {
698
+                client.sslSocketFactory(new TLSSocketFactory());
699
+
700
+                ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
701
+                        .tlsVersions(TlsVersion.TLS_1_2)
702
+                        .build();
703
+
704
+                List< ConnectionSpec > specs = new ArrayList < > ();
705
+                specs.add(cs);
706
+                specs.add(ConnectionSpec.COMPATIBLE_TLS);
707
+                specs.add(ConnectionSpec.CLEARTEXT);
708
+
709
+                client.connectionSpecs(specs);
710
+            } catch (Exception exc) {
711
+                FLog.e("OkHttpClientProvider", "Error while enabling TLS 1.2", exc);
712
+            }
713
+        }
714
+
715
+        return client;
716
+    }
717
+
686
 
718
 
687
 }
719
 }