TracingSyncService.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package de.tudarmstadt.informatik.hostage.sync.tracing;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.OutputStreamWriter;
  7. import java.io.StringWriter;
  8. import java.io.Writer;
  9. import java.net.HttpURLConnection;
  10. import java.net.URL;
  11. import java.security.KeyStore;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.HashSet;
  15. import java.util.Map;
  16. import java.util.Set;
  17. import org.apache.http.HttpResponse;
  18. import org.apache.http.HttpVersion;
  19. import org.apache.http.client.HttpClient;
  20. import org.apache.http.client.methods.HttpPost;
  21. import org.apache.http.conn.ClientConnectionManager;
  22. import org.apache.http.conn.scheme.PlainSocketFactory;
  23. import org.apache.http.conn.scheme.Scheme;
  24. import org.apache.http.conn.scheme.SchemeRegistry;
  25. import org.apache.http.conn.ssl.SSLSocketFactory;
  26. import org.apache.http.entity.StringEntity;
  27. import org.apache.http.impl.client.DefaultHttpClient;
  28. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  29. import org.apache.http.params.BasicHttpParams;
  30. import org.apache.http.params.HttpParams;
  31. import org.apache.http.params.HttpProtocolParams;
  32. import org.apache.http.protocol.HTTP;
  33. import org.json.JSONException;
  34. import org.json.JSONObject;
  35. import android.app.IntentService;
  36. import android.content.Intent;
  37. import android.content.SharedPreferences;
  38. import android.content.SharedPreferences.Editor;
  39. import android.os.Bundle;
  40. import android.os.ResultReceiver;
  41. import android.preference.PreferenceManager;
  42. import android.util.Log;
  43. import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
  44. import de.tudarmstadt.informatik.hostage.logging.Record;
  45. import de.tudarmstadt.informatik.hostage.logging.SyncData;
  46. import de.tudarmstadt.informatik.hostage.logging.SyncInfoRecord;
  47. import de.tudarmstadt.informatik.hostage.logging.SyncRecord;
  48. import de.tudarmstadt.informatik.hostage.net.MySSLSocketFactory;
  49. import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
  50. import de.tudarmstadt.informatik.hostage.sync.Synchronizer;
  51. import de.tudarmstadt.informatik.hostage.sync.android.SyncUtils;
  52. import de.tudarmstadt.informatik.hostage.ui.model.LogFilter;
  53. /**
  54. * Service that synchronizes with a specified remote server.
  55. *
  56. * @author Lars Pandikow
  57. */
  58. public class TracingSyncService extends IntentService {
  59. public static final String REMOTE_DEVICE = "de.tudarmstadt.informatik.hostage.REMOTE_DEVICE";
  60. public static final String ACTION_START_SYNC = "de.tudarmstadt.informatik.hostage.ACTION_START_SYNC";
  61. public static final String EXTRA_RECEIVER = "de.tudarmstadt.informatik.hostage.EXTRA_HANDLER";
  62. public static final String UPLOAD_SIZE = "de.tudarmstadt.informatik.hostage.UPLOAD_SIZE";
  63. public static final String UPLOAD_PROGRESS = "de.tudarmstadt.informatik.hostage.UPLOAD_PROGRESS";
  64. public static final int RECORD_UPLOADED = 0x00;
  65. public static final int SYNC_COMPLETE = 0x01;
  66. public static final int SYNC_ERROR = 0x02;
  67. private HttpClient httpClient;
  68. private ResultReceiver receiver;
  69. HostageDBOpenHelper dbh;
  70. Synchronizer synchronizer;
  71. SharedPreferences pref;
  72. Editor editor;
  73. public TracingSyncService() {
  74. super(TracingSyncService.class.getName());
  75. }
  76. @Override
  77. public void onCreate() {
  78. super.onCreate();
  79. pref = PreferenceManager.getDefaultSharedPreferences(this);
  80. editor = pref.edit();
  81. dbh = new HostageDBOpenHelper(this);
  82. synchronizer = new Synchronizer(dbh);
  83. }
  84. /**
  85. * The IntentService calls this method from the default worker thread with
  86. * the intent that started the service. When this method returns,
  87. * IntentService stops the service, as appropriate.
  88. */
  89. @Override
  90. protected void onHandleIntent(Intent intent) {
  91. if (intent != null) {
  92. final String action = intent.getAction();
  93. if (ACTION_START_SYNC.equals(action)) {
  94. receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
  95. syncNewRecords();
  96. if (receiver != null) {
  97. receiver.send(SYNC_COMPLETE, null);
  98. }
  99. }
  100. }
  101. }
  102. /**
  103. * Uploads all new Records to a server, specified in the settings.
  104. */
  105. private void syncNewRecords() {
  106. long lastSyncTime = pref.getLong("LAST_SYNC_TIME", 0);
  107. // Then upload to tracing
  108. String serverAddress = pref.getString("pref_upload_server", "https://ssi.cased.de"); //"https://192.168.1.118:9999"
  109. LogFilter filter = new LogFilter();
  110. filter.setAboveTimestamp(lastSyncTime);
  111. ArrayList<Record> records = dbh.getRecordsForFilter(filter);
  112. StringWriter writer = new StringWriter();
  113. int size = records.size();
  114. int offset = 1;
  115. int currOffset = 1;
  116. boolean error = false;
  117. for (Record record : records) {
  118. SyncUtils.appendRecordToStringWriter(record, writer);
  119. if(currOffset == 100 || offset == size){
  120. boolean success = SyncUtils.uploadRecordsToServer(writer.toString(), serverAddress);
  121. Log.i("Tracing upload", "Upload of record: " + offset + "/" + size + ((success) ? " successful." : " failed."));
  122. if(!success){
  123. if(receiver != null){
  124. receiver.send(SYNC_ERROR, null);
  125. error = true;
  126. }
  127. break;
  128. }
  129. if (receiver != null) {
  130. Bundle data = new Bundle();
  131. data.putInt(UPLOAD_SIZE, size);
  132. data.putInt(UPLOAD_PROGRESS, offset);
  133. receiver.send(RECORD_UPLOADED, data);
  134. }
  135. writer.getBuffer().setLength(0);
  136. currOffset = 0;
  137. }
  138. offset++;
  139. currOffset++;
  140. }
  141. // First download from tracing
  142. SyncData syncDataFromTracing = SyncUtils.getSyncDataFromTracing(this, synchronizer);
  143. HashSet<String> devices = new HashSet<String>();
  144. for(SyncRecord s: syncDataFromTracing.syncRecords){
  145. devices.add(s.getDevice());
  146. }
  147. synchronizer.updateNewDevices(new ArrayList<String>(devices));
  148. synchronizer.updateFromSyncData(syncDataFromTracing);
  149. if(!error) pref.edit().putLong("LAST_SYNC_TIME", System.currentTimeMillis()).apply();
  150. }
  151. /**
  152. * Gets the data from the server and updates the database.
  153. */
  154. private void getRemoteData(String bssid, long timestamp) {
  155. HttpURLConnection connection;
  156. OutputStreamWriter request = null;
  157. URL url = null;
  158. String response = null;
  159. String parameters = "bssid=" + bssid;
  160. try {
  161. url = new URL("http://87.230.23.240/hostage/pull.php");
  162. connection = (HttpURLConnection) url.openConnection();
  163. connection.setDoOutput(true);
  164. connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
  165. connection.setRequestMethod("POST");
  166. request = new OutputStreamWriter(connection.getOutputStream());
  167. request.write(parameters);
  168. request.flush();
  169. request.close();
  170. String line = "";
  171. InputStreamReader isr = new InputStreamReader(connection.getInputStream());
  172. BufferedReader reader = new BufferedReader(isr);
  173. StringBuilder sb = new StringBuilder();
  174. while ((line = reader.readLine()) != null) {
  175. sb.append(line);
  176. }
  177. response = sb.toString();
  178. JSONObject jsonObj = new JSONObject(response);
  179. NetworkRecord net = new NetworkRecord();
  180. net.setBssid(jsonObj.getString("bssid"));
  181. net.setSsid(jsonObj.getString("ssid"));
  182. net.setLatitude(jsonObj.getDouble("latitude"));
  183. net.setLongitude(jsonObj.getDouble("longitude"));
  184. net.setTimestampLocation(jsonObj.getLong("timestamp"));
  185. SyncInfoRecord sync = new SyncInfoRecord();
  186. sync.setBSSID(jsonObj.getString("bssid"));
  187. sync.setDeviceID("-1");
  188. sync.setNumber_of_attacks(jsonObj.getLong("attacks"));
  189. sync.setNumber_of_portscans(jsonObj.getLong("portscans"));
  190. dbh.updateNetworkInformation(net);
  191. isr.close();
  192. reader.close();
  193. } catch (IOException e) {
  194. Log.i("NetworkTest", "Network Error: " + e);
  195. } catch (JSONException e) {
  196. e.printStackTrace();
  197. }
  198. }
  199. }