package com.duosecurity.x_ray; import com.duosecurity.x_ray.device.vulnerability.test.adapter.RecyclerAdapter; import fuzion24.device.vulnerability.test.ResultsCallback; import fuzion24.device.vulnerability.test.VulnerabilityTestResult; import fuzion24.device.vulnerability.test.VulnerabilityTestRunner; import fuzion24.device.vulnerability.util.DeviceInfo; import com.duosecurity.x_ray.device.vulnerability.vulnerabilities.VulnerabilityResultSerializer; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class MainActivity extends ActionBarActivity { private static final String SERIALIZABLE_RESULTS = "SERIALIZABLE_RESULTS"; private static final String TAG = "VULN_TEST"; private static final String DEBUG = "DEBUG"; private DeviceInfo devInfo; private ArrayList<VulnerabilityTestResult> testResults; private RecyclerView recyclerView; private RecyclerAdapter recyclerAdapter; private TextView aboutView; private XrayUpdater updater; @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if (requestCode == XrayUpdater.REQUEST_EXTERNAL_STORAGE) { updater.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @Override protected void onCreate(Bundle savedInstanceState) { // run update routine updater = new XrayUpdater(MainActivity.this); updater.startCheckTask(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null && savedInstanceState.containsKey(SERIALIZABLE_RESULTS)) { testResults = (ArrayList<VulnerabilityTestResult>) savedInstanceState.getSerializable(SERIALIZABLE_RESULTS); } else { testResults = new ArrayList<>(); } recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerAdapter = new RecyclerAdapter(MainActivity.this, testResults); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); recyclerView.setAdapter(recyclerAdapter); aboutView = (TextView) findViewById(R.id.about_txt_version); aboutView.setText("Version " + BuildConfig.VERSION_NAME); devInfo = DeviceInfo.getDeviceInfo(); Button fabStart = (Button) findViewById(R.id.fabStart); fabStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Button fabStart = (Button) findViewById(R.id.fabStart); fabStart.setVisibility(View.GONE); runTestSuite(); } }); } private void runTestSuite() { new VulnerabilityTestRunner(MainActivity.this, true, new ResultsCallback() { @Override public void finished(final List<VulnerabilityTestResult> results) { Log.d(TAG, "Device Vulnerability callback, finished"); testResults.clear(); testResults.addAll(results); recyclerAdapter.updateResults(results); new HttpAsyncTask().execute("https://duo-xray-server.appspot.com/Wut"); } }).execute(); } private class HttpAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { return POST(urls[0]); } } public String POST(String url) { InputStream inputStream = null; String result = ""; try { // 1. create HttpClient HttpClient httpclient = new DefaultHttpClient(); // 2. make POST request to the given URL HttpPost httpPost = new HttpPost(url); String json = ""; // 3. build jsonObject JSONObject jsonObject = VulnerabilityResultSerializer.serializeResultsToJson(testResults, devInfo); // 4. convert JSONObject to JSON to String json = jsonObject.toString(4); Log.d(DEBUG, json); // 5. set json to StringEntity StringEntity se = new StringEntity(json); // 6. set httpPost Entity httpPost.setEntity(se); // 7. Set some headers to inform server about the type of the content httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); // 8. Execute POST request to the given URL HttpResponse httpResponse = httpclient.execute(httpPost); // 9. receive response as inputStream inputStream = httpResponse.getEntity().getContent(); // 10. convert inputstream to string if (inputStream != null) result = convertInputStreamToString(inputStream); else result = "Did not work!"; //Log.d(DEBUG, result); } catch (Exception e) { Log.d("InputStream", e.getLocalizedMessage()); } // 11. return result return result; } private static String convertInputStreamToString(InputStream inputStream) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = ""; String result = ""; while ((line = bufferedReader.readLine()) != null) result += line; inputStream.close(); return result; } }