Merge pull request #156 from therajanmaurya/HTTP_SSL

Feature: Add SSL certificate and HTTP to HTTPS
diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
index 085aef8..e4c3bcc 100644
--- a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseApiManager.java
@@ -10,8 +10,6 @@
 import com.mifos.apache.fineract.data.services.LoanService;
 import com.mifos.apache.fineract.data.services.RolesService;
 
-import java.util.concurrent.TimeUnit;
-
 import okhttp3.OkHttpClient;
 import okhttp3.logging.HttpLoggingInterceptor;
 import retrofit2.Retrofit;
@@ -61,24 +59,13 @@
 
     private static void createService(Context context) {
 
-        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
-        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
-
-        OkHttpClient okHttpClient = new OkHttpClient.Builder()
-                .addInterceptor(new MifosInterceptor(context))
-                .addInterceptor(new ReceivedCookiesInterceptor(context))
-                .addInterceptor(interceptor)
-                .connectTimeout(60, TimeUnit.SECONDS)
-                .readTimeout(60, TimeUnit.SECONDS)
-                .build();
-
         retrofit = new Retrofit.Builder()
                 .baseUrl(BaseUrl.getDefaultBaseUrl())
                 .addConverterFactory(new NullOnEmptyConverterFactory())
                 .addConverterFactory(ScalarsConverterFactory.create())
                 .addConverterFactory(GsonConverterFactory.create())
                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
-                .client(okHttpClient)
+                .client(new MifosOkHttpClient(context).getMifosOkHttpClient())
                 .build();
         init();
     }
diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
index 459272a..2268b20 100755
--- a/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/BaseUrl.java
@@ -10,7 +10,7 @@
  */
 public class BaseUrl {
 
-    public static final String PROTOCOL_HTTPS = "http://";
+    public static final String PROTOCOL_HTTPS = "https://";
     public static final String API_ENDPOINT = "pilot.kuelap.io";
     public static final String PORT = "80";
     // "/" in the last of the base url always
diff --git a/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java b/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java
new file mode 100644
index 0000000..b985746
--- /dev/null
+++ b/app/src/main/java/com/mifos/apache/fineract/data/remote/MifosOkHttpClient.java
@@ -0,0 +1,108 @@
+package com.mifos.apache.fineract.data.remote;
+
+import android.content.Context;
+
+import java.security.KeyStore;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+import okhttp3.logging.HttpLoggingInterceptor.Level;
+
+public class MifosOkHttpClient {
+
+    private Context context;
+
+    public MifosOkHttpClient(Context context) {
+        this.context = context;
+    }
+
+    public OkHttpClient getMifosOkHttpClient() {
+
+        OkHttpClient.Builder builder = new OkHttpClient.Builder();
+
+        try {
+            // Create a trust manager that does not validate certificate chains
+            TrustManager[] trustAllCerts = {
+                    new X509TrustManager() {
+                        @Override
+                        public void checkClientTrusted(
+                                X509Certificate[] chain,
+                                String authType) throws CertificateException {
+                        }
+
+                        @Override
+                        public void checkServerTrusted(
+                                X509Certificate[] chain,
+                                String authType) throws CertificateException {
+                        }
+
+                        @Override
+                        public X509Certificate[] getAcceptedIssuers() {
+                            return new X509Certificate[0];
+                        }
+                    }
+            };
+
+            // Install the all-trusting trust manager
+            SSLContext sslContext = SSLContext.getInstance("SSL");
+            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
+            // Create an ssl socket factory with our all-trusting manager
+            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+            //Enable Full Body Logging
+            HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
+            logger.setLevel(Level.BODY);
+
+            TrustManagerFactory trustManagerFactory = TrustManagerFactory.
+                    getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            trustManagerFactory.init((KeyStore) null);
+            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
+            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
+                throw new IllegalStateException("Unexpected default trust managers:" + Arrays.
+                        toString(trustManagers));
+            }
+            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
+
+            //Set SSL certificate to OkHttpClient Builder
+
+            builder.sslSocketFactory(sslSocketFactory, trustManager);
+
+            builder.hostnameVerifier(new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession session) {
+                    return true;
+                }
+            });
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        //Enable Full Body Logging
+        HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
+        logger.setLevel(Level.BODY);
+
+        //Setting Timeout 30 Seconds
+        builder.connectTimeout(60, TimeUnit.SECONDS);
+        builder.readTimeout(60, TimeUnit.SECONDS);
+
+        //Interceptor :> Full Body Logger and ApiRequest Header
+        builder.addInterceptor(logger);
+        builder.addInterceptor(new MifosInterceptor(context));
+        builder.addInterceptor(new ReceivedCookiesInterceptor(context));
+
+        return builder.build();
+
+    }
+}
\ No newline at end of file