Browse Source

Improved error reporting and general synchronization with Tracing

Alexander Brakowski 9 years ago
parent
commit
755855f0ce

+ 0 - 9
res/xml/settings_preferences.xml

@@ -41,15 +41,6 @@
             android:key="pref_download_server"
             android:defaultValue="http://ssi.cased.de/api"
             android:title="@string/pref_download_server" />
-
-        <MultiSelectListPreference
-            android:dialogTitle="@string/pref_sync_countries_dialog"
-            android:key="pref_sync_countries"
-            android:summary="@string/pref_sync_countries_desc"
-            android:title="@string/pref_sync_countries"
-            android:entries="@array/pref_sync_countries_default"
-            android:entryValues="@array/pref_sync_countries_default"
-            />
 	</PreferenceCategory>
 
 	<PreferenceCategory android:title="@string/advanced_settings">

+ 2 - 2
src/de/tudarmstadt/informatik/hostage/protocol/HTTP.java

@@ -243,11 +243,11 @@ public class HTTP implements Protocol {
 	private class QotdTask extends AsyncTask<String, Void, String> {
 		@Override
 		protected String doInBackground(String... unused) {
-			String[] sources = new String[] { "djxmmx.net", "ota.iambic.com", "alpha.mike-r.com", "electricbiscuit.org" };
+			String[] sources = new String[] { "djxmmx.net", "alpha.mike-r.com"};
 			SecureRandom rndm = new SecureRandom();
 			StringBuffer sb = new StringBuffer();
 			try {
-				Socket client = new Socket(sources[rndm.nextInt(4)], 17);
+				Socket client = new Socket(sources[rndm.nextInt(sources.length)], 17);
 				BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 				while (!in.ready())
 					;

+ 34 - 17
src/de/tudarmstadt/informatik/hostage/sync/android/SyncUtils.java

@@ -8,6 +8,7 @@ import android.content.SharedPreferences;
 import android.location.Location;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import org.apache.http.HttpResponse;
@@ -63,7 +64,9 @@ import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
  * Created by abrakowski
  */
 public class SyncUtils {
+    public static final int SYNC_SUCCESSFUL = 0x0;
     private static final long SYNC_FREQUENCY = 60 * 60;  // 1 hour (in seconds)
+
     public static final String CONTENT_AUTHORITY = "de.tudarmstadt.informatik.hostage";
     private static final String PREF_SETUP_COMPLETE = "sync_setup_complete";
 
@@ -256,8 +259,30 @@ public class SyncUtils {
                 deviceMap.put(m);
             }
 
+            JSONObject condition = new JSONObject();
+
+            /**
+            TODO(alex): UNCOMMENT THIS AGAIN, WHEN WE ARE SURE ABOUT USING LOCATIONS THIS WAY.
+            =======================================================================
+
+            Location location = MyLocationManager.getNewestLocation();
+            if(location != null){
+                JSONArray ll = new JSONArray();
+                ll.put(location.getLongitude());
+                ll.put(location.getLatitude());
+
+                condition.put("location", ll);
+                condition.put("distance", 500);
+            } else {
+                // We could not get the gps coordinates, try to retrieve the country code from the SIM card
+                TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
+                String countryCodeValue = tm.getNetworkCountryIso();
+
+                condition.put("country", countryCodeValue);
+            }*/
+
             JSONObject req = new JSONObject();
-            req.put("condition", "");
+            req.put("condition", condition);
             req.put("info", deviceMap);
 
             StringEntity se = new StringEntity(req.toString());
@@ -272,8 +297,15 @@ public class SyncUtils {
             }
 
             String responseBody = readResponseToString(response);
+            JSONArray syncData;
 
-            JSONArray syncData = new JSONArray(responseBody);
+            // ensure, that the received data is an array
+            try {
+                syncData = new JSONArray(responseBody);
+            } catch (JSONException ex){
+                ex.printStackTrace();
+                return null;
+            }
 
             ArrayList<SyncRecord> syncRecords = new ArrayList<SyncRecord>();
             Map<String, NetworkRecord> networkRecordMap = new HashMap<String, NetworkRecord>();
@@ -452,21 +484,6 @@ public class SyncUtils {
         return downloadFromServer(buildUrlFromBase(baseUri, "start", fromCalendar(calendar)), JSONArray.class);
     }
 
-
-    public static void logNewAttacks(Context context, JSONArray attacks){
-        Map<String, NetworkRecord> networks = new HashMap<String, NetworkRecord>();
-
-        for(int i=0; i<attacks.length(); i++){
-            try {
-                JSONObject obj = attacks.getJSONObject(i);
-
-
-            } catch (JSONException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
     public static HttpClient createHttpClient() {
         try {
             KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

+ 4 - 3
src/de/tudarmstadt/informatik/hostage/sync/bluetooth/BluetoothSyncActivity.java

@@ -23,6 +23,7 @@ import android.widget.AdapterView.OnItemClickListener;
 import de.tudarmstadt.informatik.hostage.R;
 import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
 import de.tudarmstadt.informatik.hostage.sync.Synchronizer;
+import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
 
 /**
  * Activity that allows the user to choose a bluetooth device to 
@@ -279,14 +280,14 @@ public class BluetoothSyncActivity extends Activity{
         			mInfoText.setText("Failed to connect to device!");
                     progressBar.setVisibility(View.GONE);
 
-                    BluetoothSyncActivity.this.setResultIntent(SYNC_SUCCESSFUL, false);
+                    BluetoothSyncActivity.this.setResultIntent(SyncUtils.SYNC_SUCCESSFUL, false);
 
         			break;
         		case SYNC_SUCCESSFUL: 
         			mInfoText.setText("Synchronization successful!");
                     progressBar.setVisibility(View.GONE);
 
-                    BluetoothSyncActivity.this.setResultIntent(SYNC_SUCCESSFUL, true);
+                    BluetoothSyncActivity.this.setResultIntent(SyncUtils.SYNC_SUCCESSFUL, true);
 
                     break;
         		case SYNC_FAILED: 
@@ -294,7 +295,7 @@ public class BluetoothSyncActivity extends Activity{
         			mInfoText.setText("Synchronization failed!");
                     progressBar.setVisibility(View.GONE);
 
-                    BluetoothSyncActivity.this.setResultIntent(SYNC_FAILED, false);
+                    BluetoothSyncActivity.this.setResultIntent(SyncUtils.SYNC_SUCCESSFUL, false);
                     break;
         	}        		
         }

+ 20 - 6
src/de/tudarmstadt/informatik/hostage/sync/tracing/TracingSyncActivity.java

@@ -1,6 +1,8 @@
 package de.tudarmstadt.informatik.hostage.sync.tracing;
 
 import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
+
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
@@ -35,13 +37,25 @@ public class TracingSyncActivity extends Activity implements TracingSyncResultRe
 	public void onReceiveResult(int resultCode, Bundle resultData) {
         switch (resultCode) {
         case TracingSyncService.SYNC_COMPLETE:
-        	mInfoText.setText("Information is up to date!");
-            break;        
+        	mInfoText.setText("Records were synchronized successfully!");
+            setResult(SyncUtils.SYNC_SUCCESSFUL, null);
+            break;
         case TracingSyncService.RECORD_UPLOADED:      
-        	mInfoText.setText("Uploading Records...(" + resultData.getInt(TracingSyncService.UPLOAD_PROGRESS) + "/"+ resultData.getInt(TracingSyncService.UPLOAD_SIZE) + ")");
-        break;
-    }
-		
+        	mInfoText.setText("Uploading Records... (" + resultData.getInt(TracingSyncService.UPLOAD_PROGRESS) + "/"+ resultData.getInt(TracingSyncService.UPLOAD_SIZE) + ")");
+            break;
+        case TracingSyncService.RECORD_DOWNLOAD:
+            mInfoText.setText("Downloading Records...");
+            break;
+        case TracingSyncService.SYNC_DOWNLOAD_ERROR:
+            mInfoText.setText("There was an error while trying to download records to TraCiNG");
+            break;
+        case TracingSyncService.SYNC_UPLOAD_ERROR:
+            mInfoText.setText("There was an error while trying to upload records to TraCiNG");
+            break;
+        case TracingSyncService.SYNC_ERROR:
+            mInfoText.setText("There was an error while trying to synchronize with TraCiNG.");
+            break;
+        }
 	}	
 	
 }

+ 22 - 61
src/de/tudarmstadt/informatik/hostage/sync/tracing/TracingSyncService.java

@@ -70,10 +70,13 @@ public class TracingSyncService extends IntentService {
 	public static final String UPLOAD_PROGRESS = "de.tudarmstadt.informatik.hostage.UPLOAD_PROGRESS";
 
 	public static final int RECORD_UPLOADED = 0x00;
-	public static final int SYNC_COMPLETE = 0x01;
-    public static final int SYNC_ERROR = 0x02;
+    public static final int RECORD_DOWNLOAD = 0x01;
+	public static final int SYNC_COMPLETE = 0x02;
+    public static final int SYNC_ERROR = 0x03;
+    public static final int SYNC_UPLOAD_ERROR = 0x04;
+    public static final int SYNC_DOWNLOAD_ERROR = 0x05;
 
-	private HttpClient httpClient;
+    private HttpClient httpClient;
 	private ResultReceiver receiver;
 
 	HostageDBOpenHelper dbh;
@@ -108,10 +111,6 @@ public class TracingSyncService extends IntentService {
 			if (ACTION_START_SYNC.equals(action)) {
 				receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
 				syncNewRecords();
-
-				if (receiver != null) {
-					receiver.send(SYNC_COMPLETE, null);
-				}
 			}
 
 		}
@@ -147,7 +146,7 @@ public class TracingSyncService extends IntentService {
 
                 if(!success){
                     if(receiver != null){
-                        receiver.send(SYNC_ERROR, null);
+                        receiver.send(SYNC_UPLOAD_ERROR, null);
                         error = true;
                     }
                     break;
@@ -169,8 +168,17 @@ public class TracingSyncService extends IntentService {
         }
 
         // First download from tracing
+        if(receiver != null) receiver.send(RECORD_DOWNLOAD, null);
         SyncData syncDataFromTracing = SyncUtils.getSyncDataFromTracing(this, synchronizer);
 
+        if(syncDataFromTracing == null && error){
+            receiver.send(SYNC_ERROR, null);
+            return;
+        } else if(syncDataFromTracing == null){
+            receiver.send(SYNC_DOWNLOAD_ERROR, null);
+            return;
+        }
+
         HashSet<String> devices = new HashSet<String>();
         for(SyncRecord s: syncDataFromTracing.syncRecords){
             devices.add(s.getDevice());
@@ -179,58 +187,11 @@ public class TracingSyncService extends IntentService {
         synchronizer.updateNewDevices(new ArrayList<String>(devices));
         synchronizer.updateFromSyncData(syncDataFromTracing);
 
-        if(!error) pref.edit().putLong("LAST_SYNC_TIME", System.currentTimeMillis()).apply();
+        if(!error) {
+            pref.edit().putLong("LAST_SYNC_TIME", System.currentTimeMillis()).apply();
+            if (receiver != null) {
+                receiver.send(SYNC_COMPLETE, null);
+            }
+        }
     }
-
-
-	/**
-	 * Gets the data from the server and updates the database.
-	 */
-	private void getRemoteData(String bssid, long timestamp) {
-		HttpURLConnection connection;
-		OutputStreamWriter request = null;
-		URL url = null;
-		String response = null;
-		String parameters = "bssid=" + bssid;
-		try {
-			url = new URL("http://87.230.23.240/hostage/pull.php");
-			connection = (HttpURLConnection) url.openConnection();
-			connection.setDoOutput(true);
-			connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
-			connection.setRequestMethod("POST");
-
-			request = new OutputStreamWriter(connection.getOutputStream());
-			request.write(parameters);
-			request.flush();
-			request.close();
-			String line = "";
-
-			InputStreamReader isr = new InputStreamReader(connection.getInputStream());
-			BufferedReader reader = new BufferedReader(isr);
-			StringBuilder sb = new StringBuilder();
-			while ((line = reader.readLine()) != null) {
-				sb.append(line);
-			}
-			response = sb.toString();
-			JSONObject jsonObj = new JSONObject(response);
-				NetworkRecord net = new NetworkRecord();
-				net.setBssid(jsonObj.getString("bssid"));
-				net.setSsid(jsonObj.getString("ssid"));
-				net.setLatitude(jsonObj.getDouble("latitude"));
-				net.setLongitude(jsonObj.getDouble("longitude"));
-				net.setTimestampLocation(jsonObj.getLong("timestamp"));
-				SyncInfoRecord sync = new SyncInfoRecord();
-				sync.setBSSID(jsonObj.getString("bssid"));
-				sync.setDeviceID("-1");
-				sync.setNumber_of_attacks(jsonObj.getLong("attacks"));
-				sync.setNumber_of_portscans(jsonObj.getLong("portscans"));
-				dbh.updateNetworkInformation(net);
-			isr.close();
-			reader.close();
-		} catch (IOException e) {
-			Log.i("NetworkTest", "Network Error: " + e);
-		} catch (JSONException e) {
-			e.printStackTrace();
-		}
-	}
 }

+ 0 - 43
src/de/tudarmstadt/informatik/hostage/ui/fragment/PreferenceHostageFragment.java

@@ -22,10 +22,6 @@ import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
  * @created 02.03.14 21:03
 */
 public class PreferenceHostageFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
-
-    public static CharSequence[] entries = null;
-    public static CharSequence[] entriesValues = null;
-
 	/**
 	 * Maps an text preference to an suffix string
 	 */
@@ -61,42 +57,7 @@ public class PreferenceHostageFragment extends PreferenceFragment implements Sha
 		for(String k: textPreferences){
 			updatePreferenceSummary(k);
 		}
-
-        if(entries == null || entriesValues == null) {
-            refreshCountryList();
-        }
 	}
-
-    private void refreshCountryList(){
-        final SharedPreferences sharedPreferences = this.getPreferenceManager().getSharedPreferences();
-
-        Preference p = getPreferenceManager().findPreference("pref_sync_countries");
-        final MultiSelectListPreference mp = (MultiSelectListPreference) p;
-
-        AsyncTask<String, Void, List<String[]>> task = new AsyncTask<String, Void, List<String[]>>(){
-            @Override
-            protected List<String[]> doInBackground(String... params) {
-                return SyncUtils.getCountriesFromServer(sharedPreferences.getString("pref_download_server", "http://192.168.1.118:8888"));
-            }
-
-            protected void onPostExecute(List<String[]> lst) {
-                if(lst != null) {
-                    entries = new CharSequence[lst.size()];
-                    entriesValues = new CharSequence[lst.size()];
-
-                    for (int i = 0; i < lst.size(); i++) {
-                        entries[i] = lst.get(i)[1];
-                        entriesValues[i] = lst.get(i)[0];
-                    }
-
-                    mp.setEntries(entries);
-                    mp.setEntryValues(entriesValues);
-                }
-            }
-        };
-
-        task.execute();
-    }
 	/**
 	 * Updates the summary text of the given preference
 	 *
@@ -156,10 +117,6 @@ public class PreferenceHostageFragment extends PreferenceFragment implements Sha
 	 */
 	@Override
 	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
-        if(key.equals("pref_download_server")){
-            refreshCountryList();
-        }
-
 		updatePreferenceSummary(key);
 	}
 }

+ 4 - 3
src/de/tudarmstadt/informatik/hostage/ui/fragment/RecordOverviewFragment.java

@@ -46,6 +46,7 @@ import de.tudarmstadt.informatik.hostage.logging.Record;
 import de.tudarmstadt.informatik.hostage.logging.SyncData;
 import de.tudarmstadt.informatik.hostage.logging.SyncInfo;
 import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
+import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
 import de.tudarmstadt.informatik.hostage.sync.bluetooth.BluetoothSyncActivity;
 import de.tudarmstadt.informatik.hostage.sync.nfc.NFCSyncActivity;
 import de.tudarmstadt.informatik.hostage.sync.tracing.TracingSyncActivity;
@@ -389,10 +390,10 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che
 								break;*/
 
 							case 1:
-								getActivity().startActivity(new Intent(getActivity(), TracingSyncActivity.class));
+                                startActivityForResult(new Intent(getActivity(), TracingSyncActivity.class), 0);
 								break;
                             case 2:
-                                getActivity().startActivity(new Intent(getActivity(), WiFiP2pSyncActivity.class));
+                                startActivityForResult(new Intent(getActivity(), WiFiP2pSyncActivity.class), 0);
                                 break;
 						}
 					}
@@ -430,7 +431,7 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che
         super.onActivityResult(requestCode, resultCode, data);
 
         if(requestCode == 0){
-            if(resultCode == BluetoothSyncActivity.SYNC_SUCCESSFUL){
+            if(resultCode == SyncUtils.SYNC_SUCCESSFUL){
                 actualiseListViewInBackground();
             }
         }