diff --git a/js/ui/cordova/plugins/cordova-plugin-http/src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java b/js/ui/cordova/plugins/cordova-plugin-http/src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java new file mode 100644 index 0000000..7efcae9 --- /dev/null +++ b/js/ui/cordova/plugins/cordova-plugin-http/src/android/com/synconset/CordovaHTTP/CordovaHttpPlugin.java @@ -0,0 +1,174 @@ +/** + * A HTTP plugin for Cordova / Phonegap + */ +package com.synconset; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Iterator; +import java.util.ArrayList; +import java.util.HashMap; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.HostnameVerifier; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.res.AssetManager; +import android.util.Base64; +import android.util.Log; + +import com.github.kevinsawicki.http.HttpRequest; + +public class CordovaHttpPlugin extends CordovaPlugin { + private static final String TAG = "CordovaHTTP"; + + @Override + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); + } + + @Override + public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { + if (action.equals("get")) { + String urlString = args.getString(0); + JSONObject params = args.getJSONObject(1); + JSONObject headers = args.getJSONObject(2); + HashMap paramsMap = this.getMapFromJSONObject(params); + HashMap headersMap = this.getStringMapFromJSONObject(headers); + CordovaHttpGet get = new CordovaHttpGet(urlString, paramsMap, headersMap, callbackContext); + cordova.getThreadPool().execute(get); + } else if (action.equals("head")) { + String urlString = args.getString(0); + JSONObject params = args.getJSONObject(1); + JSONObject headers = args.getJSONObject(2); + HashMap paramsMap = this.getMapFromJSONObject(params); + HashMap headersMap = this.getStringMapFromJSONObject(headers); + CordovaHttpHead head = new CordovaHttpHead(urlString, paramsMap, headersMap, callbackContext); + cordova.getThreadPool().execute(head); + } else if (action.equals("post")) { + String urlString = args.getString(0); + JSONObject params = args.getJSONObject(1); + JSONObject headers = args.getJSONObject(2); + HashMap paramsMap = this.getMapFromJSONObject(params); + HashMap headersMap = this.getStringMapFromJSONObject(headers); + CordovaHttpPost post = new CordovaHttpPost(urlString, paramsMap, headersMap, callbackContext); + cordova.getThreadPool().execute(post); + } else if (action.equals("enableSSLPinning")) { + try { + boolean enable = args.getBoolean(0); + this.enableSSLPinning(enable); + callbackContext.success(); + } catch(Exception e) { + e.printStackTrace(); + callbackContext.error("There was an error setting up ssl pinning"); + } + } else if (action.equals("acceptAllCerts")) { + boolean accept = args.getBoolean(0); + CordovaHttp.acceptAllCerts(accept); + callbackContext.success(); + } else if (action.equals("validateDomainName")) { + boolean accept = args.getBoolean(0); + CordovaHttp.validateDomainName(accept); + callbackContext.success(); + } else if (action.equals("uploadFile")) { + String urlString = args.getString(0); + JSONObject params = args.getJSONObject(1); + JSONObject headers = args.getJSONObject(2); + HashMap paramsMap = this.getMapFromJSONObject(params); + HashMap headersMap = this.getStringMapFromJSONObject(headers); + String filePath = args.getString(3); + String name = args.getString(4); + CordovaHttpUpload upload = new CordovaHttpUpload(urlString, paramsMap, headersMap, callbackContext, filePath, name); + cordova.getThreadPool().execute(upload); + } else if (action.equals("downloadFile")) { + String urlString = args.getString(0); + JSONObject params = args.getJSONObject(1); + JSONObject headers = args.getJSONObject(2); + HashMap paramsMap = this.getMapFromJSONObject(params); + HashMap headersMap = this.getStringMapFromJSONObject(headers); + String filePath = args.getString(3); + CordovaHttpDownload download = new CordovaHttpDownload(urlString, paramsMap, headersMap, callbackContext, filePath); + cordova.getThreadPool().execute(download); + } else { + return false; + } + return true; + } + + private void enableSSLPinning(boolean enable) throws GeneralSecurityException, IOException { + if (enable) { + AssetManager assetManager = cordova.getActivity().getAssets(); + String[] files = assetManager.list(""); + int index; + ArrayList cerFiles = new ArrayList(); + for (int i = 0; i < files.length; i++) { + index = files[i].lastIndexOf('.'); + if (index != -1) { + if (files[i].substring(index).equals(".cer")) { + cerFiles.add(files[i]); + } + } + } + + // scan the www/certificates folder for .cer files as well + files = assetManager.list("www/certificates"); + for (int i = 0; i < files.length; i++) { + index = files[i].lastIndexOf('.'); + if (index != -1) { + if (files[i].substring(index).equals(".cer")) { + cerFiles.add("www/certificates/" + files[i]); + } + } + } + + for (int i = 0; i < cerFiles.size(); i++) { + InputStream in = cordova.getActivity().getAssets().open(cerFiles.get(i)); + InputStream caInput = new BufferedInputStream(in); + HttpRequest.addCert(caInput); + } + CordovaHttp.enableSSLPinning(true); + } else { + CordovaHttp.enableSSLPinning(false); + } + } + + private HashMap getStringMapFromJSONObject(JSONObject object) throws JSONException { + HashMap map = new HashMap(); + Iterator i = object.keys(); + + while (i.hasNext()) { + String key = (String)i.next(); + map.put(key, object.getString(key)); + } + return map; + } + + private HashMap getMapFromJSONObject(JSONObject object) throws JSONException { + HashMap map = new HashMap(); + Iterator i = object.keys(); + + while(i.hasNext()) { + String key = (String)i.next(); + map.put(key, object.get(key)); + } + return map; + } +}